| 165 | == Коментирање туѓо мислење (6) |
| 166 | Имплементирана е и функционалноста за додавање реплики на мислења. Подолу се прикажани главните отсечоци од код каде се имплементирани чекорите кои ги презема системот при тригер на сценариото, односно: \\\\ |
| 167 | **1.** Javascript апликацијата јавува modal со единствено поле за содржина на коментарот // |
| 168 | **2.** Javascript апликацијата проверува дали полето е празно (ако е, не испраќа повик и рендерира порака за грешка), а потоа испраќа барање (кое во телото содржи ИД на засегнатото мислење и содржина на коментарот) до одредена патека на која реагира контролерот. Тој потоа повикува соодветен метод од сервисната логика, што резултира со зачувување на диск нова торка во релацијата за мислења (Post) со атрибут ИД на родител-мислење еднаков на ИД-то добиено во payload-от на барањето. // |
| 169 | **3.** По добивање на одговорот, JS апликацијата го освежува прелистувачот, значи се прикажува истата страница за дискусија, но во одговорот на fetch повикот за мислењата кои и припаѓаат сега ќе се најде и новододадената реплика |
| 170 | |
| 171 | {{{#!div style="font-size: 80%" |
| 172 | [[https://develop.finki.ukim.mk/projects/profesori.mk/browser/reactapp/src/Components/OpinionTree.js?rev=ebc51762bbd1b4345d8908789af87bdc49aad058|Components/OpinionTree.js, ревизија ebc5176]] |
| 173 | {{{#!javascript |
| 174 | const handleReply = (opinion) => { |
| 175 | if (auth) { |
| 176 | setReplyModalDisplay("block"); |
| 177 | setPostForModal(opinion); |
| 178 | } else { |
| 179 | navigate("/login"); |
| 180 | } |
| 181 | }; |
| 182 | |
| 183 | const handleModalCloseClick = () => { |
| 184 | setReplyModalDisplay("none"); |
| 185 | }; |
| 186 | |
| 187 | const handleContentChange = (e) => { |
| 188 | setReplyContent(e.target.value); |
| 189 | }; |
| 190 | |
| 191 | const handleReplySubmit = async (e, postId) => { |
| 192 | e.preventDefault(); |
| 193 | |
| 194 | const response = await axios( |
| 195 | `http://192.168.0.17:8080/secure/professor/${professor.professorId}/replyToOpinion/${postId}`, |
| 196 | { |
| 197 | method: "post", |
| 198 | data: { |
| 199 | content: replyContent, |
| 200 | }, |
| 201 | withCredentials: true, |
| 202 | } |
| 203 | ); |
| 204 | |
| 205 | window.location.reload(false); |
| 206 | }; |
| 207 | }}} |
| 208 | }}} |
| 209 | |
| 210 | {{{#!div style="font-size: 80%" |
| 211 | [[https://develop.finki.ukim.mk/projects/profesori.mk/browser/springapp/src/main/java/mk/profesori/springapp/Service/MainService.java?rev=ebc51762bbd1b4345d8908789af87bdc49aad058|Service.MainService.java, ревизија ebc5176]] |
| 212 | {{{#!java |
| 213 | public void replyToOpinion(String content, Long professorId, Long postId, CustomUserDetails currentUser) { |
| 214 | |
| 215 | Professor targetProfessor = professorRepository.findByProfessorId(professorId); |
| 216 | Opinion targetOpinion = opinionRepository.findByPostId(postId); |
| 217 | |
| 218 | Opinion opinionToAdd = new Opinion(null, content, currentUser, null, null, |
| 219 | targetOpinion, null, targetProfessor); |
| 220 | opinionRepository.save(opinionToAdd); |
| 221 | |
| 222 | targetOpinion.getChildren().add(opinionToAdd); |
| 223 | opinionRepository.save(targetOpinion); |
| 224 | } |
| 225 | }}} |
| 226 | }}} |
| 227 | |