source: jobvista-frontend/src/views/dashboard/Dashboard.js@ 28b3398

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

Implemented job application functionality, added job advertisement filtering and replaced text areas with editors

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