source: jobvista-frontend/src/views/job_advertisements/JobAdvertisements.js@ 19398ad

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

Implemented backend and frontend CRUD operations for job advertisements

  • Property mode set to 100644
File size: 6.0 KB
Line 
1import {AddJobAdModal} from "./AddJobAdModal";
2
3import "./JobAdvertisements.css"
4import {useDispatch, useSelector} from "react-redux";
5import {useEffect, useState} from "react";
6import {JobAdvertisementActions} from "../../redux/actions/jobAdvertisementActions";
7import {formatRelativeTime, sortElementsByDateCreated} from "../../utils/utils";
8import {dataRangeOptions, industryOptions, sortOptions} from "../selectOptions";
9import Select from "react-select";
10import {DeleteJobAdModal} from "./DeleteJobAdModal";
11import {EditJobAdModal} from "./EditJobAdModal";
12import {Link} from "react-router-dom";
13import JobType from "../../enumerations/JobType";
14
15export const JobAdvertisements = () => {
16
17 const dispatch = useDispatch();
18 const [jobAdvertisementsByRecruiter, setJobAdvertisementsByRecruiter] = useState([]);
19 const auth = useSelector(state => (state.auth.currentUser))
20 let jobAdvertisementsByRecruiterState = useSelector(state => (state.jobAd.jobAdvertisementsByRecruiter))
21
22 const [role, setRole] = useState("");
23 const [sortOrder, setSortOrder] = useState("newest");
24 const [selectedDateRange, setSelectedDateRange] = useState("all");
25 const [searchTerm, setSearchTerm] = useState("");
26 const [dispatched, setDispatched] = useState(false)
27
28
29 useEffect(() => {
30 if (auth) {
31 setRole(auth.role);
32 }
33 }, [auth]);
34
35 useEffect(() => {
36 if (!dispatched && jobAdvertisementsByRecruiterState.length === 0) {
37 dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter("deleteThis", (success, response) => {
38 if (success && response.data.length > 0) {
39 setJobAdvertisementsByRecruiter(sortElementsByDateCreated(response.data))
40 }
41 console.log("Fetch job advertisements by recruiter GET")
42 }))
43 setDispatched(true);
44
45 } else {
46 setJobAdvertisementsByRecruiter(jobAdvertisementsByRecruiterState)
47 console.log("Fetch job advertisements by recruiter STATE")
48 }
49 }, [jobAdvertisementsByRecruiterState])
50
51 return (
52 <div className="container">
53 <div className="head-job-advertisements-box">
54 <div className="row">
55 <div className="col-md-3">
56 <div className="search-container head-component">
57 <i className="fa-solid fa-magnifying-glass blue-colored"></i>
58 <input
59 className="search-input"
60 type="text"
61 placeholder="Search job advertisement by title..."
62 //value={searchTerm}
63 //onChange={event => setSearchTerm(event.target.value)}
64 />
65 </div>
66 </div>
67 <div className="col-md-9">
68
69 <AddJobAdModal/>
70 <div className="sort-section item">
71 <Select
72 defaultValue={{value: "newest", label: "Date (Newest First)"}}
73 //value={sortOrder.value}
74 //onChange ={option => setSortOrder(option.value)}
75 options={sortOptions}
76 className="sort-range sort"
77 />
78 </div>
79 <div className="date-range-section item">
80 <Select
81 defaultValue={{value: "all", label: "Lifetime"}}
82 //value={selectedDateRange.value}
83 //onChange={option => setSelectedDateRange(option.value)}
84 options={dataRangeOptions}
85 className="date-range sort"
86 />
87 </div>
88 </div>
89 </div>
90 </div>
91 <div className="row row-cols-1 row-cols-md-4 g-4">
92
93 {jobAdvertisementsByRecruiter &&
94 jobAdvertisementsByRecruiter.map((jobAd, index) => (
95 <div key={index} className="col">
96 <div className="custom-card">
97 <div className="card-head">
98 <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span>
99 <span className="job-type"> {jobAd.jobType===JobType.JOB ? "Job" : "Internship"}</span>
100 {!jobAd.active && <span className="expired">Expired</span>}
101 <div className="card-management-btns">
102 <DeleteJobAdModal props={jobAd}/>
103 <EditJobAdModal props={jobAd}/>
104 </div>
105 </div>
106 <div className="card-body">
107 <h5 className="card-title">{jobAd.title}</h5>
108 <span>{jobAd.industry} • <span style={{color: "black", fontWeight: "bold"}}>{formatRelativeTime(jobAd.postedOn)}</span></span>
109 <div className="card-info">
110 <span><i className="fa-solid fa-building" style={{color: "#000000"}}></i> Company: <span style={{color: "black", fontWeight: "bold"}}>{jobAd.recruiterName}</span></span> <br/>
111 </div>
112
113 <div className="aligned">
114 <Link to={`/my-job-advertisements/view/${jobAd.id}`} className="card-button solo">View applications</Link>
115 </div>
116
117 </div>
118 </div>
119 </div>
120 ))}
121
122 </div>
123 </div>
124 )
125}
Note: See TracBrowser for help on using the repository browser.