Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import React, { useState } from "react";
  2. import { Checkbox, FormControlLabel, MenuItem, Select } from "@mui/material";
  3. import { useTranslation } from "react-i18next";
  4. import uploadIcon from "../../assets/images/upload.png";
  5. import IconButton from "../../components/IconButton/IconButton";
  6. import { useSelector, useDispatch } from "react-redux";
  7. import { selectCategories } from "../../store/selectors/categoriesSelector";
  8. import { useEffect } from "react";
  9. import { setCategoriesReq } from "../../store/actions/categories/categoriesAction";
  10. import {
  11. changeTagIsCheckedValue,
  12. resetIsCheckedTagsValue,
  13. setTagsReq,
  14. } from "../../store/actions/tags/tagsAction";
  15. import { selectTags } from "../../store/selectors/tagsSelector";
  16. import { uploadFileReq } from "../../store/actions/uploadFile/uploadFileActions";
  17. import { FILES_VIEW_PAGE } from "../../constants/pages";
  18. import PropTypes from "prop-types";
  19. const AddFile = ({ history }) => {
  20. const [dropzoneActive, setDropzoneActive] = useState(false);
  21. const [pdfFile, setPdfFile] = useState(null);
  22. const [title, setTitle] = useState("");
  23. const [showMessage, setShowMessage] = useState(false);
  24. const dispatch = useDispatch();
  25. const categories = useSelector(selectCategories);
  26. const tags = useSelector(selectTags);
  27. const [selectedCategory, setSelectedCategory] = useState(null);
  28. const [note,setNote] = useState("")
  29. const { t } = useTranslation();
  30. useEffect(() => {
  31. dispatch(setCategoriesReq());
  32. dispatch(setTagsReq());
  33. }, []);
  34. const onSuccessUploadFile = () => {
  35. dispatch(resetIsCheckedTagsValue());
  36. setPdfFile(null);
  37. setTitle("");
  38. setShowMessage(true);
  39. setNote("")
  40. };
  41. useEffect(() => {
  42. if (showMessage === true) {
  43. setTimeout(() => {
  44. setShowMessage(false);
  45. }, 2000);
  46. }
  47. }, [showMessage]);
  48. const handleDrop = (e) => {
  49. e.preventDefault();
  50. const selectedFile = e.dataTransfer.files[0];
  51. setPdfFile(selectedFile);
  52. };
  53. const handleChangeInputFile = (e) => {
  54. const selectedFile = e.target.files[0];
  55. setTitle(selectedFile.name.split(".")[0]);
  56. setPdfFile(selectedFile);
  57. };
  58. const selectCategoryHandler = (e) => {
  59. setSelectedCategory(e.target.value);
  60. };
  61. const onChangeTagsCheckbox = (id) => {
  62. dispatch(changeTagIsCheckedValue(id));
  63. };
  64. const uploadFileHandler = () => {
  65. const tagsIds = tags
  66. .filter((tag) => tag.isChecked === true)
  67. .map((tag) => Number(tag.id));
  68. if (
  69. title === "" ||
  70. tagsIds.length === 0 ||
  71. pdfFile === null ||
  72. selectedCategory === null
  73. )
  74. return;
  75. dispatch(
  76. uploadFileReq({
  77. title,
  78. categoryId: selectedCategory,
  79. tagsIds,
  80. fileToUpload: pdfFile,
  81. note:note,
  82. onSuccessUploadFile,
  83. })
  84. );
  85. };
  86. const handleChangeNote = (e) => {
  87. setNote(e.target.value)
  88. }
  89. return (
  90. <div className="files-page" style={{ paddingTop: "0px" }}>
  91. <div className="l-t-rectangle"></div>
  92. <div className="r-b-rectangle"></div>
  93. {/* <div className="files-page-card">
  94. <div className="files-page-card-title">
  95. <h1>Title</h1>
  96. </div>
  97. <div className="files-page-card-content">
  98. <input
  99. type="text"
  100. className="create-ad-form-control-first-step-input"
  101. onChange={(e) => setTitle(e.target.value)}
  102. value={title}
  103. placeholder="Document Title"
  104. />
  105. </div>
  106. </div> */}
  107. <div className="files-page-card">
  108. <div className="files-page-card-title">
  109. <h1>Categories</h1>
  110. </div>
  111. <div className="files-page-card-content">
  112. <Select
  113. labelId="files-page-card-content-select"
  114. id="files-page-card-content-selectt"
  115. sx={{ width: "100%", borderColor: "#e4e4e4 !important" }}
  116. onChange={selectCategoryHandler}
  117. value={selectedCategory}
  118. >
  119. {categories &&
  120. categories.map((category, index) => (
  121. <MenuItem
  122. key={index}
  123. sx={{ textAlign: "left" }}
  124. value={category.id}
  125. >
  126. {category.name}
  127. </MenuItem>
  128. ))}
  129. </Select>
  130. </div>
  131. </div>
  132. <div className="files-page-card">
  133. <div className="files-page-card-title">
  134. <h1>Tags</h1>
  135. </div>
  136. <div className="files-page-card-content">
  137. <div className="files-page-card-content-checkboxes">
  138. {tags &&
  139. tags.map((tag) => (
  140. <FormControlLabel
  141. key={tag.id}
  142. control={
  143. <Checkbox
  144. value={tag.name}
  145. checked={tag.isChecked}
  146. onChange={onChangeTagsCheckbox.bind(this, tag.id)}
  147. className="create-ad-second-step-checkbox"
  148. />
  149. }
  150. label={tag.name}
  151. />
  152. ))}
  153. </div>
  154. </div>
  155. </div>
  156. <div className="files-page-card">
  157. <div className="files-page-card-title">
  158. <h1>Drag & Drop File</h1>
  159. </div>
  160. <div className="files-page-card-content">
  161. <div
  162. className="uploadCV-input files-page-drag-and-drop"
  163. onDragOver={(e) => {
  164. setDropzoneActive(true);
  165. e.preventDefault();
  166. }}
  167. onDragLeave={(e) => {
  168. setDropzoneActive(false);
  169. e.preventDefault();
  170. }}
  171. onDrop={(e) => handleDrop(e)}
  172. style={{
  173. backgroundColor: dropzoneActive ? "#F4F4F4" : "#ffffff",
  174. }}
  175. >
  176. <div className="uploadCV-input-sub-container">
  177. <img src={uploadIcon} />
  178. <div className="uploadCV-input-sub-container">
  179. {pdfFile !== null ? (
  180. <p>{pdfFile.name}</p>
  181. ) : (
  182. <>
  183. <p>
  184. {t("ads.dragPdf1")} &nbsp;
  185. <label
  186. htmlFor="upload-file"
  187. style={{
  188. cursor: "pointer",
  189. textDecoration: "underline",
  190. color: "#1E92D0",
  191. }}
  192. >
  193. {t("common.search")}
  194. </label>
  195. &nbsp;{t("ads.dragPdf2")}
  196. </p>
  197. <input
  198. type="file"
  199. name="photo"
  200. id="upload-file"
  201. style={{ display: "none", zIndex: -1 }}
  202. value={pdfFile}
  203. data-testid="apply-for-ad-modal-fourth-stage-pdf-input"
  204. // accept=".pdf"
  205. onChange={handleChangeInputFile}
  206. />
  207. </>
  208. )}
  209. </div>
  210. </div>
  211. </div>
  212. </div>
  213. </div>
  214. <div className="files-page-card">
  215. <div className="files-page-card-title"></div>
  216. <textarea className="files-note" placeholder="Note..." value={note} onChange={(e) => handleChangeNote(e)}/>
  217. </div>
  218. <div
  219. className="add-file-message"
  220. style={
  221. showMessage === false ? { display: "none" } : { display: "flex" }
  222. }
  223. >
  224. <p>Uspesno dodat fajl</p>
  225. </div>
  226. <div className="files-page-card">
  227. <div
  228. className="files-page-card-add-button"
  229. style={{ alignItems: "center" }}
  230. >
  231. <p
  232. className="applicant-ads-back-button"
  233. onClick={() => history.push(FILES_VIEW_PAGE)}
  234. >
  235. Nazad na sve fajlove
  236. </p>
  237. <IconButton
  238. className="c-btn ads-page-btn c-btn--primary add-ad-btn"
  239. onClick={uploadFileHandler}
  240. >
  241. + {t("files.addFile")}
  242. </IconButton>
  243. </div>
  244. </div>
  245. </div>
  246. );
  247. };
  248. AddFile.propTypes = {
  249. history: PropTypes.shape({
  250. replace: PropTypes.func,
  251. push: PropTypes.func,
  252. location: PropTypes.shape({
  253. pathname: PropTypes.string,
  254. }),
  255. }),
  256. };
  257. export default AddFile;