Changeset 3b6962d for reactapp/src/Pages
- Timestamp:
- 11/23/22 12:15:28 (2 years ago)
- Branches:
- main
- Children:
- af801e3, e49d1b6
- Parents:
- c68150f
- Location:
- reactapp/src/Pages
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
reactapp/src/Pages/Faculty.js
rc68150f r3b6962d 27 27 28 28 useEffect(() => { 29 const urlProfessors = `http://192.168.0.1 7:8080/public/professors?facultyId=${params.facultyId}`;30 const urlStudyProgrammes = `http://192.168.0.1 7:8080/public/study_programmes?facultyId=${params.facultyId}`;29 const urlProfessors = `http://192.168.0.19:8080/public/professors?facultyId=${params.facultyId}`; 30 const urlStudyProgrammes = `http://192.168.0.19:8080/public/study_programmes?facultyId=${params.facultyId}`; 31 31 32 32 const fetchDataProfessors = async () => { -
reactapp/src/Pages/Professor.js
rc68150f r3b6962d 39 39 40 40 useEffect(() => { 41 const url = `http://192.168.0.1 7:8080/public/professor/${params.professorId}`;41 const url = `http://192.168.0.19:8080/public/professor/${params.professorId}`; 42 42 43 43 const fetchProfessor = async () => { … … 60 60 if (auth) { 61 61 setPostModalDisplay("block"); 62 document.body.style.overflowY = "hidden"; 62 63 } else { 63 64 navigate("/login"); … … 67 68 const handleModalCloseClick = () => { 68 69 setPostModalDisplay("none"); 70 document.body.style.overflowY = "auto"; 69 71 }; 70 72 … … 74 76 if (!postContent.length < 1) { 75 77 const response = await axios( 76 `http://192.168.0.1 7:8080/secure/professor/${params.professorId}/addOpinion`,78 `http://192.168.0.19:8080/secure/professor/${params.professorId}/addOpinion`, 77 79 { 78 80 method: "post", … … 152 154 rows="8" 153 155 cols="100" 156 spellCheck={false} 154 157 value={postContent} 155 158 onChange={handleContentChange} -
reactapp/src/Pages/Subject.js
rc68150f r3b6962d 46 46 47 47 useEffect(() => { 48 const url = `http://192.168.0.1 7:8080/public/subject/${params.subjectId}`;48 const url = `http://192.168.0.19:8080/public/subject/${params.subjectId}`; 49 49 50 50 const fetchData = async () => { … … 67 67 if (auth) { 68 68 setTopicModalDisplay("block"); 69 document.body.style.overflowY = "hidden"; 69 70 } else { 70 71 navigate("/login"); … … 74 75 const handleModalCloseClick = () => { 75 76 setTopicModalDisplay("none"); 77 document.body.style.overflowY = "auto"; 76 78 }; 77 79 … … 81 83 if (!topicTitle.length < 1 && !topicContent.length < 1) { 82 84 const response = await axios( 83 `http://192.168.0.1 7:8080/secure/subject/${params.subjectId}/addThread`,85 `http://192.168.0.19:8080/secure/subject/${params.subjectId}/addThread`, 84 86 { 85 87 method: "post", … … 178 180 value={topicTitle} 179 181 onChange={handleTitleChange} 182 spellCheck={false} 180 183 /> 181 184 </label> … … 188 191 value={topicContent} 189 192 onChange={handleContentChange} 193 spellCheck={false} 190 194 /> 191 195 </label> -
reactapp/src/Pages/Topic.js
rc68150f r3b6962d 48 48 49 49 useEffect(() => { 50 const url1 = `http://192.168.0.1 7:8080/public/thread/${params.topicId}`;51 const url2 = `http://192.168.0.1 7:8080/secure/currentUser`;50 const url1 = `http://192.168.0.19:8080/public/thread/${params.topicId}`; 51 const url2 = `http://192.168.0.19:8080/secure/currentUser`; 52 52 53 53 const fetchTopic = async () => { … … 84 84 setReplyModalDisplay("block"); 85 85 setPostForModal(post); 86 document.body.style.overflowY = "hidden"; 86 87 } else { 87 88 navigate("/login"); … … 98 99 if (!replyContent.length < 1) { 99 100 const response = await axios( 100 `http://192.168.0.1 7:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,101 `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`, 101 102 { 102 103 method: "post", … … 117 118 if (auth) { 118 119 setPostModalDisplay("block"); 120 document.body.style.overflowY = "hidden"; 119 121 } else { 120 122 navigate("/login"); … … 126 128 if (!postContent.length < 1) { 127 129 const response = await axios( 128 `http://192.168.0.1 7:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,130 `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`, 129 131 { 130 132 method: "post", … … 144 146 setPostModalDisplay("none"); 145 147 setReplyModalDisplay("none"); 148 document.body.style.overflowY = "auto"; 146 149 }; 147 150 const handleContentChange = (e) => { … … 157 160 ) { 158 161 const response = await axios( 159 `http://192.168.0.1 7:8080/secure/upvoteThread/${post.postId}`,162 `http://192.168.0.19:8080/secure/upvoteThread/${post.postId}`, 160 163 { 161 164 method: "get", … … 180 183 ) { 181 184 const response = await axios( 182 `http://192.168.0.1 7:8080/secure/downvoteThread/${post.postId}`,185 `http://192.168.0.19:8080/secure/downvoteThread/${post.postId}`, 183 186 { 184 187 method: "get", … … 210 213 {child.content} 211 214 </p> 212 <OpinionReplyCardContentTime> 213 {dateConverter( 214 new Date(child.timePosted).toString().slice(4, -43) 215 )} 216 </OpinionReplyCardContentTime> 215 {thread.timePosted === thread.timeLastEdited ? ( 216 <OpinionCardContentTime> 217 {dateConverter( 218 new Date(thread.timePosted).toString().slice(4, -43) 219 )} 220 </OpinionCardContentTime> 221 ) : ( 222 <OpinionCardContentTime> 223 {dateConverter( 224 new Date(thread.timeLastEdited).toString().slice(4, -43) 225 )}{" "} 226 (едитирано од модератор) 227 </OpinionCardContentTime> 228 )} 217 229 218 230 <div … … 232 244 (e) => e.vote === "UPVOTE" && e.user.id === user.id 233 245 ) 234 ? "green yellow"246 ? "green" 235 247 : "darkgrey" 236 248 : "darkgrey" … … 337 349 value={postContent} 338 350 onChange={handleContentChange} 351 spellCheck={false} 339 352 /> 340 353 </label> … … 356 369 {thread.content} 357 370 </p> 358 <OpinionCardContentTime> 359 {dateConverter( 360 new Date(thread.timePosted).toString().slice(4, -43) 361 )} 362 </OpinionCardContentTime> 371 {thread.timePosted === thread.timeLastEdited ? ( 372 <OpinionCardContentTime> 373 {dateConverter( 374 new Date(thread.timePosted).toString().slice(4, -43) 375 )} 376 </OpinionCardContentTime> 377 ) : ( 378 <OpinionCardContentTime> 379 {dateConverter( 380 new Date(thread.timeLastEdited).toString().slice(4, -43) 381 )}{" "} 382 (едитирано од модератор) 383 </OpinionCardContentTime> 384 )} 363 385 <div 364 386 style={{ … … 377 399 (e) => e.vote === "UPVOTE" && e.user.id === user.id 378 400 ) 379 ? "green yellow"401 ? "green" 380 402 : "darkgrey" 381 403 : "darkgrey" … … 422 444 {directChild.content} 423 445 </p> 424 <OpinionCardContentTime> 425 {dateConverter( 426 new Date(directChild.timePosted).toString().slice(4, -43) 427 )} 428 </OpinionCardContentTime> 446 {directChild.timePosted === directChild.timeLastEdited ? ( 447 <OpinionCardContentTime> 448 {dateConverter( 449 new Date(directChild.timePosted).toString().slice(4, -43) 450 )} 451 </OpinionCardContentTime> 452 ) : ( 453 <OpinionCardContentTime> 454 {dateConverter( 455 new Date(directChild.timeLastEdited) 456 .toString() 457 .slice(4, -43) 458 )}{" "} 459 (едитирано од модератор) 460 </OpinionCardContentTime> 461 )} 429 462 <div 430 463 style={{ … … 444 477 (e) => e.vote === "UPVOTE" && e.user.id === user.id 445 478 ) 446 ? "green yellow"479 ? "green" 447 480 : "darkgrey" 448 481 : "darkgrey" -
reactapp/src/Pages/University.js
rc68150f r3b6962d 22 22 23 23 useEffect(() => { 24 const url = `http://192.168.0.1 7:8080/public/faculties?universityId=${params.universityId}`;24 const url = `http://192.168.0.19:8080/public/faculties?universityId=${params.universityId}`; 25 25 26 26 const fetchData = async () => { -
reactapp/src/Pages/UserDashboard.js
rc68150f r3b6962d 13 13 import JSOG from "jsog"; 14 14 import AuthApi from "../api/AuthApi"; 15 import {EntityLi, EntityTypeSelector, EntityUl} from "../Components/Styled/EntityList.style"; 16 import { 17 AddOpinionButton, 18 Modal, 19 ModalBody, 20 ModalClose, 21 ModalContent, ModalFooter, 22 ModalHeader, ModalTextarea, 23 ModalInput 24 } from "../Components/Styled/Modal.style"; 15 25 16 26 function UserDashboard() { … … 21 31 const [fetchError, setFetchError] = useState(false); 22 32 33 const [postReports, setPostReports] = useState(null); 34 const [loadedPostReports, setLoadedPostReports] = useState(false); 35 36 const [reportModalDisplay, setReportModalDisplay] = useState("none"); 37 const [reportForModal, setReportForModal] = useState(null); 38 39 const [actionType, setActionType] = useState(0); 40 41 const [newPostContent, setNewPostContent] = useState(""); 42 const [newPostTitle, setNewPostTitle] = useState(""); 43 44 const [markResolved, setMarkResolved] = useState(false); 45 46 const handleModalCloseClick = () => { 47 setReportForModal(null); 48 setReportModalDisplay("none"); 49 document.body.style.overflowY = "auto"; 50 }; 51 52 const handleViewReportButtonClick = (e,report) => { 53 e.preventDefault(); 54 setReportForModal(report); 55 } 56 23 57 useEffect(() => { 24 const url = `http://192.168.0.17:8080/secure/currentUser`; 58 if(reportForModal!==null) { 59 if (reportForModal.post !== null) { 60 setNewPostContent(reportForModal.post.content); 61 if(reportForModal.post.title !== null) setNewPostTitle(reportForModal.post.title); 62 } 63 setReportModalDisplay("block"); 64 document.body.style.overflowY = "hidden"; 65 } 66 }, [reportForModal]); 67 68 useEffect(() => { 69 const url1 = `http://192.168.0.19:8080/secure/currentUser`; 70 const url2 = `http://192.168.0.19:8080/secure/getAllPostReports`; 25 71 26 72 const fetchUser = async () => { 27 73 try { 28 const response = await axios.get(url, { withCredentials: true }); 29 var cyclicGraph = await response.data; 30 var jsogStructure = JSOG.encode(cyclicGraph); 31 cyclicGraph = JSOG.decode(jsogStructure); 32 setUser(cyclicGraph); 33 setLoadedUser(true); 74 if(!loadedUser) { 75 const response = await axios.get(url1, {withCredentials: true}); 76 let cyclicGraph = await response.data; 77 var jsogStructure = JSOG.encode(cyclicGraph); 78 cyclicGraph = JSOG.decode(jsogStructure); 79 setUser(cyclicGraph); 80 setLoadedUser(true); 81 } 82 if(user.userRole==='MODERATOR')fetchPostReports(); 34 83 } catch (error) { 35 84 setFetchError(true); … … 37 86 }; 38 87 88 const fetchPostReports = async () => { 89 try { 90 const response = await axios.get(url2, {withCredentials: true}); 91 var cyclicGraph = await response.data; 92 var jsogStructure = JSOG.encode(cyclicGraph); 93 cyclicGraph = JSOG.decode(jsogStructure); 94 setPostReports(cyclicGraph); 95 setLoadedPostReports(true); 96 } catch (error) { 97 setFetchError(true); 98 } 99 }; 100 39 101 if (auth) fetchUser(); 40 }, []); 102 103 }, [user]); 41 104 42 105 // useEffect(() => { … … 50 113 if (post.parent === null) return post; 51 114 return findParentThread(post.parent); 115 } 116 117 const handleEdit = async (e) => { 118 e.preventDefault(); 119 try { 120 if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) { 121 await axios(`http://192.168.0.19:8080/secure/updateOpinion/${reportForModal.post.postId}`, 122 { 123 method: "put", 124 data: { 125 newContent: newPostContent, 126 newTargetProfessorId: reportForModal.post.targetProfessor.professorId, 127 }, 128 withCredentials: true, 129 }) 130 window.location.reload(false); 131 } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) { 132 await axios(`http://192.168.0.19:8080/secure/updateThread/${reportForModal.post.postId}`, 133 { 134 method: "put", 135 data: { 136 newTitle: newPostTitle, 137 newContent: newPostContent, 138 newTargetSubjectId: reportForModal.post.targetSubject.subjectId 139 }, 140 withCredentials: true, 141 }) 142 window.location.reload(false); 143 } 144 } catch (error) { 145 setFetchError(true); 146 } 147 } 148 149 const handleDelete = (e) => { 150 e.preventDefault(); 151 } 152 153 const handleMarkResolved = () => { 154 if (actionType !== 1) setMarkResolved(!markResolved); 52 155 } 53 156 … … 68 171 </UserDetailsCardContent> 69 172 <UserDetailsCardContent> 70 <b>Карма:</b> {user.karma} 173 <b>Карма:</b>{" "} 174 <span style={{ color: user.karma < 0 ? "indianred" : "green" }}> 175 {user.karma} 176 </span> 71 177 </UserDetailsCardContent> 72 178 </UserDetailsCard> 179 {loadedPostReports ? postReports.length > 0 ? ( 180 <h3 style={{ marginBottom: "10px" }}>Пријави за мислења:</h3> 181 ) : ( 182 <h3>Нема пријавени мислења</h3> 183 ) : loadedUser && user.userRole==='MODERATOR' ? "се вчитува..." : ""} 184 <EntityUl style={{marginTop:"25px"}}> 185 {loadedPostReports && postReports.map((postReport) => { 186 return <EntityLi bgcolor="cornsilk" key={postReport.postReportId} style={{padding:"15px"}}> 187 <p style={{color: postReport.resolved ? "grey" : "black"}}><span style={{fontSize:"14px", fontStyle:"italic", fontWeight:"normal"}}>{dateConverter( 188 new Date(postReport.time).toString().slice(4, -43) 189 )}</span><br/>{postReport.description.substring(0,45 )}{postReport.description.length >= 45 ? ("...") : ("")} {postReport.resolved ? <span style={{fontStyle:"italic"}}>(разрешено)</span> : ""} 190 </p> 191 <AddOpinionButton onClick={(e)=>handleViewReportButtonClick(e,postReport)} style={{height:"30px", padding:"5px", fontSize:"14px", position:"absolute", top:"30%", right:"20px" }}>Разгледај</AddOpinionButton> 192 </EntityLi>; 193 })} 194 </EntityUl> 73 195 {user.authoredPosts.length > 0 ? ( 74 <h3 style={{ marginBottom: "10px" }}>Ваши мислења:</h3>196 <h3 style={{ marginBottom: "10px", marginTop:"30px" }}>Ваши мислења:</h3> 75 197 ) : ( 76 <h3 >Немате објавени мислења</h3>198 <h3 style={{ marginBottom: "10px" }}>Немате објавени мислења</h3> 77 199 )} 78 200 {user.authoredPosts.map((post) => { … … 110 232 ); 111 233 })} 234 {reportForModal && ( 235 <Modal display={reportModalDisplay}> 236 <ModalContent> 237 <ModalHeader> 238 <ModalClose onClick={handleModalCloseClick}>×</ModalClose> 239 <h3 style={{ marginTop: "5px" }}> 240 Преглед на пријава за мислење 241 </h3> 242 </ModalHeader> 243 <ModalBody> 244 <p style={{fontWeight:"bold",marginBottom:"15px"}}>Пријавил: <span style={{fontWeight:"normal"}}>{reportForModal.user !== null ? <a href={"/user/"+reportForModal.user.id}>{reportForModal.user.username}</a> : "(избришан корисник)"}</span></p> 245 <p style={{fontWeight:"bold",marginBottom:"15px"}}>Време на пријава: <span style={{fontWeight:"normal"}}>{dateConverter( 246 new Date(reportForModal.time).toString().slice(4, -43) 247 )}</span></p> 248 <p style={{fontWeight:"bold",marginBottom:"15px"}}>Образложение: </p> <p style={{marginBottom:"15px"}}>{reportForModal.description}</p> 249 <p style={{fontWeight:"bold", marginBottom:"15px"}}>Информации за пријавеното мислење:</p> 250 {reportForModal.post !== null ? 251 <OpinionCard> 252 <OpinionCardContent> 253 <p style={{fontStyle: "italic", marginBottom: "10px"}}> 254 во дискусија за{" "} 255 {reportForModal.post.targetProfessor !== undefined ? ( 256 <a href={"/professor/" + reportForModal.post.targetProfessor.professorId}> 257 {reportForModal.post.targetProfessor.professorName} 258 </a> 259 ) : ( 260 <a 261 href={ 262 reportForModal.post.parent === null 263 ? "/topic/" + reportForModal.post.postId 264 : "/topic/" + findParentThread(reportForModal.post).postId 265 } 266 > 267 {reportForModal.post.targetSubject.subjectName} 268 </a> 269 )} 270 </p> 271 {reportForModal.post.title === null ? 272 <p style={{ fontStyle: "italic", marginBottom: "10px" }}> 273 <a href={"/user/" + reportForModal.post.author.id}> 274 {reportForModal.post.author.username} 275 </a>{" "} 276 напишал 277 </p> : 278 <p style={{ fontStyle: "italic", marginBottom: "10px" }}> 279 <a href={"/user/" + reportForModal.post.author.id}> 280 {reportForModal.post.author.username} 281 </a>{" "} 282 отворил тема со наслов <span style={{fontWeight:"bold"}}>{reportForModal.post.title}</span> 283 </p> 284 } 285 <p style={{marginBottom: "10px"}}>{reportForModal.post.content}</p> 286 <OpinionCardContentTime> 287 {dateConverter( 288 new Date(reportForModal.post.timePosted).toString().slice(4, -43) 289 )} 290 </OpinionCardContentTime> 291 </OpinionCardContent> 292 </OpinionCard> 293 : "Пријавеното мислење или неговиот автор се избришани"} 294 295 {reportForModal.post !== null && 296 <div style={{ display: "flex" }}> 297 {actionType===0 ? <EntityTypeSelector 298 backgroundcolor="rgba(0, 102, 204, 1)" 299 color="white" 300 boxshadow="none" 301 boxshadowhover="none" 302 opacityhover="0.6" 303 cursor="auto" 304 > 305 Измени содржина или наслов 306 </EntityTypeSelector> : <EntityTypeSelector 307 boxshadow="2px 2px 5px #aaaaaa" 308 cursor="pointer" 309 boxshadowhover="2px 2px 10px #aaaaaa" 310 opacityhover="1" 311 onClick={() => setActionType(0)} 312 > 313 Измени содржина или наслов 314 </EntityTypeSelector>} 315 {actionType===1 ? <EntityTypeSelector 316 backgroundcolor="rgba(0, 102, 204, 1)" 317 color="white" 318 boxshadow="none" 319 boxshadowhover="none" 320 opacityhover="0.6" 321 cursor="auto" 322 > 323 Избриши 324 </EntityTypeSelector> : <EntityTypeSelector 325 boxshadow="2px 2px 5px #aaaaaa" 326 cursor="pointer" 327 boxshadowhover="2px 2px 10px #aaaaaa" 328 opacityhover="1" 329 onClick={() => {setActionType(1); setMarkResolved(true)}} 330 > 331 Избриши 332 </EntityTypeSelector>} 333 {actionType===2 ? <EntityTypeSelector 334 backgroundcolor="rgba(0, 102, 204, 1)" 335 color="white" 336 boxshadow="none" 337 boxshadowhover="none" 338 opacityhover="0.6" 339 cursor="auto" 340 > 341 Премести 342 </EntityTypeSelector> : <EntityTypeSelector 343 boxshadow="2px 2px 5px #aaaaaa" 344 cursor="pointer" 345 boxshadowhover="2px 2px 10px #aaaaaa" 346 opacityhover="1" 347 onClick={() => setActionType(2)} 348 > 349 Премести 350 </EntityTypeSelector>} 351 </div>} 352 {reportForModal.post !== null ? 353 actionType === 0 ? 354 (<form onSubmit={e => handleEdit(e)}> 355 {reportForModal.post.title !== null && <label> 356 <b>Нов наслов на тема:</b> 357 <ModalInput 358 value={newPostTitle} 359 onChange={e => setNewPostTitle(e.target.value)} 360 id="title" 361 spellCheck={false} 362 style={{marginTop:"10px"}} 363 /> 364 </label>} 365 <label> 366 <b>Нова содржина:</b> 367 <ModalTextarea 368 value={newPostContent} 369 onChange={e => setNewPostContent(e.target.value)} 370 id="content" 371 rows="8" 372 cols="100" 373 spellCheck={false} 374 style={{marginTop:"10px"}} 375 /> 376 </label> 377 <div style={{marginTop:"15px"}}> 378 <label> 379 <input 380 type="checkbox" 381 checked={markResolved} 382 onChange={handleMarkResolved} 383 /> 384 <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span> 385 </label> 386 </div> 387 <ModalFooter type="submit">ПОТВРДИ</ModalFooter> 388 </form>) 389 : actionType === 1 ? 390 (<form onSubmit={e => handleDelete(e)}> 391 <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>Избриши го мислењето? (оваа акција е иреверзибилна)</p> 392 <div style={{marginTop:"15px"}}> 393 <label> 394 <input 395 type="checkbox" 396 checked={markResolved} 397 onChange={handleMarkResolved} 398 /> 399 <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span> 400 </label> 401 </div> 402 <ModalFooter type="submit">ПОТВРДИ</ModalFooter> 403 </form>) 404 : 405 ("123") 406 : null 407 } 408 </ModalBody> 409 </ModalContent> 410 </Modal> 411 )} 112 412 </> 113 413 ) : (
Note:
See TracChangeset
for help on using the changeset viewer.