Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
import React from "react";
2
import { useState } from "react";
3
import { Button, Modal } from "react-bootstrap";
4
import { useForm } from "react-hook-form";
5
import styled from "styled-components";
6
import {axios} from "../../../../../../utils";
7
import FormErrorFeedback from "../../../../../../shared/form-error-feedback/FormErrorFeedback";
8
import Spinner from "../../../../../../shared/loading-spinner/Spinner";
9
 
10
const StyledSpinnerContainer = styled.div`
11
  position: absolute;
12
  left: 0;
13
  top: 0;
14
  width: 100%;
15
  height: 100%;
16
  background: rgba(255, 255, 255, 0.4);
17
  display: flex;
18
  justify-content: center;
19
  align-items: center;
20
  z-index: 300;
21
`;
22
 
23
const StyledSwitch = styled.label`
24
  position: relative;
25
  display: inline-block;
26
  width: 60px;
27
  height: 34px;
28
  input {
29
    opacity: 0;
30
    width: 0;
31
    height: 0;
32
  }
33
  .slider {
34
    position: absolute;
35
    cursor: pointer;
36
    top: 0;
37
    left: 0;
38
    right: 0;
39
    bottom: 0;
40
    background-color: #ccc;
41
    -webkit-transition: 0.4s;
42
    transition: 0.4s;
43
  }
44
  .slider:before {
45
    position: absolute;
46
    content: "";
47
    height: 26px;
48
    width: 26px;
49
    left: 4px;
50
    bottom: 4px;
51
    background-color: white;
52
    -webkit-transition: 0.4s;
53
    transition: 0.4s;
54
  }
55
  input:checked + .slider {
56
    background-color: #2196f3;
57
  }
58
  input:focus + .slider {
59
    box-shadow: 0 0 1px #2196f3;
60
  }
61
  input:checked + .slider:before {
62
    -webkit-transform: translateX(26px);
63
    -ms-transform: translateX(26px);
64
    transform: translateX(26px);
65
  }
66
  .slider.round {
67
    border-radius: 34px;
68
  }
69
 
70
  .slider.round:before {
71
    border-radius: 50%;
72
  }
73
`;
74
 
