Changes in / [4abf55a:e49d1b6]


Ignore:
Files:
1 added
14 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • reactapp/src/App.js

    r4abf55a re49d1b6  
    1414import NotFound from "./Pages/NotFound";
    1515import Topic from "./Pages/Topic";
    16 import LoadingSpinner from "./Components/Styled/LoadingSpinner.style";
    1716
    1817export default function App() {
     
    4342      return children;
    4443    } else {
    45       return <LoadingSpinner/>;
     44      return <div>се вчитува cookie...</div>;
    4645    }
    4746  };
  • reactapp/src/Components/OpinionTree.js

    r4abf55a re49d1b6  
    4242
    4343  useEffect(() => {
    44     const url = `http://192.168.0.29:8080/secure/currentUser`;
     44    const url = `http://192.168.0.19:8080/secure/currentUser`;
    4545
    4646    const fetchUser = async () => {
     
    6868      ) {
    6969        const response = await axios(
    70           `http://192.168.0.29:8080/secure/upvoteOpinion/${post.postId}`,
     70          `http://192.168.0.19:8080/secure/upvoteOpinion/${post.postId}`,
    7171          {
    7272            method: "get",
     
    7474          }
    7575        );
    76         window.location.reload();
     76        window.location.reload(false);
    7777      } else {
    7878        return;
     
    9191      ) {
    9292        const response = await axios(
    93           `http://192.168.0.29:8080/secure/downvoteOpinion/${post.postId}`,
     93          `http://192.168.0.19:8080/secure/downvoteOpinion/${post.postId}`,
    9494          {
    9595            method: "get",
     
    9898        );
    9999
    100         window.location.reload();
     100        window.location.reload(false);
    101101      } else {
    102102        return;
     
    131131    if (!replyContent.length < 1) {
    132132      const response = await axios(
    133         `http://192.168.0.29:8080/secure/professor/${professor.professorId}/replyToOpinion/${postId}`,
     133        `http://192.168.0.19:8080/secure/professor/${professor.professorId}/replyToOpinion/${postId}`,
    134134        {
    135135          method: "post",
     
    141141      );
    142142      setErrorMessage("");
    143       window.location.reload();
     143      window.location.reload(false);
    144144    } else {
    145145      setErrorMessage("Полето за содржина не смее да биде празно");
     
    161161              {child.content}
    162162            </p>
    163             {new Date(child.timePosted).setMilliseconds(0) === new Date(child.timeLastEdited).setMilliseconds(0) ? (
     163            {child.timePosted === child.timeLastEdited ? (
    164164              <OpinionCardContentTime>
    165165                {dateConverter(
    166166                  new Date(child.timePosted).toString().slice(4, -43)
    167                 )} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>
     167                )}
    168168              </OpinionCardContentTime>
    169169            ) : (
     
    171171                {dateConverter(
    172172                  new Date(child.timeLastEdited).toString().slice(4, -43)
    173                 )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>{" "}
     173                )}{" "}
    174174                (едитирано од модератор)
    175175              </OpinionCardContentTime>
     
    260260                    {opinion.content}
    261261                  </p>
    262                   {new Date(opinion.timePosted).setMilliseconds(0) === new Date(opinion.timeLastEdited).setMilliseconds(0) ? (
     262                  {opinion.timePosted === opinion.timeLastEdited ? (
    263263                    <OpinionCardContentTime>
    264264                      {dateConverter(
    265265                        new Date(opinion.timePosted).toString().slice(4, -43)
    266                       )} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>
     266                      )}
    267267                    </OpinionCardContentTime>
    268268                  ) : (
     
    272272                          .toString()
    273273                          .slice(4, -43)
    274                       )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>{" "}
     274                      )}{" "}
    275275                      (едитирано од модератор)
    276276                    </OpinionCardContentTime>
  • reactapp/src/Components/Search.js

    r4abf55a re49d1b6  
    1515
    1616  useEffect(() => {
    17     const url = `http://192.168.0.29:8080/public/professors/nameContains/${transliterate(
     17    const url = `http://192.168.0.19:8080/public/professors/nameContains/${transliterate(
    1818      query
    1919    )}`;
  • reactapp/src/Components/Styled/ProfessorCard.style.js

    r4abf55a re49d1b6  
    22
    33export const ProfessorCard = styled.div`
     4  background-color: cornsilk;
    45  width: auto;
    56  padding: 10px;
  • reactapp/src/Components/UserHeader.js

    r4abf55a re49d1b6  
    33import axios from "../api/axios";
    44import Logout from "./Logout";
    5 import LoadingSpinner from "./Styled/LoadingSpinner.style";
    65
    76function UserHeader({}) {
     
    1110
    1211  useEffect(() => {
    13     const url = `http://192.168.0.29:8080/secure/currentUser`;
     12    const url = `http://192.168.0.19:8080/secure/currentUser`;
    1413
    1514    const fetchUser = async () => {
     
    3534  ) : (
    3635    <div style={{ float: "left", marginTop: 25, marginLeft: 60 }}>
    37       <LoadingSpinner/>
     36      се вчитува...
    3837    </div>
    3938  );
  • reactapp/src/Pages/Faculty.js

    r4abf55a re49d1b6  
    1616import SubjectsAccordion from "../Components/SubjectsAccordion";
    1717import { CurrentPageNav } from "../Components/Styled/Main.style";
    18 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    1918
    2019const Faculty = () => {
     
    2827
    2928  useEffect(() => {
    30     const urlProfessors = `http://192.168.0.29:8080/public/professors?facultyId=${params.facultyId}`;
    31     const urlStudyProgrammes = `http://192.168.0.29: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}`;
    3231
    3332    const fetchDataProfessors = async () => {
     
    225224  ) : !fetchError && !loadedProfessors ? (
    226225    <div>
    227       <LoadingSpinner style={{ marginTop: "140px" }}/>
     226      <p style={{ marginTop: "140px" }}>се вчитува...</p>
    228227      <Outlet />
    229228    </div>
  • reactapp/src/Pages/Login.js

    r4abf55a re49d1b6  
    1717
    1818  useEffect(() => {
    19     if (!auth) userRef.current.focus();
     19    userRef.current.focus();
    2020  }, []);
    2121
  • reactapp/src/Pages/Professor.js

    r4abf55a re49d1b6  
    2424import axios from "../api/axios";
    2525import { CurrentPageNav } from "../Components/Styled/Main.style";
    26 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    2726
    2827function Professor() {
     
    4039
    4140  useEffect(() => {
    42     const url = `http://192.168.0.29:8080/public/professor/${params.professorId}`;
     41    const url = `http://192.168.0.19:8080/public/professor/${params.professorId}`;
    4342
    4443    const fetchProfessor = async () => {
     
    7776    if (!postContent.length < 1) {
    7877      const response = await axios(
    79         `http://192.168.0.29:8080/secure/professor/${params.professorId}/addOpinion`,
     78        `http://192.168.0.19:8080/secure/professor/${params.professorId}/addOpinion`,
    8079        {
    8180          method: "post",
     
    8786      );
    8887      setErrorMessage("");
    89       window.location.reload();
     88      window.location.reload(false);
    9089    } else {
    9190      setErrorMessage("Полето за содржина не смее да биде празно");
     
    112111        </CurrentPageNav>
    113112        <ProfessorCard>
    114           <ProfessorCardName>{professor.professorName} <span style={{opacity:"50%", fontSize:"16px"}}>#{professor.professorId}</span></ProfessorCardName>
     113          <ProfessorCardName>{professor.professorName}</ProfessorCardName>
    115114          <ProfessorCardSeparator />
    116115          <div style={{ marginTop: "10px" }}>
     
    180179    return (
    181180      <div>
    182         <LoadingSpinner style={{ marginTop: "140px" }}/>
     181        <p style={{ marginTop: "140px" }}>се вчитува...</p>
    183182        <Outlet />
    184183      </div>
  • reactapp/src/Pages/Subject.js

    r4abf55a re49d1b6  
    2828} from "../Components/Styled/Modal.style";
    2929import axios from "../api/axios";
    30 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    3130
    3231const Subject = () => {
     
    4746
    4847  useEffect(() => {
    49     const url = `http://192.168.0.29:8080/public/subject/${params.subjectId}`;
     48    const url = `http://192.168.0.19:8080/public/subject/${params.subjectId}`;
    5049
    5150    const fetchData = async () => {
     
    8483    if (!topicTitle.length < 1 && !topicContent.length < 1) {
    8584      const response = await axios(
    86         `http://192.168.0.29:8080/secure/subject/${params.subjectId}/addThread`,
     85        `http://192.168.0.19:8080/secure/subject/${params.subjectId}/addThread`,
    8786        {
    8887          method: "post",
     
    9594      );
    9695      setErrorMessage("");
    97       window.location.reload();
     96      window.location.reload(false);
    9897    } else {
    9998      setErrorMessage("Полињата за наслов и содржина не смеат да бидат празни");
     
    128127      </CurrentPageNav>
    129128      <ProfessorCard>
    130         <ProfessorCardName>{subject.subjectName} <span style={{opacity:"50%", fontSize:"16px"}}>#{subject.subjectId}</span></ProfessorCardName>
     129        <ProfessorCardName>{subject.subjectName}</ProfessorCardName>
    131130        <ProfessorCardSeparator />
    132131        <div style={{ marginTop: "10px" }}>
     
    205204      <div key={subject.subjectId}>
    206205        {topics.map((topic) => {
    207           var numReplies = 0;
    208           topic.children.map((c)=>numReplies += ++c.children.length); // ++c.children.length -> c + decata na c
     206          var numReplies = topic.children.length;
    209207          return (
    210208            <EntityUl key={topic.postId}>
     
    270268  ) : !fetchError ? (
    271269    <div>
    272       <LoadingSpinner style={{ marginTop: "140px" }}/>
     270      <p style={{ marginTop: "140px" }}>се вчитува...</p>
    273271      <Outlet />
    274272    </div>
  • reactapp/src/Pages/Topic.js

    r4abf55a re49d1b6  
    2828} from "../Components/Styled/Modal.style";
    2929import axios from "../api/axios";
    30 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    3130
    3231const Topic = () => {
     
    4948
    5049  useEffect(() => {
    51     const url1 = `http://192.168.0.29:8080/public/thread/${params.topicId}`;
    52     const url2 = `http://192.168.0.29: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`;
    5352
    5453    const fetchTopic = async () => {
     
    10099    if (!replyContent.length < 1) {
    101100      const response = await axios(
    102         `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
     101        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
    103102        {
    104103          method: "post",
     
    110109      );
    111110      setErrorMessage("");
    112       window.location.reload();
     111      window.location.reload(false);
    113112    } else {
    114113      setErrorMessage("Полето за содржина не смее да биде празно");
     
    129128    if (!postContent.length < 1) {
    130129      const response = await axios(
    131         `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
     130        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
    132131        {
    133132          method: "post",
     
    139138      );
    140139      setErrorMessage("");
    141       window.location.reload();
     140      window.location.reload(false);
    142141    } else {
    143142      setErrorMessage("Полето за содржина не смее да биде празно");
     
    161160      ) {
    162161        const response = await axios(
    163           `http://192.168.0.29:8080/secure/upvoteThread/${post.postId}`,
     162          `http://192.168.0.19:8080/secure/upvoteThread/${post.postId}`,
    164163          {
    165164            method: "get",
     
    167166          }
    168167        );
    169         window.location.reload();
     168        window.location.reload(false);
    170169      } else {
    171170        return;
     
    184183      ) {
    185184        const response = await axios(
    186           `http://192.168.0.29:8080/secure/downvoteThread/${post.postId}`,
     185          `http://192.168.0.19:8080/secure/downvoteThread/${post.postId}`,
    187186          {
    188187            method: "get",
     
    191190        );
    192191
    193         window.location.reload();
     192        window.location.reload(false);
    194193      } else {
    195194        return;
     
    214213              {child.content}
    215214            </p>
    216             {new Date(child.timePosted).setMilliseconds(0) === new Date(child.timeLastEdited).setMilliseconds(0) ? (
     215            {thread.timePosted === thread.timeLastEdited ? (
    217216              <OpinionCardContentTime>
    218217                {dateConverter(
    219                   new Date(child.timePosted).toString().slice(4, -43)
    220                 )} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>
     218                  new Date(thread.timePosted).toString().slice(4, -43)
     219                )}
    221220              </OpinionCardContentTime>
    222221            ) : (
    223222              <OpinionCardContentTime>
    224223                {dateConverter(
    225                   new Date(child.timeLastEdited).toString().slice(4, -43)
    226                 )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>{" "}
     224                  new Date(thread.timeLastEdited).toString().slice(4, -43)
     225                )}{" "}
    227226                (едитирано од модератор)
    228227              </OpinionCardContentTime>
     
    271270              />
    272271
    273               <VoteCount right={10 + "px"}>
     272              <VoteCount right={50 + "px"}>
    274273                {child.votes.filter((v) => v.vote === "DOWNVOTE").length}
    275274              </VoteCount>
     
    325324      </CurrentPageNav>
    326325      <div style={{ height: "20px", marginBottom: "50px", marginTop: "50px" }}>
    327         <h3 style={{ float: "left" }}>{thread.title} <span style={{opacity:"50%", fontSize:"16px"}}>#{thread.postId}</span></h3>
     326        <h3 style={{ float: "left" }}>{thread.title}</h3>
    328327        {auth && (
    329328          <AddOpinionButton onClick={handleAddOpinionButtonClick}>
     
    370369            {thread.content}
    371370          </p>
    372           {new Date(thread.timePosted).setMilliseconds(0) === new Date(thread.timeLastEdited).setMilliseconds(0) ? (
     371          {thread.timePosted === thread.timeLastEdited ? (
    373372            <OpinionCardContentTime>
    374373              {dateConverter(
    375374                new Date(thread.timePosted).toString().slice(4, -43)
    376               )} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>
     375              )}
    377376            </OpinionCardContentTime>
    378377          ) : (
     
    380379              {dateConverter(
    381380                new Date(thread.timeLastEdited).toString().slice(4, -43)
    382               )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>{" "}
     381              )}{" "}
    383382              (едитирано од модератор)
    384383            </OpinionCardContentTime>
     
    445444                {directChild.content}
    446445              </p>
    447               {new Date(directChild.timePosted).setMilliseconds(0) === new Date(directChild.timeLastEdited).setMilliseconds(0) ? (
     446              {directChild.timePosted === directChild.timeLastEdited ? (
    448447                <OpinionCardContentTime>
    449448                  {dateConverter(
    450449                    new Date(directChild.timePosted).toString().slice(4, -43)
    451                   )} <span style={{fontStyle:"normal",color:"blue"}}>#{directChild.postId}</span>
     450                  )}
    452451                </OpinionCardContentTime>
    453452              ) : (
     
    457456                      .toString()
    458457                      .slice(4, -43)
    459                   )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{directChild.postId}</span>{" "}
     458                  )}{" "}
    460459                  (едитирано од модератор)
    461460                </OpinionCardContentTime>
     
    560559  ) : !fetchError && !loadedThread ? (
    561560    <div>
    562       <LoadingSpinner style={{ marginTop: "140px" }}/>
     561      <p style={{ marginTop: "140px" }}>се вчитува...</p>
    563562      <Outlet />
    564563    </div>
  • reactapp/src/Pages/University.js

    r4abf55a re49d1b6  
    1414} from "../Components/Styled/EntityList.style";
    1515import { CurrentPageNav } from "../Components/Styled/Main.style";
    16 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    1716
    1817const University = () => {
     
    2322
    2423  useEffect(() => {
    25     const url = `http://192.168.0.29:8080/public/faculties?universityId=${params.universityId}`;
     24    const url = `http://192.168.0.19:8080/public/faculties?universityId=${params.universityId}`;
    2625
    2726    const fetchData = async () => {
     
    106105  ) : !fetchError && !loaded ? (
    107106    <div>
    108       <LoadingSpinner style={{ marginTop: "140px" }}/>
     107      <p style={{ marginTop: "140px" }}>се вчитува...</p>
    109108      <Outlet />
    110109    </div>
  • reactapp/src/Pages/UserDashboard.js

    r4abf55a re49d1b6  
    1 /* eslint-disable no-unused-vars */
    2 // noinspection JSUnresolvedVariable,ES6ConvertVarToLetConst,JSUnresolvedFunction,SpellCheckingInspection,JSUnusedLocalSymbols
    3 
    41import React, { useEffect, useState, useContext } from "react";
    52import {
     
    2623    ModalInput
    2724} from "../Components/Styled/Modal.style";
    28 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
    2925
    3026function UserDashboard() {
     
    4440
    4541  const [newPostContent, setNewPostContent] = useState("");
    46   const [newOpinionTargetProfessorId, setNewOpinionTargetProfessorId] = useState("");
    47   const [newOpinionTargetProfessor, setNewOpinionTargetProfessor] = useState(null);
    48   const [loadedNewProfessor,setLoadedNewProfessor] = useState(false);
    49   const [newParentPostId, setNewParentPostId] = useState("-1");
    50 
    51   const [newThreadTitle, setNewThreadTitle] = useState("");
    52   const [newParentThreadId,setNewParentThreadId] = useState("-1");
    53   const [newTargetSubjectId, setNewTargetSubjectId] = useState("");
    54   const [newTargetSubject, setNewTargetSubject] = useState(null);
    55   const [loadedNewSubject, setLoadedNewSubject] = useState(null);
     42  const [newPostTitle, setNewPostTitle] = useState("");
    5643
    5744  const [markResolved, setMarkResolved] = useState(false);
    58 
    59   const [errMsg, setErrMsg] = useState("");
    6045
    6146  const handleModalCloseClick = () => {
     
    7459      if (reportForModal.post !== null) {
    7560        setNewPostContent(reportForModal.post.content);
    76         if(reportForModal.post.title !== null) setNewThreadTitle(reportForModal.post.title);
    77         if(reportForModal.post.targetProfessor !== undefined) setNewOpinionTargetProfessorId(reportForModal.post.targetProfessor.professorId); //prvicnoto
    78         if(reportForModal.post.targetProfessor === undefined) setNewTargetSubjectId(reportForModal.post.targetSubject.subjectId); //prvicnoto
     61        if(reportForModal.post.title !== null) setNewPostTitle(reportForModal.post.title);
    7962      }
    8063      setReportModalDisplay("block");
     
    8366  }, [reportForModal]);
    8467
    85   const[loadingProf, setLoadingProf] = useState(false);
    86 
    87   const handleNewTargetProfessorChange = async (e) => {
    88     setLoadingProf(true);
    89     e.preventDefault();
    90     if (newOpinionTargetProfessorId!=="") {
    91         try {
    92           const response = await axios.get(`http://192.168.0.29:8080/public/professor/${newOpinionTargetProfessorId}`, {withCredentials: true});
    93           let cyclicGraph = await response.data;
    94           var jsogStructure = JSOG.encode(cyclicGraph);
    95           cyclicGraph = JSOG.decode(jsogStructure);
    96           setNewOpinionTargetProfessor(cyclicGraph);
    97           setLoadedNewProfessor(true);
    98           setLoadingProf(false);
    99         } catch (error) {
    100           setFetchError(true);
    101         }
    102     }
    103   }
    104 
    105   const[loadingSubj, setLoadingSubj] = useState(false);
    106 
    107   const handleNewTargetSubjectChange = async (e) => {
    108     e.preventDefault();
    109     setLoadingSubj(true);
    110     if (newTargetSubjectId!=="") {
    111       try {
    112         const response = await axios.get(`http://192.168.0.29:8080/public/subject/${newTargetSubjectId}`, {withCredentials: true});
    113         let cyclicGraph = await response.data;
    114         var jsogStructure = JSOG.encode(cyclicGraph);
    115         cyclicGraph = JSOG.decode(jsogStructure);
    116         setNewTargetSubject(cyclicGraph);
    117         setLoadedNewSubject(true);
    118         setLoadingSubj(false);
    119       } catch (error) {
    120         setFetchError(true);
    121       }
    122     }
    123   }
    124 
    12568  useEffect(() => {
    126     const url1 = `http://192.168.0.29:8080/secure/currentUser`;
    127     const url2 = `http://192.168.0.29:8080/secure/getAllPostReports`;
     69    const url1 = `http://192.168.0.19:8080/secure/currentUser`;
     70    const url2 = `http://192.168.0.19:8080/secure/getAllPostReports`;
    12871
    12972    const fetchUser = async () => {
     
    162105  // useEffect(() => {
    163106  //   const timer = setTimeout(() => {
    164   //     if (user === null) window.location.reload(); <---- :-)
     107  //     if (user === null) window.location.reload(false); <---- :-)
    165108  //   }, 3000);
    166109  //   return () => clearTimeout(timer);
     
    176119    try {
    177120      if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
    178         await axios(`http://192.168.0.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
     121        await axios(`http://192.168.0.19:8080/secure/updateOpinion/${reportForModal.post.postId}`,
    179122            {
    180123              method: "put",
     
    182125                newContent: newPostContent,
    183126                newTargetProfessorId: reportForModal.post.targetProfessor.professorId,
    184                 newParentPostId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1"
    185127              },
    186128              withCredentials: true,
    187129            })
     130        window.location.reload(false);
    188131      } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
    189         await axios(`http://192.168.0.29:8080/secure/updateThread/${reportForModal.post.postId}`,
     132        await axios(`http://192.168.0.19:8080/secure/updateThread/${reportForModal.post.postId}`,
    190133            {
    191134              method: "put",
    192135              data: {
    193                 newTitle: newThreadTitle,
     136                newTitle: newPostTitle,
    194137                newContent: newPostContent,
    195                 newTargetSubjectId: reportForModal.post.targetSubject.subjectId,
    196                 newParentThreadId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1"
     138                newTargetSubjectId: reportForModal.post.targetSubject.subjectId
    197139              },
    198140              withCredentials: true,
    199141            })
    200       }
    201         await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
    202           method: "get",
    203           withCredentials: true
    204         })
    205     } catch (error) {
    206       setFetchError(true);
    207     }
    208     window.location.reload();
    209   }
    210 
    211   const handleRelocate = async (e) => {
    212     e.preventDefault();
    213     try {
    214       if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
    215         var response = await axios(`http://192.168.0.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
    216             {
    217               method: "put",
    218               data: {
    219                 newContent: reportForModal.post.content,
    220                 newTargetProfessorId: newOpinionTargetProfessorId,
    221                 newParentPostId: newParentPostId==="Постави како самостојно мислење" ? "-1" : newParentPostId //:)
    222               },
    223               withCredentials: true,
    224             })
    225       } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
    226         var response = await axios(`http://192.168.0.29:8080/secure/updateThread/${reportForModal.post.postId}`,
    227             {
    228               method: "put",
    229               data: {
    230                 newTitle: newThreadTitle,
    231                 newContent: reportForModal.post.content,
    232                 newTargetSubjectId: newTargetSubjectId,
    233                 newParentThreadId: newParentThreadId==="Постави како самостојно мислење (нова тема)" ? "-1" : newParentThreadId //:)
    234               },
    235               withCredentials: true,
    236             })
    237       }
    238       await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
    239         method: "get",
    240         withCredentials: true
    241       })
    242     } catch (error) {
    243       setFetchError(true);
    244     }
    245     setErrMsg(response.data);
    246     if (response.data==="") window.location.reload();
    247   }
    248 
    249   const handleDelete = async (e) => {
    250     e.preventDefault();
    251     try {
    252       if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
    253         await axios(`http://192.168.0.29:8080/secure/deleteOpinion/${reportForModal.post.postId}`,
    254             {
    255               method: "delete",
    256               withCredentials: true,
    257             })
    258         window.location.reload();
    259       } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
    260         await axios(`http://192.168.0.29:8080/secure/deleteThread/${reportForModal.post.postId}`,
    261             {
    262               method: "delete",
    263               withCredentials: true,
    264             })
     142        window.location.reload(false);
    265143      }
    266144    } catch (error) {
    267145      setFetchError(true);
    268146    }
    269     window.location.reload();
     147  }
     148
     149  const handleDelete = (e) => {
     150    e.preventDefault();
    270151  }
    271152
     
    300181      ) : (
    301182          <h3>Нема пријавени мислења</h3>
    302       ) : loadedUser && user.userRole==='MODERATOR' ? <LoadingSpinner/> : ""}
     183      ) : loadedUser && user.userRole==='MODERATOR' ? "се вчитува..." : ""}
    303184      <EntityUl style={{marginTop:"25px"}}>
    304185      {loadedPostReports && postReports.map((postReport) => {
     
    344225                  {dateConverter(
    345226                    new Date(post.timePosted).toString().slice(4, -43)
    346                   )} <span style={{fontStyle:"normal",color:"blue"}}>#{post.postId}</span>
     227                  )}
    347228                </OpinionCardContentTime>
    348229              </OpinionCardContent>
     
    406287                          {dateConverter(
    407288                              new Date(reportForModal.post.timePosted).toString().slice(4, -43)
    408                           )} <span style={{fontStyle:"normal",color:"blue"}}>#{reportForModal.post.postId}</span>
     289                          )}
    409290                        </OpinionCardContentTime>
    410291                      </OpinionCardContent>
     
    472353                  actionType === 0 ?
    473354              (<form onSubmit={e => handleEdit(e)}>
    474                 {reportForModal.post.title !== null &&
    475                     <label>
     355                {reportForModal.post.title !== null && <label>
    476356                  <b>Нов наслов на тема:</b>
    477357                  <ModalInput
    478                       value={newThreadTitle}
    479                       onChange={e => setNewThreadTitle(e.target.value)}
     358                      value={newPostTitle}
     359                      onChange={e => setNewPostTitle(e.target.value)}
    480360                      id="title"
    481361                      spellCheck={false}
     
    499379                  <input
    500380                      type="checkbox"
     381                      checked={markResolved}
    501382                      onChange={handleMarkResolved}
    502383                  />
     
    522403                          </form>)
    523404                          :
    524                           (reportForModal.post.targetProfessor !== undefined ?
    525                               (<form onSubmit={e => handleRelocate(e)}>
    526                                 <p style={{color:"black"}}>Внеси <span style={{fontWeight:"bold"}}>ID</span> на секцијата за дискусија (за <span style={{fontWeight:"bold"}}>професор</span>)
    527                                     во која треба да биде преместено мислењето:</p>
    528                                     <div style={{marginTop:"15px"}}>
    529                                       <label>
    530                                         <ModalInput
    531                                             value={newOpinionTargetProfessorId}
    532                                             onChange={e => {e.preventDefault();setNewOpinionTargetProfessorId(e.target.value)}}
    533                                             id="newOpinionTargetProfessorId"
    534                                             spellCheck={false}
    535                                             style={{marginTop:"10px", marginBottom:"10px", width:"90px"}}
    536                                         />
    537                                         <button onClick={async (e) => {await handleNewTargetProfessorChange(e);}} style={{marginBottom:"10px", padding:"5px", fontFamily: "Roboto Mono, monospace"}}>Зачувај</button>
    538                                         {newOpinionTargetProfessor!==null && !loadingProf ? <p style={{color:"black", marginBottom:"20px", opacity:"50%"}}>Мислењето ќе се премести во секцијата за професорот со <span style={{fontWeight:"bold"}}>ID=
    539                                           {newOpinionTargetProfessor.professorId}</span> (<span style={{fontWeight:"bold"}}>{newOpinionTargetProfessor.professorName}</span>)</p> : loadingProf ? <LoadingSpinner style={{marginBottom:"15px", marginTop:"15px"}}/> : null}
    540                                         {newOpinionTargetProfessor && <p style={{color:"black", marginBottom:"10px"}}>Постави како дете на мислење со ID:</p>}
    541                                         {newOpinionTargetProfessor &&
    542                                         <select value={newParentPostId} onChange={e => setNewParentPostId(e.target.value)} style={{width:"280px", display:"block", padding:"5px",marginBottom:"5px", fontFamily: "Roboto Mono, monospace"}}>
    543                                           <option value="-1">Постави како самостојно мислење</option>
    544                                           {newOpinionTargetProfessor.relatedOpinions.filter((opinion)=>opinion.postId!==reportForModal.post.postId).map((opinion) => {
    545                                             return <option key={opinion.postId} value={opinion.postId}>{opinion.postId}</option>})
    546                                           }
    547                                         </select>}
    548                                         <br/>
    549                                         <input
    550                                             type="checkbox"
    551                                             defaultChecked={reportForModal.resolved}
    552                                             onChange={handleMarkResolved}
    553                                         />
    554                                         <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
    555                                       </label>
    556                                     </div>
    557                                 {errMsg!=="" && <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>{errMsg}</p>}
    558                                     <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
    559                                   </form>) :
    560                               //THREAD CASE
    561                               (<form onSubmit={e => handleRelocate(e)}>
    562                                 <p style={{color:"black"}}>Внеси <span style={{fontWeight:"bold"}}>ID</span> на секцијата за дискусија (за <span style={{fontWeight:"bold"}}>предмет</span>)
    563                                   во која треба да биде преместено мислењето:</p>
    564                                 <div style={{marginTop:"15px"}}>
    565                                   <label>
    566                                     <ModalInput
    567                                         value={newTargetSubjectId}
    568                                         onChange={e => {e.preventDefault();setNewTargetSubjectId(e.target.value)}}
    569                                         id="newTargetSubjectId"
    570                                         spellCheck={false}
    571                                         style={{marginTop:"10px", marginBottom:"10px", width:"90px"}}
    572                                     />
    573                                     <button onClick={async (e) => {await handleNewTargetSubjectChange(e);}} style={{marginBottom:"10px", padding:"5px", fontFamily: "Roboto Mono, monospace"}}>Зачувај</button>
    574                                     {newTargetSubject!==null && !loadingSubj ? <p style={{color:"black", marginBottom:"20px", opacity:"50%"}}>Мислењето ќе се премести во секцијата за предметот со <span style={{fontWeight:"bold"}}>ID=
    575                                       {newTargetSubject.subjectId}</span> (<span style={{fontWeight:"bold"}}>{newTargetSubject.subjectName}</span>)</p> : loadingSubj ? <LoadingSpinner style={{marginBottom:"15px", marginTop:"15px"}}/> : null}
    576                                     {newTargetSubject && <p style={{color:"black", marginBottom:"10px"}}>Постави како дете на мислење со ID:</p>}
    577                                     {newTargetSubject &&
    578                                         <select value={newParentThreadId} onChange={e => setNewParentThreadId(e.target.value)} style={{width:"370px", display:"block", padding:"5px",marginBottom:"5px", fontFamily: "Roboto Mono, monospace"}}>
    579                                           <option value="-1">Постави како самостојно мислење (нова тема)</option>
    580                                           {newTargetSubject.threads.filter((thread)=>thread.postId!==reportForModal.post.postId).map((thread) => {
    581                                             return <option key={thread.postId} value={thread.postId}>{thread.postId}</option>})
    582                                           }
    583                                         </select>}
    584                                     {newParentThreadId==="-1" && loadedNewSubject &&
    585                                         <>
    586                                         <p style={{marginTop:"10px"}}>Наслов на нова тема:</p>
    587                                       <ModalInput
    588                                         value={newThreadTitle}
    589                                         onChange={e => setNewThreadTitle(e.target.value)}
    590                                         id="titleChangeRelocate"
    591                                         spellCheck={false}
    592                                         style={{marginTop:"10px"}}
    593                                     />
    594                                     </>}
    595                                     <br/>
    596                                     <input
    597                                         type="checkbox"
    598                                         defaultChecked={reportForModal.resolved}
    599                                         onChange={handleMarkResolved}
    600                                     />
    601                                     <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
    602                                   </label>
    603                                 </div>
    604                                 {errMsg!=="" && <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>{errMsg}</p>}
    605                                 <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
    606                               </form>))
    607                   : null
     405                          ("123")
     406                          : null
    608407              }
    609408                </ModalBody>
     
    613412    </>
    614413  ) : (
    615       <LoadingSpinner/>
     414    <>се вчитува...</>
    616415  );
    617416}
  • reactapp/src/api/axios.js

    r4abf55a re49d1b6  
    22
    33export default axios.create({
    4   baseURL: "http://192.168.0.29:8080",
     4  baseURL: "http://192.168.0.19:8080",
    55});
  • springapp/src/main/java/mk/profesori/springapp/Controller/PublicController.java

    r4abf55a re49d1b6  
    2525@RestController
    2626@RequestMapping("/public")
    27 @CrossOrigin(origins = { "http://192.168.0.29:3000", "http://192.168.0.28:3000" })
     27@CrossOrigin(origins = { "http://192.168.0.19:3000", "http://192.168.0.39:3000" })
    2828public class PublicController {
    2929
  • springapp/src/main/java/mk/profesori/springapp/Controller/SecureController.java

    r4abf55a re49d1b6  
    66import mk.profesori.springapp.Model.UserRole;
    77import mk.profesori.springapp.Service.CustomUserDetailsService;
    8 import mk.profesori.springapp.Service.DisallowedOperationException;
    9 import mk.profesori.springapp.Service.IncompatiblePostId;
    108import mk.profesori.springapp.Service.MainService;
    119import org.apache.tomcat.websocket.AuthenticationException;
     
    2018@RestController
    2119@RequestMapping("/secure")
    22 @CrossOrigin(origins = { "http://192.168.0.29:3000", "http://192.168.0.28:3000" })
     20@CrossOrigin(origins = { "http://192.168.0.19:3000", "http://192.168.0.39:3000" })
    2321public class SecureController {
    2422
     
    135133
    136134    @RequestMapping(value = "/updateOpinion/{postId}", method = RequestMethod.PUT)
    137     public String updateOpinion(@RequestBody ObjectNode objectNode, @PathVariable Long postId,
     135    public void updateOpinion(@RequestBody ObjectNode objectNode, @PathVariable Long postId,
    138136            @CurrentSecurityContext SecurityContext context) {
    139137        Authentication authentication = context.getAuthentication();
     
    142140            String newContent = objectNode.get("newContent").asText();
    143141            Long newTargetProfessorId = objectNode.get("newTargetProfessorId").asLong();
    144             Long newParentPostId = objectNode.get("newParentPostId").asLong();
    145             try {
    146                 mainService.updateOpinion(newContent, newTargetProfessorId, newParentPostId, postId);
    147             } catch (IncompatiblePostId | DisallowedOperationException e) {
    148                 return e.getMessage();
    149             }
    150         }
    151 
    152         return null;
     142            mainService.updateOpinion(newContent, newTargetProfessorId, postId);
     143        }
    153144    }
    154145
    155146    @RequestMapping(value = "/updateThread/{postId}", method = RequestMethod.PUT)
    156     public String updateThread(@RequestBody ObjectNode objectNode, @PathVariable Long postId,
     147    public void updateThread(@RequestBody ObjectNode objectNode, @PathVariable Long postId,
    157148            @CurrentSecurityContext SecurityContext context) {
    158149        Authentication authentication = context.getAuthentication();
     
    162153            String newContent = objectNode.get("newContent").asText();
    163154            Long newTargetSubjectId = objectNode.get("newTargetSubjectId").asLong();
    164             Long newParentThreadId = objectNode.get("newParentThreadId").asLong();
    165             try {
     155
     156            if (objectNode.has("newParentThreadId")) {
     157                Long newParentThreadId = objectNode.get("newParentThreadId").asLong();
    166158                mainService.update_Thread(newTitle, newContent, newTargetSubjectId, newParentThreadId, postId);
    167             } catch (IncompatiblePostId | DisallowedOperationException e) {
    168                 return e.getMessage();
     159            } else {
     160                mainService.update_Thread(newTitle, newContent, newTargetSubjectId, null, postId);
    169161            }
    170162        }
    171 
    172         return null;
    173163    }
    174164
     
    233223    }
    234224
    235     @RequestMapping(value = "/markReportResolved/{postReportId}/{action}", method = RequestMethod.GET)
     225    @RequestMapping(value = "/markReportResolved/{postReportId}/", method = RequestMethod.GET)
    236226    public void markReportResolved(@PathVariable Long postReportId, @PathVariable String action, @CurrentSecurityContext SecurityContext context) {
    237227        Authentication authentication = context.getAuthentication();
    238         if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetails currentUser &&
    239                 currentUser.getUserRole().equals(UserRole.MODERATOR)) {
     228        if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetails currentUser) {
    240229            mainService.markReport(postReportId, action);
    241230        }
  • springapp/src/main/java/mk/profesori/springapp/Security/SecurityConfiguration.java

    r4abf55a re49d1b6  
    3737            @Override
    3838            public void addCorsMappings(CorsRegistry registry) {
    39                 registry.addMapping("/**").allowedOrigins("http://192.168.0.29:3000", "http://192.168.0.28:3000")
     39                registry.addMapping("/**").allowedOrigins("http://192.168.0.19:3000", "http://192.168.0.39:3000")
    4040                        .allowCredentials(true);
    4141            }
  • springapp/src/main/java/mk/profesori/springapp/Service/MainService.java

    r4abf55a re49d1b6  
    141141    public void addThread(String title, String content, Long subjectId, CustomUserDetails currentUser) {
    142142        Subject targetSubject = subjectRepository.findBySubjectId(subjectId);
    143         String titleToSet = title.equals("") ? null : title;
    144 
    145         _Thread _threadToAdd = new _Thread(titleToSet, content, currentUser, null, null, null, targetSubject);
     143
     144        _Thread _threadToAdd = new _Thread(title, content, currentUser, null, null, null, targetSubject);
    146145        _threadRepository.save(_threadToAdd);
    147146    }
     
    200199    public void delete_Thread(Long postId) {_threadRepository.deleteById(postId);}
    201200
    202     public String updateOpinion(String newContent, Long newTargetProfessorId, Long newParentPostId, Long postId) {
     201    public void updateOpinion(String newContent, Long newTargetProfessorId, Long postId) {
    203202        Opinion opinionToUpdate = opinionRepository.findByPostId(postId);
    204203
     
    206205
    207206        Professor newTargetProfessor = professorRepository.findByProfessorId(newTargetProfessorId);
    208         opinionToUpdate.setTargetProfessor(newTargetProfessor);
    209 
    210         Opinion newParentOpinion = null;
    211         if (newParentPostId != -1) {
    212             newParentOpinion = opinionRepository.findByPostId(newParentPostId);
    213             if (!newParentOpinion.getTargetProfessor().equals(newTargetProfessor))
    214                 throw new IncompatiblePostId("Мислењето не припаѓа во специфицираната секција за дискусија.");
    215             if (opinionToUpdate.getChildren().contains(newParentOpinion))
    216                 throw new DisallowedOperationException("Мислењето не може да се постави како дете на негово дете (бесконечна рекурзија)");
    217         }
    218         opinionToUpdate.setParent(newParentOpinion);
    219 
     207        opinionToUpdate.setTargetProfessor(newTargetProfessor); //opcijava da ja dava samo kaj postovi so parentPost==null
    220208        for(Post p : opinionToUpdate.getChildren()) {
    221209            Opinion o = (Opinion) p;
     
    224212        opinionToUpdate.setTimeLastEdited(LocalDateTime.now());
    225213        opinionRepository.save(opinionToUpdate);
    226         return null;
    227     }
    228 
    229     public String update_Thread(String newTitle, String newContent, Long newTargetSubjectId, Long newParentThreadId, Long postId) {
     214    }
     215
     216    public void update_Thread(String newTitle, String newContent, Long newTargetSubjectId, Long newParentThreadId, Long postId) {
    230217        _Thread _threadToUpdate = _threadRepository.findByPostId(postId);
    231218
     
    235222        _threadToUpdate.setTargetSubject(newTargetSubject);
    236223
    237         _Thread newParentThread = null;
    238         if(newParentThreadId != -1) {
    239             newParentThread = _threadRepository.findByPostId(newParentThreadId);
    240             if (!newParentThread.getTargetSubject().equals(newTargetSubject))
    241                 throw new IncompatiblePostId("Мислењето не припаѓа во специфицираната секција за дискусија.");
    242             if (_threadToUpdate.getChildren().contains(newParentThread))
    243                 throw new DisallowedOperationException("Мислењето не може да се постави како дете на негово дете (бесконечна рекурзија)");
    244         }
    245         _threadToUpdate.setParent(newParentThread);
     224        if(newParentThreadId != null) { //samo ako e specificirano
     225            _Thread newParentThread = _threadRepository.findByPostId(newParentThreadId);
     226
     227            if (_threadToUpdate.getParent() == null || _threadToUpdate.getParent().getPostId().equals(postId)) {
     228                _threadToUpdate.setParent(newParentThread);
     229            }//samo ako e naslovniot post ili directChild
     230            } else if(_threadToUpdate.getParent() != null) {
     231            _threadToUpdate.setParent(null);
     232            }
    246233
    247234            if(_threadToUpdate.getParent() == null) {
    248235             _threadToUpdate.setTitle(newTitle);
    249236            } else {
    250                 _threadToUpdate.setTitle(null);
    251             }
     237             _threadToUpdate.setTitle(null);
     238             }
    252239
    253240         for(Post p : _threadToUpdate.getChildren()) {
     
    257244         _threadToUpdate.setTimeLastEdited(LocalDateTime.now());
    258245          _threadRepository.save(_threadToUpdate);
    259           return null;
    260246    }
    261247
     
    294280        if (action.equals("resolve")) report.setResolved(true);
    295281        else if (action.equals("open")) report.setResolved(false);
    296         postReportRepository.save(report);
    297282     }
    298283
  • springapp/src/main/java/mk/profesori/springapp/Service/RegistrationService.java

    r4abf55a re49d1b6  
    4545                String tokenToResend = customUserDetailsService
    4646                        .createToken(userRepository.findByEmail(request.getEmail()).get());
    47                 String link = "http://192.168.0.29:8080/registration/confirm?token=" + tokenToResend;
     47                String link = "http://192.168.0.19:8080/registration/confirm?token=" + tokenToResend;
    4848                emailSender.send(request.getEmail(), emailSender.buildEmail(request.getUsername(), link));
    4949                return tokenToResend;
     
    6666                        UserRole.REGULAR));
    6767
    68         String link = "http://192.168.0.29:8080/registration/confirm?token=" + token;
     68        String link = "http://192.168.0.19:8080/registration/confirm?token=" + token;
    6969
    7070        emailSender.send(request.getEmail(), emailSender.buildEmail(request.getUsername(), link));
  • springapp/src/main/resources/application.properties

    r4abf55a re49d1b6  
    1 spring.datasource.url=jdbc:postgresql://localhost:5432/profesorimk
     1spring.datasource.url=jdbc:postgresql://localhost:5432/profesori.mk
     2spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
    23spring.datasource.username=postgres
    3 spring.datasource.password=baz@228
     4spring.datasource.password=1win7337
    45spring.jpa.hibernate.ddl-auto=update
    56spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
    67spring.jpa.show-sql=false
    78spring.jpa.properties.hibernate.format_sql=true
    8 server.address=192.168.0.29
     9server.address=192.168.0.19
    910spring.mail.host=localhost
    1011spring.mail.username=mailuser
Note: See TracChangeset for help on using the changeset viewer.