source: jobvista-frontend/src/views/job_advertisements/EditJobAdModal.js@ befb988

main
Last change on this file since befb988 was befb988, checked in by 223021 <daniel.ilievski.2@…>, 2 weeks ago

Added an edit profile page for both job seekers and recruiters, where they can upload profile pictures/company logos and edit their profile data. Added profile page specifically for recruiters. Refactored existing code.

  • Property mode set to 100644
File size: 8.2 KB
Line 
1import React, {useEffect, useState} from "react";
2import "../shared_css/Modal.css";
3
4import 'react-responsive-modal/styles.css';
5import {Modal} from 'react-responsive-modal';
6import Select from "react-select";
7
8//Validation
9import * as yup from "yup";
10import {yupResolver} from "@hookform/resolvers/yup";
11import {Controller, useForm} from "react-hook-form";
12
13
14import {employmentStatusOptions, industryOptions, jobTypeOptions} from "../selectOptions";
15import {useDispatch, useSelector} from "react-redux";
16import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
17import {Editor} from "primereact/editor";
18import {notifyJobAdDelete, notifyJobAdEdit} from "../../utils/toastUtils";
19
20
21export const EditJobAdModal = (jobAd) => {
22 const [modal, setModal] = useState(false);
23 const dispatch = useDispatch();
24 const auth = useSelector(state => state.auth.currentUser)
25 const toggleModal = () => {
26 console.log("NAD SET")
27 setModal(!modal);
28 console.log("POD SET")
29
30 };
31
32 const schema = yup.object().shape({
33 title: yup.string().required("Please enter a title"),
34 description: yup.string().required("Please enter a description"),
35 industry: yup.mixed().required("Select industry"),
36 startingSalary: yup.number().required("Please enter the starting salary"),
37 jobType: yup.mixed().required("Select job type"),
38 employmentStatus: yup.mixed().required("Select employment status"),
39 })
40
41 const {register, handleSubmit, control, formState: {errors}} = useForm({
42 resolver: yupResolver(schema),
43 });
44 const editJobAdvertisement = async (values) => {
45 try {
46 dispatch(JobAdvertisementActions.editJobAdvertisement(
47 {
48 email: auth.email,
49 title: values.title,
50 description: values.description,
51 industry: values.industry.value,
52 startingSalary: values.startingSalary,
53 activeUntil: values.date,
54 jobType: values.jobType.value,
55 employmentStatus: values.employmentStatus.value,
56 }, jobAd.props.id, (success, response) => {
57 if(success) {
58 // console.log("Job Advertisement edited")
59 toggleModal()
60 notifyJobAdEdit()
61 }
62 }
63 ))
64 } catch (err) {
65 console.error(err)
66 }
67 }
68
69 let minimumDate = new Date();
70 minimumDate.setDate(minimumDate.getDate() + 1);
71
72 return (<div className="modal-wrap">
73
74 <i className="fa-solid fa-pen-to-square pen-edit-btn" onClick={() => {
75 // setSelectedRecord(record);
76 toggleModal()
77 }}></i>
78 <Modal open={modal} onClose={toggleModal} center classNames="job-advertisement-modal">
79 <div className="head-modal">
80 <h3>Edit Job Advertisement</h3>
81 <i className="fa-solid fa-x btn-close-modal" onClick={toggleModal}></i>
82 </div>
83
84 <div className="modal-content">
85 <form>
86 <div className="row">
87 <div className="col-md-7">
88 <label className="label">Job title:</label>
89 <input type="text" defaultValue={jobAd.props.title} {...register("title")}/>
90 <p style={{color: "red"}}>{errors.title?.message}</p>
91
92 <label className="label">Job description:</label>
93 {/*<textarea type="text" defaultValue={jobAd.props.description} placeholder="Describe the job position and all the requirements"*/}
94 {/* className="description-textarea" {...register("description")}/>*/}
95
96 <Controller
97 name="description"
98 control={control}
99 defaultValue={jobAd.props.description}
100 render={({ field }) => (
101 <Editor
102 // defaultValue={jobAd.props.description}
103 value={jobAd.props.description}
104 onTextChange={(e) => field.onChange(e.htmlValue)}
105 style={{ height: '300px', fontSize: "16px", fontFamily: "Segoe UI" }}
106 />
107 )}
108 />
109
110 <p style={{color: "red"}}>{errors.description?.message}</p>
111 </div>
112
113 <div className="col-md-5">
114 <label className="label">Hourly rate:</label>
115 <input type="number" defaultValue={jobAd.props.startingSalary} {...register("startingSalary")}/>
116 <p style={{color: "red"}}>{errors.startingSalary?.message}</p>
117
118 <label className="label">Industry:</label>
119 <Controller
120 name="industry"
121 control={control}
122 defaultValue={{
123 label: jobAd.props.industry,
124 value: jobAd.props.industry
125 }}
126 render={({ field }) => (<Select
127 {...field}
128 options={industryOptions}
129 />)}
130 />
131 <p style={{color: "red"}}>{errors.industry?.message}</p>
132
133 <label className="label">Job type:</label>
134 <Controller
135 name="jobType"
136 control={control}
137 defaultValue={{
138 value: jobAd.props.jobType,
139 label: jobAd.props.jobType==="JOB" ? "Job" : "Internship"
140 }}
141 render={({ field }) => (
142 <Select
143 {...field}
144 options={jobTypeOptions}
145 />)}
146 />
147 <p style={{color: "red"}}>{errors.jobType?.message}</p>
148
149 <label className="label">Employment status</label>
150 <Controller
151 name="employmentStatus"
152 control={control}
153 defaultValue={{
154 value: jobAd.props.employmentStatus,
155 label: jobAd.props.employmentStatus==="FULL_TIME" ? "Full time" : "Part time"
156 }}
157 render={({ field }) => (
158 <Select
159 {...field}
160 options={employmentStatusOptions}
161 />)}
162 />
163 <p style={{color: "red"}}>{errors.employmentStatus?.message}</p>
164
165 <label htmlFor="start">Active until:</label>
166 <input type="date" defaultValue={new Date(jobAd.props.activeUntil).toLocaleDateString('en-CA')}
167 min={minimumDate.toLocaleDateString('en-CA')} onChange={(event) => console.log(event.target.value)}
168 {...register("date")}/>
169
170
171 </div>
172 </div>
173
174 <div className="modal-buttons">
175 <div className="cancel-btn" onClick={toggleModal}> Cancel</div>
176 <button className="submit-btn" onClick={handleSubmit(editJobAdvertisement)}> Save changes</button>
177 </div>
178 </form>
179 </div>
180 </Modal>
181 </div>)
182}
Note: See TracBrowser for help on using the repository browser.