23
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										23
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -9951,6 +9951,16 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", |       "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", | ||||||
|       "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" |       "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" | ||||||
|     }, |     }, | ||||||
|  |     "lodash.reduce": { | ||||||
|  |       "version": "4.6.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", | ||||||
|  |       "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" | ||||||
|  |     }, | ||||||
|  |     "lodash.startswith": { | ||||||
|  |       "version": "4.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", | ||||||
|  |       "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=" | ||||||
|  |     }, | ||||||
|     "lodash.template": { |     "lodash.template": { | ||||||
|       "version": "4.5.0", |       "version": "4.5.0", | ||||||
|       "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", |       "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", | ||||||
| @@ -12768,6 +12778,19 @@ | |||||||
|         "warning": "^4.0.3" |         "warning": "^4.0.3" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "react-phone-input-2": { | ||||||
|  |       "version": "2.14.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-phone-input-2/-/react-phone-input-2-2.14.0.tgz", | ||||||
|  |       "integrity": "sha512-gOY3jUpwO7ulryXPEdqzH7L6DPqI9RQxKfBxZbgqAwXyALGsmwLWFyi2RQwXlBLWN/EPPT4Nv6I9TESVY2YBcg==", | ||||||
|  |       "requires": { | ||||||
|  |         "classnames": "^2.2.6", | ||||||
|  |         "lodash.debounce": "^4.0.8", | ||||||
|  |         "lodash.memoize": "^4.1.2", | ||||||
|  |         "lodash.reduce": "^4.6.0", | ||||||
|  |         "lodash.startswith": "^4.2.1", | ||||||
|  |         "prop-types": "^15.7.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "react-redux": { |     "react-redux": { | ||||||
|       "version": "7.2.4", |       "version": "7.2.4", | ||||||
|       "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", |       "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
|     "react-bootstrap": "^1.6.0", |     "react-bootstrap": "^1.6.0", | ||||||
|     "react-dom": "^17.0.2", |     "react-dom": "^17.0.2", | ||||||
|     "react-loader-spinner": "^4.0.0", |     "react-loader-spinner": "^4.0.0", | ||||||
|  |     "react-phone-input-2": "^2.14.0", | ||||||
|     "react-redux": "^7.2.4", |     "react-redux": "^7.2.4", | ||||||
|     "react-router-dom": "^5.2.0", |     "react-router-dom": "^5.2.0", | ||||||
|     "react-scripts": "4.0.3", |     "react-scripts": "4.0.3", | ||||||
|   | |||||||
| @@ -24,9 +24,9 @@ const App = () => { | |||||||
|             <AuthPageForPartners /> |             <AuthPageForPartners /> | ||||||
|           </Route> |           </Route> | ||||||
|           <ProtectedRoute path='/' exact component={HomePage} /> |           <ProtectedRoute path='/' exact component={HomePage} /> | ||||||
|           <ProtectedRoute path='/candidate/:id' component={CandidatePage} /> |           <ProtectedRoute exact path='/candidate/:id' component={CandidatePage} /> | ||||||
|           <ProtectedRoute path='/calendar' component={CalendarPage} /> |           <ProtectedRoute path='/calendar' component={CalendarPage} /> | ||||||
|           <ProtectedRoute path='/form' component={FormPage} /> |           <ProtectedRoute exact path='/candidate/:id/form' component={FormPage} /> | ||||||
|           <ProtectedRoute path='/report' component={ReportPage} /> |           <ProtectedRoute path='/report' component={ReportPage} /> | ||||||
|           <ProtectedRoute component={()=><div>Page not found</div>} /> |           <ProtectedRoute component={()=><div>Page not found</div>} /> | ||||||
|         </Switch> |         </Switch> | ||||||
|   | |||||||
| @@ -164,6 +164,9 @@ const AuthForDevelopers = () => { | |||||||
|                   <span> |                   <span> | ||||||
|                     Подберем и документально оформим IT-специалистов, после чего передадим исполнителей под ваше руководство.  |                     Подберем и документально оформим IT-специалистов, после чего передадим исполнителей под ваше руководство.  | ||||||
|                     Вы получаете полное управление над сотрудниками, имея возможность контролировать и заменять IT штат.{' '} |                     Вы получаете полное управление над сотрудниками, имея возможность контролировать и заменять IT штат.{' '} | ||||||
|  |                     <br></br> | ||||||
|  |                     <br></br> | ||||||
|  |                     2021 © Outstaffing | ||||||
|                   </span> |                   </span> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|   | |||||||
| @@ -155,6 +155,9 @@ const AuthForPartners = () => { | |||||||
|                   <span> |                   <span> | ||||||
|                     Подберем и документально оформим IT-специалистов, после чего передадим исполнителей под ваше руководство.  |                     Подберем и документально оформим IT-специалистов, после чего передадим исполнителей под ваше руководство.  | ||||||
|                     Вы получаете полное управление над сотрудниками, имея возможность контролировать и заменять IT штат.{' '} |                     Вы получаете полное управление над сотрудниками, имея возможность контролировать и заменять IT штат.{' '} | ||||||
|  |                     <br></br> | ||||||
|  |                     <br></br> | ||||||
|  |                     2021 © Outstaffing | ||||||
|                   </span> |                   </span> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|   | |||||||
| @@ -115,7 +115,7 @@ const Candidate = () => { | |||||||
|                     {currentCandidateObj.vc_text ? currentCandidateObj.vc_text : 'Описание отсутствует...' } |                     {currentCandidateObj.vc_text ? currentCandidateObj.vc_text : 'Описание отсутствует...' } | ||||||
|                   </p> |                   </p> | ||||||
|                 )} |                 )} | ||||||
|                 <Link to={'/form'}> |                 <Link to={`/candidate/${currentCandidateObj.id}/form`}> | ||||||
|                   <button type="submit" className={style.candidate__btn}> |                   <button type="submit" className={style.candidate__btn}> | ||||||
|                     Выбрать к собеседованию |                     Выбрать к собеседованию | ||||||
|                   </button> |                   </button> | ||||||
|   | |||||||
| @@ -2,9 +2,19 @@ import React, { useState } from 'react'; | |||||||
| import style from './Form.module.css'; | import style from './Form.module.css'; | ||||||
| import { fetchForm } from '../../server/server'; | import { fetchForm } from '../../server/server'; | ||||||
| import arrow from '../../images/right-arrow.png'; | import arrow from '../../images/right-arrow.png'; | ||||||
| import { useHistory } from 'react-router-dom'; | import { useHistory, useParams, Redirect } from 'react-router-dom'; | ||||||
|  | import PhoneInput from 'react-phone-input-2' | ||||||
|  | import 'react-phone-input-2/lib/style.css' | ||||||
|  | import './form.css'; | ||||||
|  |  | ||||||
|  | import { withSwalInstance } from 'sweetalert2-react'; | ||||||
|  | import swal from 'sweetalert2'; | ||||||
|  |   | ||||||
|  | const SweetAlert = withSwalInstance(swal); | ||||||
|  |  | ||||||
| const Form = () => { | const Form = () => { | ||||||
|  |   const urlParams = useParams(); | ||||||
|  |   const [status, setStatus] = useState(null); | ||||||
|   const [data, setData] = useState({ |   const [data, setData] = useState({ | ||||||
|     email: '', |     email: '', | ||||||
|     phone: '', |     phone: '', | ||||||
| @@ -26,19 +36,32 @@ const Form = () => { | |||||||
|     e.preventDefault(); |     e.preventDefault(); | ||||||
|  |  | ||||||
|     const formData = new FormData(); |     const formData = new FormData(); | ||||||
|  |     formData.append('profile_id', urlParams.id); | ||||||
|     formData.append('email', data.email); |     formData.append('email', data.email); | ||||||
|     formData.append('phone', data.phone); |     formData.append('phone', data.phone); | ||||||
|     formData.append('comment', data.comment); |     formData.append('comment', data.comment); | ||||||
|  |  | ||||||
|     fetchForm(`${process.env.REACT_APP_API_URL}/api/profile/add-to-interview`, formData); |     fetchForm(`${process.env.REACT_APP_API_URL}/api/profile/add-to-interview`, { | ||||||
|  |       profile_id: urlParams.id, | ||||||
|  |       ...data, | ||||||
|  |     }).then( (res)=>  res.json() | ||||||
|  |       .then( resJSON => setStatus(resJSON)) | ||||||
|  |     ) | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   const goBack = () => { |   const goBack = () => { | ||||||
|     history.goBack(); |     history.goBack(); | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|  |   console.log('s',status) | ||||||
|  |  | ||||||
|   return ( |   return ( | ||||||
|     <div className="container"> |     <div className="container"> | ||||||
|  |       {status && <SweetAlert | ||||||
|  |         show={!!status} | ||||||
|  |         text={status.errors ? status.errors[Object.keys(status.errors)[0]] : 'Форма отправлена'} | ||||||
|  |         onConfirm={status.errors ? () => {setStatus(null);} : () => {setStatus(null); history.push(`/candidate/${urlParams.id}`)}} | ||||||
|  |       />} | ||||||
|       <div className="row"> |       <div className="row"> | ||||||
|         <div className="col-sm-12"> |         <div className="col-sm-12"> | ||||||
|           <div className={style.form__arrow} onClick={() => goBack()}> |           <div className={style.form__arrow} onClick={() => goBack()}> | ||||||
| @@ -61,14 +84,21 @@ const Form = () => { | |||||||
|             /> |             /> | ||||||
|  |  | ||||||
|             <label htmlFor="phone">Номер телефона:</label> |             <label htmlFor="phone">Номер телефона:</label> | ||||||
|             <input |             <PhoneInput | ||||||
|  |               id="phone" | ||||||
|  |               name="Phone" | ||||||
|  |               country={'ru'} | ||||||
|  |               value={data.phone} | ||||||
|  |               onChange={e=>handleChange({target: {value:e, id: 'phone' }})} | ||||||
|  |             /> | ||||||
|  |             {/* <input | ||||||
|               onChange={handleChange} |               onChange={handleChange} | ||||||
|               id="phone" |               id="phone" | ||||||
|               type="number" |               type="text" | ||||||
|               name="Phone" |               name="Phone" | ||||||
|               placeholder="Телефон" |               placeholder="Телефон" | ||||||
|               value={data.phone} |               value={data.phone} | ||||||
|             /> |             /> */} | ||||||
|  |  | ||||||
|             <textarea |             <textarea | ||||||
|               onChange={handleChange} |               onChange={handleChange} | ||||||
|   | |||||||
| @@ -59,6 +59,10 @@ | |||||||
|   outline: none; |   outline: none; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | textarea { | ||||||
|  |   resize: none; | ||||||
|  | } | ||||||
|  |  | ||||||
| .form__btn { | .form__btn { | ||||||
|   width: 288px; |   width: 288px; | ||||||
|   height: 75px; |   height: 75px; | ||||||
| @@ -116,3 +120,4 @@ | |||||||
|     margin-right: 0px; |     margin-right: 0px; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								src/components/Form/form.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/components/Form/form.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | .react-tel-input { | ||||||
|  |     width: min-content !important; | ||||||
|  |     margin-bottom: 60px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .react-tel-input .form-control { | ||||||
|  |     padding: 30px 30px 30px 48px; | ||||||
|  |     border-radius: 37px; | ||||||
|  |     width: 332px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .react-tel-input .flag-dropdown { | ||||||
|  |     border-top-left-radius: 37px; | ||||||
|  |     border-bottom-left-radius: 37px; | ||||||
|  | } | ||||||
| @@ -24,7 +24,7 @@ const Sidebar = ({ candidate }) => { | |||||||
|           <p className={style.candidateSidebar__info__e}>Опыт работы</p> |           <p className={style.candidateSidebar__info__e}>Опыт работы</p> | ||||||
|           <p className={style.candidateSidebar__info__y}>{getYearsString(candidate.years_of_exp)}</p> |           <p className={style.candidateSidebar__info__y}>{getYearsString(candidate.years_of_exp)}</p> | ||||||
|         </> } |         </> } | ||||||
|         <Link to={`/form`}> |                 <Link to={`/candidate/${candidate.id}/form`}> | ||||||
|           <button className={style.candidateSidebar__info__btn}>Выбрать к собеседованию</button> |           <button className={style.candidateSidebar__info__btn}>Выбрать к собеседованию</button> | ||||||
|         </Link> |         </Link> | ||||||
|       </div> |       </div> | ||||||
|   | |||||||
| @@ -55,9 +55,9 @@ export const fetchForm = async (link, info) => { | |||||||
|         // 'Access-Control-Request-Headers': 'authorization', |         // 'Access-Control-Request-Headers': 'authorization', | ||||||
|         'Authorization': `Bearer ${localStorage.getItem('auth_token')}`, |         'Authorization': `Bearer ${localStorage.getItem('auth_token')}`, | ||||||
|         // 'Origin': `${process.env.REACT_APP_BASE_URL}`, |         // 'Origin': `${process.env.REACT_APP_BASE_URL}`, | ||||||
|         'Content-Type': 'multipart/form-data' |           'Content-Type': 'application/json', | ||||||
|       }, |       }, | ||||||
|       body: info |       body: JSON.stringify(info) | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|     return response |     return response | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 GitHub
						GitHub