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.

AddFile.js 7.4KB

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