Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

AddFile.js 8.0KB

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