source: jobvista-frontend/src/views/job_advertisements/JobManagementHub.js@ 08f82ec

main
Last change on this file since 08f82ec was 08f82ec, checked in by 223021 <daniel.ilievski.2@…>, 11 days ago

Did more refactoring

  • Property mode set to 100644
File size: 7.3 KB
Line 
1import {AddJobAdModal} from "./AddJobAdModal";
2
3import "./JobAdvertisements.css"
4import "../shared_css/Random.css"
5
6import {useDispatch, useSelector} from "react-redux";
7import {useEffect, useState} from "react";
8import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
9import {formatRelativeTime, sortElementsBy} from "../../utils/utils";
10import {dataRangeOptions, industryOptions, industryOptionsFilter, sortOptions} from "../selectOptions";
11import Select from "react-select";
12import {DeleteJobAdModal} from "./DeleteJobAdModal";
13import {EditJobAdModal} from "./EditJobAdModal";
14import {Link} from "react-router-dom";
15import JobType from "../../enumerations/JobType";
16import {RecruiterActions} from "../../redux/actions/recruiterActions";
17
18
19export const Workspace = (props) => {
20
21 const dispatch = useDispatch();
22 const [dispatched, setDispatched] = useState(false)
23
24 const auth = useSelector(state => (state.auth.currentUser))
25
26 const [jobAdvertisementsByRecruiter, setJobAdvertisementsByRecruiter] = useState([]);
27 let jobAdvertisementsByRecruiterState = useSelector(state => (state.jobAd.jobAdvertisementsByRecruiter))
28
29 const [recruiterDetails, setRecruiterDetails] = useState(null);
30
31 const [selectedSortOrder, setSelectedSortOrder] = useState("date_newest");
32 const [selectedIndustry, setSelectedIndustry] = useState("all");
33 const [searchTerm, setSearchTerm] = useState("");
34
35 const [activeJobListingsCount, setActiveJobListingsCount] = useState(0);
36
37 useEffect(() => {
38 if (auth) {
39 dispatch(RecruiterActions.fetchRecruiterEditDetailsById(auth.id, (success, response) => {
40 if (success) {
41 setRecruiterDetails(response.data)
42 }
43 }))
44 }
45 }, [auth]);
46
47
48 useEffect(() => {
49 if (!dispatched && jobAdvertisementsByRecruiterState.length === 0) {
50 dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter(auth.id, (success, response) => {
51 if (success && response.data.length > 0) {
52 setJobAdvertisementsByRecruiter(sortElementsBy(response.data))
53 }
54 console.log("Fetch job advertisements by recruiter GET")
55 }))
56 setDispatched(true);
57
58 } else {
59 setJobAdvertisementsByRecruiter(jobAdvertisementsByRecruiterState)
60 console.log("Fetch job advertisements by recruiter STATE")
61
62 setActiveJobListingsCount(countActiveJobListings(jobAdvertisementsByRecruiterState));
63 }
64
65 }, [jobAdvertisementsByRecruiterState])
66
67 let filterJobAdvertisements = () => {
68 JobAdvertisementActions.filterJobAdvertisementsByRecruiter(auth.id, {
69 searchTerm: searchTerm, industry: selectedIndustry, sortOrder: selectedSortOrder
70 }, (success, response) => {
71 if (success) {
72 setJobAdvertisementsByRecruiter(response.data);
73 }
74 })
75 }
76
77 function countActiveJobListings(jobAds) {
78 if (jobAds.length > 0) {
79 const activeJobListings = jobAds.filter(job => job.active)
80 return activeJobListings.length;
81 }
82 return 0;
83 }
84
85 return (<div className="container">
86
87 {/*<div className="line-separator"></div>*/}
88
89 <div className="filter-container">
90 <div className="row">
91 <div className="col-md-12 filter-box">
92 <div className="search-container">
93 <i className="fa-solid fa-magnifying-glass search-icon"></i>
94 <input
95 className="search-input"
96 type="text"
97 placeholder="Search job advertisement by title..."
98 value={searchTerm}
99 onChange={event => setSearchTerm(event.target.value)}
100 />
101 </div>
102 <div className="sort-section item">
103 <Select
104 defaultValue={{value: "all", label: "All industries"}}
105 value={selectedIndustry.value}
106 onChange={option => setSelectedIndustry(option.value)}
107 options={industryOptionsFilter}
108 className="sort-range sort"
109 />
110 </div>
111 <div className="sort-section item">
112 <Select
113 defaultValue={{value: "newest", label: "Date (Newest First)"}}
114 value={selectedSortOrder.value}
115 onChange={option => setSelectedSortOrder(option.value)}
116 options={sortOptions}
117 className="sort-range sort"
118 />
119 </div>
120 <button onClick={filterJobAdvertisements} className="blue-submit-button">Find jobs</button>
121 </div>
122 </div>
123 </div>
124 <div className="row row-cols-1 row-cols-md-5 g-3">
125 <AddJobAdModal/>
126
127 {jobAdvertisementsByRecruiter && jobAdvertisementsByRecruiter.map((jobAd, index) => (
128 <div key={index} className="col">
129 <div className="custom-card hub-card">
130 <div className="card-head">
131 <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
132 <span
133 className="job-type"> {jobAd.jobType === JobType.JOB ? "Job" : "Internship"}</span>
134 {!jobAd.active && <span className="expired">Expired</span>}
135 <div className="card-management-btns">
136 <DeleteJobAdModal props={jobAd}/>
137 <EditJobAdModal props={jobAd}/>
138 </div>
139 </div>
140 <div className="card-body">
141 <h5 className="card-title">{jobAd.title}</h5>
142 <span>{jobAd.industry} • <span style={{
143 color: "black", fontWeight: "bold"
144 }}>{formatRelativeTime(jobAd.postedOn)}</span></span>
145 <div className="card-info">
146 <span><i className="fa-solid fa-building"
147 style={{color: "#000000"}}></i> Company: <span style={{
148 color: "black", fontWeight: "bold"
149 }}>{jobAd.recruiterName}</span></span> <br/>
150 </div>
151
152 </div>
153
154
155 <div className="card-foot">
156 <Link to={`/job-management-hub/applications/${jobAd.id}`}
157 className="card-button">View applications</Link>
158 </div>
159 </div>
160 </div>))}
161 </div>
162 </div>
163
164
165 )
166}
Note: See TracBrowser for help on using the repository browser.