- Timestamp:
- 06/17/24 21:59:14 (2 weeks ago)
- Branches:
- main
- Children:
- 08f82ec
- Parents:
- b248810
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
jobvista-frontend/src/views/job_advertisements/RecruiterWorkspace.js
rb248810 rbefb988 2 2 3 3 import "./JobAdvertisements.css" 4 import "../shared_css/Random.css" 5 4 6 import {useDispatch, useSelector} from "react-redux"; 5 7 import {useEffect, useState} from "react"; … … 12 14 import {Link} from "react-router-dom"; 13 15 import JobType from "../../enumerations/JobType"; 16 import {RecruiterActions} from "../../redux/actions/recruiterActions"; 14 17 15 export const JobAdvertisements = (props) => { 18 19 export const Workspace = (props) => { 16 20 17 21 const dispatch = useDispatch(); 22 const [dispatched, setDispatched] = useState(false) 23 24 const auth = useSelector(state => (state.auth.currentUser)) 25 18 26 const [jobAdvertisementsByRecruiter, setJobAdvertisementsByRecruiter] = useState([]); 19 const auth = useSelector(state => (state.auth.currentUser))20 27 let jobAdvertisementsByRecruiterState = useSelector(state => (state.jobAd.jobAdvertisementsByRecruiter)) 21 28 22 const [role, setRole] = useState(""); 29 const [recruiterDetails, setRecruiterDetails] = useState(null); 30 23 31 const [selectedSortOrder, setSelectedSortOrder] = useState("date_newest"); 24 32 const [selectedIndustry, setSelectedIndustry] = useState("all"); 25 33 const [searchTerm, setSearchTerm] = useState(""); 26 const [dispatched, setDispatched] = useState(false) 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]); 27 46 28 47 29 48 useEffect(() => { 30 if (auth) {31 setRole(auth.role);32 }33 }, [auth]);34 35 useEffect(() => {36 49 if (!dispatched && jobAdvertisementsByRecruiterState.length === 0) { 37 dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter( (success, response) => {50 dispatch(JobAdvertisementActions.fetchJobAdvertisementsByRecruiter(auth.id, (success, response) => { 38 51 if (success && response.data.length > 0) { 39 52 setJobAdvertisementsByRecruiter(sortElementsBy(response.data)) … … 46 59 setJobAdvertisementsByRecruiter(jobAdvertisementsByRecruiterState) 47 60 console.log("Fetch job advertisements by recruiter STATE") 61 62 setActiveJobListingsCount(countActiveJobListings(jobAdvertisementsByRecruiterState)); 48 63 } 64 49 65 }, [jobAdvertisementsByRecruiterState]) 50 66 51 67 let filterJobAdvertisements = () => { 52 JobAdvertisementActions.filterJobAdvertisementsByRecruiter( 53 { 54 searchTerm: searchTerm, 55 industry: selectedIndustry, 56 sortOrder: selectedSortOrder 57 }, (success, response) => { 58 if (success) { 59 setJobAdvertisementsByRecruiter(response.data); 60 } 68 JobAdvertisementActions.filterJobAdvertisementsByRecruiter({ 69 searchTerm: searchTerm, industry: selectedIndustry, sortOrder: selectedSortOrder 70 }, (success, response) => { 71 if (success) { 72 setJobAdvertisementsByRecruiter(response.data); 61 73 } 62 )74 }) 63 75 } 64 76 65 return ( 66 <div className="container"> 67 <div className="head-dashboard-box"> 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"> 68 90 <div className="row"> 69 <div className="col-md-12 filter- container">91 <div className="col-md-12 filter-box"> 70 92 <div className="search-container"> 71 93 <i className="fa-solid fa-magnifying-glass search-icon"></i> … … 96 118 /> 97 119 </div> 98 <button onClick={filterJobAdvertisements} className="b tn-open-modal">Find jobs</button>120 <button onClick={filterJobAdvertisements} className="blue-submit-button">Find jobs</button> 99 121 </div> 100 122 </div> 101 123 </div> 102 <div className="row row-cols-1 row-cols-md- 4 g-4">124 <div className="row row-cols-1 row-cols-md-5 g-3"> 103 125 <AddJobAdModal/> 104 126 105 {jobAdvertisementsByRecruiter && 106 jobAdvertisementsByRecruiter.map((jobAd, index) => ( 107 <div key={index} className="col"> 108 <div className="custom-card"> 109 <div className="card-head"> 110 <span className="hourly-salary"><b>${jobAd.startingSalary}/hr</b></span> 111 <span 112 className="job-type"> {jobAd.jobType === JobType.JOB ? "Job" : "Internship"}</span> 113 {!jobAd.active && <span className="expired">Expired</span>} 114 <div className="card-management-btns"> 115 <DeleteJobAdModal props={jobAd}/> 116 <EditJobAdModal props={jobAd}/> 117 </div> 127 {jobAdvertisementsByRecruiter && jobAdvertisementsByRecruiter.map((jobAd, index) => ( 128 <div key={index} className="col"> 129 <div className="custom-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}/> 118 138 </div> 119 <div className="card-body">120 <h5 className="card-title">{jobAd.title}</h5>121 <span>{jobAd.industry} • <span style={{122 color: "black",123 124 125 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"> 126 146 <span><i className="fa-solid fa-building" 127 147 style={{color: "#000000"}}></i> Company: <span style={{ 128 color: "black", 129 fontWeight: "bold" 148 color: "black", fontWeight: "bold" 130 149 }}>{jobAd.recruiterName}</span></span> <br/> 131 150 </div> 132 151 133 134 <Link to={`/my-job-advertisements/${jobAd.id}/applications`}135 136 152 <div className="aligned"> 153 <Link to={`/job-management-hub/applications/${jobAd.id}`} 154 className="card-button solo">View applications</Link> 155 </div> 137 156 138 </div>139 157 </div> 140 158 </div> 141 ))} 142 159 </div>))} 143 160 </div> 144 161 </div> 162 163 145 164 ) 146 165 }
Note:
See TracChangeset
for help on using the changeset viewer.