75
const Salary = (props) => {
76
  // props destructuring
77
  const { companyId, jobId, addNotification, salary, currencies } = props;
78
 
79
  // react hook form
80
  const {
81
    register,
82
    errors,
83
    handleSubmit,
84
    setValue,
85
    clearErrors,
86
    getValues,
87
    setError,
88
  } = useForm();
89
 
90
  // states
91
  const [isModalOpen, setIsModalOpen] = useState(false);
92
  const [loading, setLoading] = useState(false);
93
  const [settedSalary, setSettedSalary] = useState(salary);
94
 
95
  const handleEdit = async () => {
96
    setLoading(true);
97
    handleModalOpen();
98
    await axios
99
      .get(`/my-company/${companyId}/job/edit/${jobId}/salary`)
100
      .then((response) => {
101
        const resData = response.data;
102
         (resData);
103
        if (resData.success) {
104
          Object.entries(resData.data).map(([key, value]) => {
105
            if (value && value !== "n") setValue(key, value);
106
          });
107
        } else {
108
          const resError = resData.data;
109
          if (resError.constructor.name === "Object") {
110
            Object.entries(resError).map(([key, value]) => {
111
              if (key in getValues()) {
112
                setError(key, {
113
                  type: "manual",
114
                  message: Array.isArray(value) ? value[0] : value,
115
                });
116
              }
117
            });
118
          } else {
119
            addNotification({
120
              style: "danger",
121
              msg: resError,
122
            });
123
          }
124
        }
125
      });
126
    setLoading(false);
127
  };
128
 
129
  const handleModalOpen = (event) => {
130
    event && event.preventDefault();
131
    setIsModalOpen(!isModalOpen);
132
  };
133
 
134
  const onSubmitHandler = async (data) => {
135
    setLoading(true);
136
    const formData = new FormData();
137
     (data);
138
    Object.entries(data).map(([key, value]) => {
139
      if (value) formData.append(key, value);
140
    });
141
    await axios
142
      .post(`/my-company/${companyId}/job/edit/${jobId}/salary`, formData)
143
      .then((response) => {
144
        const resData = response.data;
145
         (resData);
146
        if (resData.success) {
147
          setSettedSalary(resData.data);
148
          handleModalOpen();
149
        } else {
150
          const resError = resData.data;
151
          if (resError.constructor.name === "Object") {
152
            Object.entries(resError).map(([key, value]) => {
153
              if (key in getValues()) {
154
                setError(key, {
155
                  type: "manual",
156
                  message: Array.isArray(value) ? value[0] : value,
157
                });
158
              }
159
            });
160
          } else {
161
            addNotification({
162
              style: "danger",
163
              msg: resError,
164
            });
165
          }
166
        }
167
      });
168
    setLoading(false);
169
  };
170
  return (
171
    <React.Fragment>
172
      <div className="user-profile-ov">
173
        <h3>
174
          Salario
175
          <a
176
            href="#"
177
            title=""
178
            className="btn-salary-edit"
179
            onClick={(e) => {
180
              e.preventDefault();
181
              handleEdit();
182
            }}
183
          >
184
            <i className="fa fa-pencil"></i>
185
          </a>
186
        </h3>
187
        <span id="overview-salary">{settedSalary}</span>
188
      </div>
189
      {/* modal */}
190
      <Modal
191
        show={isModalOpen}
192
        onHide={handleModalOpen}
193
        style={{ overflowY: "scroll" }}
194
      >
195
        <Modal.Header closeButton>
196
          <Modal.Title>Salario</Modal.Title>
197
        </Modal.Header>
198
        <form onSubmit={handleSubmit(onSubmitHandler)}>
199
          <Modal.Body>
200
            <label htmlFor="salary_visible">Visible</label>
201
            <div className="form-group">
202
              <StyledSwitch className="switch">
203
                <input
204
                  type="checkbox"
205
                  name="salary_visible"
206
                  id="salary_visible"
207
                  value="y"
208
                  ref={register}
209
                />
210
                <span className="slider round"></span>
211
              </StyledSwitch>
212
            </div>
213
            <div className="form-group">
214
              <select
215
                name="salary_currency"
216
                id="salary_currency"
217
                ref={register({
218
                  required: "Por favor seleccione una moneda",
219
                })}
220
                defaultValue=""
221
              >
222
                <option value="" hidden>
223
                  Salario
224
                </option>
225
                {Object.entries(currencies).map(([key, value]) => (
226
                  <option value={key} key={key}>
227
                    {value}
228
                  </option>
229
                ))}
230
              </select>
231
              {errors.salary_currency && (
232
                <FormErrorFeedback>
233
                  {errors.salary_currency.message}
234
                </FormErrorFeedback>
235
              )}
236
            </div>
237
            <div className="form-group">
238
              <input
239
                type="text"
240
                name="salary_min"
241
                id="salary_min"
242
                ref={register({
243
                  required: "Por favor ingrese un salario",
244
                  pattern: {
245
                    value: /^[0-9\.]+$/,
246
                    message: 'Por favor ingrese solo números y "." ',
247
                  },
248
                })}
249
                placeholder="Minimo"
250
              />
251
              {errors.salary_min && (
252
                <FormErrorFeedback>
253
                  {errors.salary_min.message}
254
                </FormErrorFeedback>
255
              )}
256
            </div>
257
            <div className="form-group">
258
              <input
259
                type="text"
260
                name="salary_max"
261
                id="salary_max"
262
                ref={register({
263
                  required: "Por favor ingrese un salario",
264
                  pattern: {
265
                    value: /^[0-9\.]+$/,
266
                    message: 'Por favor ingrese solo números y "." ',
267
                  },
268
                })}
269
                placeholder="Máximo"
270
              />
271
              {errors.salary_max && (
272
                <FormErrorFeedback>
273
                  {errors.salary_max.message}
274
                </FormErrorFeedback>
275
              )}
276
            </div>
277
          </Modal.Body>
278
          <Modal.Footer>
279
            <Button type="submit">Enviar</Button>
280
            <Button variant="danger" onClick={handleModalOpen}>
281
              Cancel
282
            </Button>
283
          </Modal.Footer>
284
        </form>
285
        {loading && (
286
          <StyledSpinnerContainer>
287
            <Spinner />
288
          </StyledSpinnerContainer>
289
        )}
290
      </Modal>
291
    </React.Fragment>
292
  );
293
};
294
 
295
export default Salary;