You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SelectionProcessOfApplicantPage.js 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import React, { useEffect, useRef } from "react";
  2. import arrow_left from "../../assets/images/arrow_left.png";
  3. import arrow_right from "../../assets/images/arrow_right.png";
  4. import { useParams } from "react-router-dom";
  5. import { useTranslation } from "react-i18next";
  6. import { Link } from "react-router-dom";
  7. import { useDispatch } from "react-redux";
  8. import { useSelector } from "react-redux";
  9. import Slider from "react-slick";
  10. import "slick-carousel/slick/slick.css";
  11. import "slick-carousel/slick/slick-theme.css";
  12. import { useTheme } from "@emotion/react";
  13. import { useMediaQuery } from "@mui/material";
  14. import ApplicantSelection from "../../components/Selection/ApplicantSelection";
  15. import { setProcessesReq } from "../../store/actions/processes/processesAction"
  16. import { selectProcesses } from "../../store/selectors/processesSelectors"
  17. import { selectApplicant } from "../../store/selectors/applicantWithProcessSelector"
  18. import { setApplicantReq } from "../../store/actions/processes/applicantAction"
  19. const SelectionProcessOfApplicantPage = () => {
  20. const theme = useTheme();
  21. const matches = useMediaQuery(theme.breakpoints.down("sm"));
  22. const applicant = useSelector(selectApplicant)
  23. const processes = applicant?.selectionProcesses;
  24. const levels = useSelector(selectProcesses)
  25. const { id } = useParams();
  26. const activeAdsSliderRef = useRef();
  27. const { t } = useTranslation();
  28. const dispatch = useDispatch();
  29. useEffect(() => {
  30. dispatch(setApplicantReq(id));
  31. dispatch(setProcessesReq());
  32. }, []);
  33. var settings = {
  34. dots: false,
  35. infinite: false,
  36. speed: 500,
  37. initialSlide: 0,
  38. responsive: [
  39. {
  40. breakpoint: 1024,
  41. settings: {
  42. slidesToShow: 4,
  43. slidesToScroll: 4,
  44. infinite: true,
  45. dots: false,
  46. },
  47. },
  48. {
  49. breakpoint: 900,
  50. settings: {
  51. slidesToShow: 3,
  52. slidesToScroll: 3,
  53. initialSlide: 0,
  54. },
  55. },
  56. {
  57. breakpoint: 480,
  58. settings: {
  59. slidesToShow: 1,
  60. slidesToScroll: 1,
  61. },
  62. },
  63. ],
  64. };
  65. const activeAdsArrowLeftHandler = () => {
  66. activeAdsSliderRef.current.slickPrev();
  67. };
  68. const activeAdsArrowRightHandler = () => {
  69. activeAdsSliderRef.current.slickNext();
  70. };
  71. const concatLevels = () => {
  72. const applicantSelections = [];
  73. for (var i = processes.length; i < levels.length; i++) {
  74. applicantSelections.push(<ApplicantSelection
  75. levelNumber={levels[i].id}
  76. levelName={levels[i].name}
  77. schedguler={""}
  78. date={""}
  79. status={"Čeka na zakazivanje"}
  80. id={id}
  81. key={i} />);
  82. }
  83. applicantSelections.push(<ApplicantSelection key={i} className="hiddenAd"
  84. date={""} />);
  85. return applicantSelections;
  86. };
  87. return (
  88. <>
  89. <div className="l-t-rectangle"></div>
  90. <div className="r-b-rectangle"></div>
  91. {/* <AdFilters /> */}
  92. <div className="ads">
  93. {processes && processes.length > 0 && (
  94. <div className="active-ads">
  95. <div className="active-ads-header">
  96. <h1>{t("selection.title")}
  97. <span className="level-header-spliter">
  98. |
  99. </span>
  100. <span className="level-header-subheader">
  101. {applicant.firstName + " " + applicant.lastName}
  102. </span>
  103. </h1>
  104. </div>
  105. <div className="active-ads-ads">
  106. <div className="active-ads-ads-a">
  107. {!matches && (
  108. <div className="active-ads-ads-arrows">
  109. <button onClick={activeAdsArrowLeftHandler}>
  110. <img src={arrow_left} alt="arrow-left" />
  111. </button>
  112. <button onClick={activeAdsArrowRightHandler}>
  113. <img src={arrow_right} alt="arrow-right" />
  114. </button>
  115. </div>
  116. )}
  117. </div>
  118. <div className="active-ads-ads-ad">
  119. <Slider
  120. {...settings}
  121. slidesToShow={4}
  122. slidesToScroll={4}
  123. style={{ width: "100%" }}
  124. ref={activeAdsSliderRef}
  125. >
  126. {processes.map((process, index) => {
  127. return <ApplicantSelection
  128. levelNumber={index + 1}
  129. levelName={process.selectionLevel.name}
  130. schedguler={`${process?.scheduler?.firstName} ${process?.scheduler?.lastName}`}
  131. link={process.link}
  132. date={new Date(process.date)}
  133. status={process.status}
  134. id={id}
  135. key={index}
  136. className={index === processes.length - 1 ? "active-process" : ""}
  137. />
  138. })}
  139. {processes.length <= levels.length && concatLevels()}
  140. </Slider>
  141. </div>
  142. </div>
  143. </div>
  144. )}
  145. {matches && (
  146. <div className="active-ads-ads-arrows">
  147. <button onClick={activeAdsArrowLeftHandler}>
  148. <img src={arrow_left} alt="arrow-left" />
  149. </button>
  150. <button onClick={activeAdsArrowRightHandler}>
  151. <img src={arrow_right} alt="arrow-right" />
  152. </button>
  153. </div>
  154. )}
  155. <div className="active-process-tip">
  156. <h3>
  157. {t("selection.tipHeader")}
  158. </h3>
  159. <p>
  160. {t("selection.tipBody")}
  161. </p>
  162. </div>
  163. </div>
  164. <div className="add-ad">
  165. <Link className="ad-details-buttons-link" to="/selectionflow">
  166. Nazad na sve kandidate
  167. </Link>
  168. </div>
  169. </>
  170. );
  171. };
  172. export default SelectionProcessOfApplicantPage;