Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { useState } from 'react';
  2. import Helmet from 'react-helmet';
  3. import { Inertia } from '@inertiajs/inertia';
  4. import { InertiaLink, usePage } from '@inertiajs/inertia-react';
  5. import Layout from '@/Shared/Layout';
  6. import LoadingButton from '@/Shared/LoadingButton';
  7. import TextInput from '@/Shared/TextInput';
  8. import SelectInput from '@/Shared/SelectInput';
  9.  
  10. export default () => {
  11.   const { users, indicators, errors } = usePage();
  12.   const [sending, setSending] = useState(false);
  13.   const [values, setValues] = useState({
  14.     name: '',
  15.     date_start: '',
  16.     fixed_value: '',
  17.     fixed_period: ''
  18.   });
  19.   const [targets, setTargets] = useState([{
  20.        indicator_id: '',
  21.        function: '',
  22.        condition: '',
  23.        goal_value: '',
  24.        award_value: '',
  25.        award_type: '',
  26.        fine_value: '',
  27.        fine_type: '',
  28.   }]);
  29.  
  30.   function handleChange(e) {
  31.     const key = e.target.name;
  32.     const value = e.target.value;
  33.     setValues(values => ({
  34.       ...values,
  35.       [key]: value
  36.     }));
  37.   }
  38.  
  39.   function handleSubmit(e) {
  40.     e.preventDefault();
  41.     setSending(true);
  42.     Inertia.post(route('schemes.store'), values).then(() => {
  43.       setSending(false);
  44.     });
  45.   }
  46.  
  47.   return (
  48.     <Layout>
  49.       <div>
  50.         <Helmet title="Новая зарплатная схема" />
  51.         <h1 className="mb-8 font-bold text-3xl">
  52.           Зарплатная схема {values.name ? '"' + values.name + '"' : ''}
  53.         </h1>
  54.         <div className="bg-white rounded shadow overflow-hidden">
  55.           <form onSubmit={handleSubmit}>
  56.             <div className="p-6 -mr-6 -mb-8 flex flex-wrap">
  57.               <TextInput
  58.                 className="pr-6 pb-8 w-full lg:w-1/4"
  59.                 label="Название"
  60.                 name="name"
  61.                 errors={errors.name}
  62.                 value={values.name}
  63.                 onChange={handleChange}
  64.               />
  65.               <TextInput
  66.                className="pr-6 pb-8 w-full lg:w-1/4"
  67.                label="Действует с"
  68.                name="date_start"
  69.                type="month"
  70.                errors={errors.date_start}
  71.                value={values.date_start}
  72.                onChange={handleChange}
  73.               />
  74.               <TextInput
  75.                className="pr-6 pb-8 w-full lg:w-1/4"
  76.                label="Фиксированный оклад"
  77.                name="fixed_value"
  78.                errors={errors.fixed_value}
  79.                value={values.fixed_value}
  80.                onChange={handleChange}
  81.               />
  82.               <SelectInput
  83.                className="pr-6 pb-8 w-full lg:w-1/4"
  84.                label="Тип ставки"
  85.                name="fixed_period"
  86.                errors={errors.fixed_period}
  87.                value={values.fixed_period}
  88.                onChange={handleChange}
  89.               >
  90.                <option value="month">В месяц</option>
  91.                <option value="day">В день</option>
  92.                <option value="hour">В час</option>
  93.               </SelectInput>
  94.             </div>
  95.             <div className="p-6 border-t border-gray-200">
  96.                <h1 className="mb-4 font-bold text-xl">
  97.                  Цели
  98.                </h1>
  99.  
  100.  
  101.                {targets.map((target, index) => (
  102.                   <div key={index} className="p-4 bg-gray-100 mb-4">
  103.                     <div className="-mr-6 -mb-8 flex flex-wrap">
  104.                       <SelectInput
  105.                         className="pr-6 pb-8 mb-4 w-full lg:w-2/5"
  106.                         label="Показатель"
  107.                         name="indicator_id"
  108.                         value={target.indicator_id}
  109.                         onChange={event => handleTargetChange(index, event)}
  110.                       >
  111.                          <option value=""></option>
  112.                          {indicators.map(({ id, name }) => (
  113.                            <option key={id} value={id}>
  114.                              {name}
  115.                            </option>
  116.                          ))}
  117.                       </SelectInput>
  118.                       <TextInput
  119.                        className="pr-6 pb-8 mb-4 w-full lg:w-1/5"
  120.                        label="Функция"
  121.                        name="function"
  122.                        value={target.date_start}
  123.                        onChange={event => handleTargetChange(index, event)}
  124.                       />
  125.                       <SelectInput
  126.                        className="pr-6 pb-8 mb-4 w-full lg:w-1/5"
  127.                        label="Условие"
  128.                        name="condition"
  129.                        value={target.fixed_period}
  130.                        onChange={event => handleTargetChange(index, event)}
  131.                       >
  132.                        <option value="<">Меньше</option>
  133.                        <option value="<=">Меньше или равно</option>
  134.                        <option value="=">Равно</option>
  135.                        <option value=">=">Больше или равно</option>
  136.                        <option value=">">Больше</option>
  137.                        <option value="<>">Не равно</option>
  138.                       </SelectInput>
  139.                       <TextInput
  140.                        className="pr-6 pb-8 mb-4 w-full lg:w-1/5"
  141.                        label="Цель"
  142.                        name="goal_value"
  143.                        value={target.goal_value}
  144.                        onChange={event => handleTargetChange(index, event)}
  145.                       />
  146.  
  147.                     </div>
  148.  
  149.                     <div className="-mr-6 -mb-8 flex flex-wrap">
  150.                        <div className="pr-6 pb-8 mb-4 w-full lg:w-1/2">
  151.                           <div className="bg-gray-100 p-4">
  152.                              <h1 className="mb-4 font-bold text-lg">
  153.                                Вознаграждение за выполнение цели
  154.                              </h1>
  155.                              <div className="-mr-6 -mb-8 flex flex-wrap">
  156.                                <TextInput
  157.                                  className="pr-6 pb-8 mb-4 w-full lg:w-1/2"
  158.                                  label="Значение"
  159.                                  name="award_value"
  160.                                  value={target.award_value}
  161.                                  onChange={event => handleTargetChange(index, event)}
  162.                                />
  163.                                <SelectInput
  164.                                 className="pr-6 pb-8 mb-4 w-full lg:w-1/2"
  165.                                 label="Тип"
  166.                                 name="award_type"
  167.                                 value={target.award_type}
  168.                                 onChange={event => handleTargetChange(index, event)}
  169.                                >
  170.                                 <option value="fixed">Фиксировано</option>
  171.                                 <option value="percent">Процент</option>
  172.                                 <option value="unit">За единицу</option>
  173.                                </SelectInput>
  174.                              </div>
  175.                           </div>
  176.                        </div>
  177.                        <div className="pr-6 pb-8 mb-4 w-full lg:w-1/2">
  178.                           <div className="bg-gray-100 p-4">
  179.                              <h1 className="mb-4 font-bold text-lg">
  180.                                Штраф за не выполнение цели
  181.                              </h1>
  182.                              <div className="-mr-6 -mb-8 flex flex-wrap">
  183.                                 <TextInput
  184.                                   className="pr-6 pb-8 mb-4 w-full lg:w-1/2"
  185.                                   label="Значение"
  186.                                   name="fine_value"
  187.                                   value={target.fine_value}
  188.                                   onChange={event => handleTargetChange(index, event)}
  189.                                 />
  190.                                 <SelectInput
  191.                                  className="pr-6 pb-8 mb-4 w-full lg:w-1/2"
  192.                                  label="Тип"
  193.                                  name="fine_type"
  194.                                  value={target.fine_type}
  195.                                  onChange={event => handleTargetChange(index, event)}
  196.                                 >
  197.                                  <option value="fixed">Фиксировано</option>
  198.                                  <option value="percent">Процент</option>
  199.                                  <option value="unit">За единицу</option>
  200.                                 </SelectInput>
  201.                              </div>
  202.                           </div>
  203.                        </div>
  204.                     </div>
  205.                  </div>
  206.                ))}
  207.  
  208.                <button
  209.                   className="btn-indigo"
  210.                   type="button"
  211.                >
  212.                   Добавить цель
  213.                </button>
  214.             </div>
  215.             <div className="p-6 border-t border-gray-200">
  216.                <h1 className="mb-4 font-bold text-xl">
  217.                  Применимо для сотрудников
  218.                </h1>
  219.             </div>
  220.             <div className="px-6 py-4 bg-gray-100 border-t border-gray-200 flex justify-end items-center">
  221.               <LoadingButton
  222.                 loading={sending}
  223.                 type="submit"
  224.                 className="btn-indigo"
  225.               >
  226.                 Сохранить
  227.               </LoadingButton>
  228.             </div>
  229.           </form>
  230.         </div>
  231.       </div>
  232.     </Layout>
  233.   );
  234. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement