Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

SelectionCard.js 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import React, { useContext, useEffect, useState } from "react";
  2. import PropTypes from "prop-types";
  3. import { formatDateSrb, formatTimeSrb } from "../../util/helpers/dateHelpers";
  4. import {
  5. Button,
  6. FormControl,
  7. InputLabel,
  8. MenuItem,
  9. Select,
  10. } from "@mui/material";
  11. import { SelectionContext } from "../../context/SelectionContext";
  12. import { useDispatch, useSelector } from "react-redux";
  13. import {
  14. setDoneProcessReq,
  15. setUpdateStatusReq,
  16. } from "../../store/actions/processes/processAction";
  17. // import Button from "../Button/Button";
  18. const options = ["Zakazan", "Odrađen", "Čeka na zakazivanje", "Neuspešno"];
  19. const SelectionCard = (props) => {
  20. const [showForm, setShowForm] = useState(false);
  21. const [selected, setSelected] = useState(props.item.status);
  22. const { success } = useSelector((s) => s.statusUpdate);
  23. const {
  24. setActiveProcess,
  25. setActiveInterview,
  26. setActiveProcessUnsuccess,
  27. // activeProcessUnsuccess,
  28. } = useContext(SelectionContext);
  29. const dispatch = useDispatch();
  30. const statusChange = (e) => {
  31. if (props.item.status !== "Odrađen") {
  32. e.stopPropagation();
  33. setShowForm(true);
  34. }
  35. };
  36. useEffect(() => {
  37. setShowForm(false);
  38. }, [success]);
  39. const select = (e) => {
  40. e.stopPropagation();
  41. if (e.target.value === "Zakazan") {
  42. // setovanje context state-a
  43. setActiveProcess({ process: props.item, status: "Zakazan" });
  44. }
  45. // poseban blok u slucaju da treba prikazati odredjeni modal kada je izabrano 'NEUSPESNO'
  46. else if (e.target.value === "Neuspešno") {
  47. setActiveProcessUnsuccess(props.item);
  48. } else if (e.target.value === "Odrađen") {
  49. // ukoliko nije zadnji nivo selekcije kreirati proces za sledeci nivo
  50. // u suprotnom samo promeniti status u odradjeno
  51. if (props.item.selectionLevelId !== 4)
  52. dispatch(
  53. setDoneProcessReq({
  54. id: props.item.id,
  55. name: "Some random name",
  56. applicantId: props.item.applicant.applicantId,
  57. })
  58. );
  59. else {
  60. // pozvati nasu custom metodu za promenu statusa bez prebacivanja u veci nivo
  61. // promeni status u odradjeno
  62. dispatch(
  63. setUpdateStatusReq({
  64. data: {
  65. newStatus: "Odrađen",
  66. processId: props.item.id,
  67. },
  68. })
  69. );
  70. }
  71. }
  72. setSelected(e.target.value);
  73. };
  74. const clickHandler = () => {
  75. if (showForm) {
  76. setSelected(props.item.status);
  77. setShowForm(false);
  78. } else props.click();
  79. };
  80. const changeInterviewerHandler = (e) => {
  81. e.stopPropagation();
  82. setActiveInterview(props.item);
  83. };
  84. return (
  85. <div
  86. draggable
  87. className="sel-item"
  88. onDragStart={props.dragStart}
  89. onClick={clickHandler}
  90. data-testid='sel-card'
  91. >
  92. {" "}
  93. <div
  94. className={`sel-item-inner ${props.item.scheduler && "withScheduler"}`}
  95. >
  96. {showForm ? (
  97. <form data-testid="status-select">
  98. <FormControl>
  99. <InputLabel id="demo-simple-select-label">Status</InputLabel>
  100. <Select
  101. data-testid="status-select-drop"
  102. label="Status"
  103. onChange={(e) => {
  104. select(e);
  105. }}
  106. onClick={(e) => e.stopPropagation()}
  107. value={selected}
  108. sx={{
  109. height: "40px",
  110. fontSize: "14px",
  111. paddingRight: "5px",
  112. }}
  113. >
  114. {options.map((n, index) => (
  115. <MenuItem key={index} sx={{ textAlign: "left" }} value={n}>
  116. {n}
  117. </MenuItem>
  118. ))}
  119. </Select>
  120. </FormControl>
  121. </form>
  122. ) : (
  123. <div
  124. className="status"
  125. onClick={(e) => {
  126. if (props.item.status !== "Neuspešno") statusChange(e);
  127. }}
  128. >
  129. <button
  130. data-testid="status-btn"
  131. className={props.item.status === "Neuspešno" ? "unsucc" : ""}
  132. >
  133. {props.item.status}
  134. </button>
  135. </div>
  136. )}
  137. <div className="date-name">
  138. <div className="date">
  139. {props.item.date !== null && props.item.date !== "" && (
  140. <p data-testid="process-date">
  141. {formatDateSrb(props.item.date)} <span className="grey">|</span>{" "}
  142. {formatTimeSrb(props.item.date)}
  143. </p>
  144. )}
  145. </div>
  146. <div className="full-name">
  147. <p>
  148. {props.item.applicant.firstName +
  149. " " +
  150. props.item.applicant.lastName}
  151. </p>
  152. </div>
  153. </div>
  154. </div>
  155. {props.item.scheduler &&
  156. props.item.status !== "Neuspešno" &&
  157. props.item.status !== "Odrađen" ? (
  158. <div className="sel-item-scheduler">
  159. <div className="change-interbtn">
  160. <Button
  161. className="interbtn"
  162. onClick={(e) => changeInterviewerHandler(e)}
  163. >
  164. Promeni
  165. </Button>
  166. </div>
  167. <p>
  168. Intervjuer: {props.item.scheduler.firstName}{" "}
  169. {props.item.scheduler.lastName}
  170. </p>
  171. </div>
  172. ) : (
  173. ""
  174. )}
  175. </div>
  176. );
  177. };
  178. SelectionCard.propTypes = {
  179. item: PropTypes.any,
  180. click: PropTypes.func,
  181. dragStart: PropTypes.func,
  182. };
  183. export default SelectionCard;