From 03635942178f62e809b50e198639c47a3a55cf7d Mon Sep 17 00:00:00 2001 From: Frank Zhang <fz2907@vt.edu> Date: Thu, 24 Nov 2022 20:15:29 -0500 Subject: [PATCH] Comment basic feature is done, need more testing and some help UI --- .../controllers/AgreedRecordController.java | 18 +++ .../services/CommentRatingService.java | 20 +--- .../src/components/AgreedMatchPage.vue | 112 +++++++----------- .../src/services/AgreedMatchService.ts | 4 + 4 files changed, 66 insertions(+), 88 deletions(-) diff --git a/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/controllers/AgreedRecordController.java b/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/controllers/AgreedRecordController.java index b0677110..ad812f2a 100644 --- a/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/controllers/AgreedRecordController.java +++ b/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/controllers/AgreedRecordController.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; +import vt.CS5934.SwitchRoom.models.AgreedRecordModel; import vt.CS5934.SwitchRoom.models.ResponseModel; import vt.CS5934.SwitchRoom.services.CommentRatingService; @@ -53,4 +54,21 @@ public class AgreedRecordController { return responseModel; } } + + @PostMapping("/updateCommentItem") + public ResponseModel updateRecordCommentAndRating(@RequestBody AgreedRecordModel agreedRecordModel){ + ResponseModel responseModel = new ResponseModel(); + try{ + responseModel.setMessage("Success"); + responseModel.setStatus(HttpStatus.OK); + responseModel.setData(commentRatingService.saveNewCommentAndRating(agreedRecordModel)); + return responseModel; + }catch (Exception e){ + logger.error("Error in getWishlistList: "+e); + responseModel.setMessage("updateRecordCommentAndRating Failed, Reason: " + e); + responseModel.setStatus(HttpStatus.NOT_FOUND); + responseModel.setData(null); + return responseModel; + } + } } diff --git a/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/services/CommentRatingService.java b/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/services/CommentRatingService.java index e51593a5..e39e6a53 100644 --- a/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/services/CommentRatingService.java +++ b/BackendFolder/SwitchRoom/src/main/java/vt/CS5934/SwitchRoom/services/CommentRatingService.java @@ -35,23 +35,7 @@ public class CommentRatingService { } } - public void addCommentToHost(String comment, Long agreedRecordId){ - Optional<AgreedRecordModel> record = agreedRecordRepository.findById(agreedRecordId); - record.ifPresent(item -> item.setToOfferComment(comment)); - } - - public void addRatingToHost(int rating, Long agreedRecordId){ - Optional<AgreedRecordModel> record = agreedRecordRepository.findById(agreedRecordId); - record.ifPresent(item -> item.setToOfferStar(rating)); - } - - public void addCommentToVisitor(String comment, Long agreedRecordId){ - Optional<AgreedRecordModel> record = agreedRecordRepository.findById(agreedRecordId); - record.ifPresent(item -> item.setToVisitorComment(comment)); - } - - public void addRatingToVisitor(int rating, Long agreedRecordId){ - Optional<AgreedRecordModel> record = agreedRecordRepository.findById(agreedRecordId); - record.ifPresent(item -> item.setToVisitorStar(rating)); + public AgreedRecordModel saveNewCommentAndRating(AgreedRecordModel agreedRecordModel){ + return agreedRecordRepository.save(agreedRecordModel); } } diff --git a/FrontendFolder/switch-room/src/components/AgreedMatchPage.vue b/FrontendFolder/switch-room/src/components/AgreedMatchPage.vue index 02debb66..3f7f17e9 100644 --- a/FrontendFolder/switch-room/src/components/AgreedMatchPage.vue +++ b/FrontendFolder/switch-room/src/components/AgreedMatchPage.vue @@ -27,7 +27,8 @@ </el-aside> <el-main> <!-- This is the main body part --> - <el-card shadow="never" class="main-card"> + <el-empty v-if="sideList.value.length===0" /> + <el-card shadow="never" class="main-card" v-if="sideList.value.length>0"> <span>{{displayPage}} Matched Record Detail</span> <el-form ref="ruleFormRef" @@ -89,12 +90,17 @@ v-model="agreedRecord.toVisitorStar" :texts="['oops', 'disappointed', 'normal', 'good', 'great']" show-text + :disabled="buttonState === 'edit'" /> </el-form-item> <el-form-item label="Leave Comment:" prop="toVisitorComment" v-if="!agreedRecord.onGoing && displayPage==='Offer'"> - + <el-input + v-model="agreedRecord.toVisitorComment" + type="textarea" + :readonly="buttonState === 'edit'" + /> </el-form-item> <el-form-item label="Rate Your Host:" prop="toOfferStar" @@ -103,12 +109,17 @@ v-model="agreedRecord.toOfferStar" :texts="['oops', 'disappointed', 'normal', 'good', 'great']" show-text + :disabled="buttonState === 'edit'" /> </el-form-item> <el-form-item label="Leave Comment:" prop="toOfferComment" v-if="!agreedRecord.onGoing && displayPage==='Wishlist'" > - + <el-input + v-model="agreedRecord.toOfferComment" + type="textarea" + :readonly="buttonState === 'edit'" + /> </el-form-item> @@ -133,11 +144,16 @@ import * as AgreedRecordService from "@/services/AgreedMatchService"; import type { FormInstance, FormRules } from "element-plus"; import { USA_STATE_INITAL_LIST } from "@/services/Constans"; +const ruleFormRef = ref<FormInstance>(); let displayPage = ref(""); const sideList = reactive({value:[]}); const agreedRecord = ref(new AgreedRecordModel()); const buttonState = ref("edit"); +onMounted(() => { + handleTabClick(0); +}) + const selectItem = (listIdx:number) => { agreedRecord.value = sideList.value[listIdx]; console.log("You selected index: " + listIdx+" , and data is: ", agreedRecord.value) @@ -156,10 +172,12 @@ const clickOnOfferTab = async() =>{ displayPage.value = "Offer"; await AgreedRecordService.getAgreedOfferRecord().then((response)=>{ console.log("Receiving offer records from backend: ", response); - if(response["data"]!== null){ + if(response["data"]!== null && response["data"].length > 0){ sideList.value = response["data"]; + selectItem(0); }else{ - // TODO: display empty page + agreedRecord.value = new AgreedRecordModel(); + sideList.value = []; } }) } @@ -168,41 +186,16 @@ const clickOnWishlistTab = async() =>{ // Load agreed Wishlist from backend displayPage.value = "Wishlist"; - // remove it when done - let testData = { - "message": "Success", - "status": "OK", - "data": [ - { - "id": 1, - "stateCityCode": 1, - "state": "VA", - "city": "Chantilly", - "wishlistId": 1, - "wishlistUserId": 1, - "offerId": 2, - "startTime": "2022-11-07T04:56:25.000+00:00", - "endTime": "2022-11-11T04:55:50.000+00:00", - "toOfferStar": 5, - "toVisitorStar": 5, - "toOfferComment": null, - "toVisitorComment": null, - "onGoing": true - } - ] + await AgreedRecordService.getAgreedWishlistRecord().then((response)=>{ + console.log("Receiving wishlist records from backend: ", response); + if(response["data"]!== null && response["data"].length > 0){ + sideList.value = response["data"]; + selectItem(0); + }else{ + sideList.value = []; + agreedRecord.value = new AgreedRecordModel(); } - - sideList.value = testData.data - - - // await AgreedRecordService.getAgreedWishlistRecord().then((response)=>{ - // console.log("Receiving wishlist records from backend: ", response); - // if(response["data"]!== null){ - // sideList.value = response["data"]; - // }else{ - // // TODO: display empty page - // } - // }) + }) } const formatDate = (dateString: string) => { @@ -211,44 +204,23 @@ const formatDate = (dateString: string) => { } const rules = reactive<FormRules>({ - cityName: [ + toVisitorComment: [ { - required: true, - message: "Please give which city you want to visit.", + required: false, + message: "Please share your experience of the visitor.", trigger: "blur", }, - { min: 0, max: 20, message: "Length should be 0 to 20", trigger: "blur" }, + { min: 0, max: 500, message: "Length should be 0 to 500", trigger: "blur" }, ], - zipCode:[ + toOfferComment: [ { - required: true, - message: "Please give the stat of the city located.", + required: false, + message: "Please share your experience of this visit.", trigger: "blur", }, + { min: 0, max: 500, message: "Length should be 0 to 500", trigger: "blur" }, ], - state: [ - { - required: true, - message: "Please give the stat of the city located.", - trigger: "blur", - }, - ], - startTime: [ - { - type: "date", - required: true, - message: "Please pick a date", - trigger: "change", - }, - ], - endTime: [ - { - type: "date", - required: true, - message: "Please pick a time", - trigger: "change", - }, - ], + }); const onEdit = () =>{ @@ -260,7 +232,7 @@ const updateForm = async (formEl: FormInstance | undefined) =>{ await formEl.validate((valid, fields) => { if (valid) { AgreedRecordService.updateRatingInformation( agreedRecord.value).then((response)=>{ - console.log("Receiving wishlist item data", response); + console.log("Receiving updateRatingInformation item data", response); if(response["data"] === null){ // TODO: create failed, handle it later }else{ diff --git a/FrontendFolder/switch-room/src/services/AgreedMatchService.ts b/FrontendFolder/switch-room/src/services/AgreedMatchService.ts index 4008e5e3..c605533f 100644 --- a/FrontendFolder/switch-room/src/services/AgreedMatchService.ts +++ b/FrontendFolder/switch-room/src/services/AgreedMatchService.ts @@ -1,4 +1,5 @@ import * as serverHttpService from "./ServerHttpService"; +import {AgreedRecordModel} from "@/models/AgreedRecordModel"; const baseUrl = "agreedRecord"; @@ -10,3 +11,6 @@ export function getAgreedWishlistRecord() { const urlPath = "/wishlist"; return serverHttpService.Get(baseUrl + urlPath); } +export function updateRatingInformation(agreedRecord: AgreedRecordModel) { + return serverHttpService.Post(baseUrl + "/updateCommentItem", agreedRecord); +} \ No newline at end of file -- GitLab