From 50ed581635a4eb5dd8fa93cc796b298d7bc0ac7e Mon Sep 17 00:00:00 2001 From: Mila <Mila@pollex.com.tw> Date: 星期三, 05 一月 2022 17:00:37 +0800 Subject: [PATCH] fixed TODO#133096 推薦顧問按鈕icon樣式更新 --- PAMapp/components/Client/ClientCard.vue | 267 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 191 insertions(+), 76 deletions(-) diff --git a/PAMapp/components/Client/ClientCard.vue b/PAMapp/components/Client/ClientCard.vue index 44a5316..25c5423 100644 --- a/PAMapp/components/Client/ClientCard.vue +++ b/PAMapp/components/Client/ClientCard.vue @@ -2,9 +2,10 @@ <div> <el-row type="flex" + ref="clientCardRef" class="rowStyle cursor--pointer" justify="space-between" - :class="{'new': !isView && isReserved}" + :class="{'new': newAppointment }" @click.native="openDetail" > <el-col :xs="1" :sm="1" class="unread" align="middle" v-if="isReserved"> @@ -13,10 +14,10 @@ <el-col :xs="5" :sm="3" align="middle"> <el-avatar :size="50" - src="" ></el-avatar> - <div class="satisfaction"> + <div class="satisfaction" v-if="!hideReviews"> <template v-if="client.satisfactionScore"> + TODO:���遛��漲 <i class="icon-star pam-icon icon--yellow satisfaction"></i> <span>{{client.satisfactionScore}}</span> </template> @@ -26,8 +27,8 @@ </div> </el-col> <el-col :xs="14" :sm="14" class="pl-10"> - <div class="smTxt_bold name">{{client.name}}</div> - <div class="message">������</div> + <div class="smTxt_bold name">{{ client.name }}</div> + <div class="my-10">������</div> <div class="professionals"> <template v-if="client.requirement"> <span @@ -46,31 +47,31 @@ <div class="smTxt_bold fix-chrome-click--issue" :class="{'unread-txt': reservedTxt === '�霈�', 'read-txt': reservedTxt !== '�霈�'}" - >{{reservedTxt}}</div> + >{{ reservedTxt }}</div> <div class="date xsTxt text--mid_grey" - >{{date}}</div> + >{{ date }}</div> <div class="xsTxt text--mid_grey" - >{{time}}</div> + >{{ time }}</div> </el-col> </el-row> <Ui-Dialog :isVisible.sync="isVisibleDialog" - :width="width" - @closeDialog="close" + :width="dialogWidth" + @closeDialog="closeDialog" class="pam-myDemand-dialog" > <h5 class="subTitle text--center mb-30" >{{isReserved ? '������' : '撌脰蝯∟���'}}</h5> <p v-if='isReserved' - class="smTxt text-right" + class="smTxt text--right" ><span v-if="isRead">{{client.consultantReadTime | formatDate}}</span> 撌脰�</p> <p v-if="!isReserved" - class="smTxt text-right" + class="smTxt text--right" >{{client.contactTime | formatDate}} �蝯�</p> <p class="smTxt">{{client.appointmentDate | formatDate}} ����</p> @@ -85,19 +86,52 @@ <p v-for="(item, index) in hopeContactTime" :key="index" >��蝯⊥�挾{{index + 1 | formatNumber}}嚗�<span>{{ item | formatHopeContactTime}}</span></p> + </div> + <div class="mt-30"> + <div class="memoTitleStyle"> + <div class="mdTxt">�摰寞�膩</div> + <div + class="smTxt text--bold text--primary cursor--pointer text--underline edit" + @click='editMemo' + >蝺刻摩</div> </div> - <div class="mt-30 text--center" v-if="isReserved"> - <el-button @click="markAppointment">璅酉�撌脤��蝯�</el-button> + + <el-input + class="mt-10 pam-appointment-textarea" + type="textarea" + :rows="3" + maxlength="100" + placeholder="隢撓�嚗��100摮��" + :disabled="!isEdit" + v-model="memo" + > + </el-input> + + <div class="mt-10 smTxt text--bold text--primary text--right fixed-Height"> + <template v-if="isEdit"> + <span class="cursor--pointer" @click="cancelEditMemo">����</span> + <span class="pl-20 cursor--pointer" @click="saveMemo">�摮�</span> + </template> </div> + </div> + <div class="mt-30 text--center" v-if="isReserved"> + <el-button @click="markAppointment">璅酉�撌脤��蝯�</el-button> + </div> </Ui-Dialog> </div> </template> <script lang="ts"> -import { Vue, Component, Prop, Action } from 'nuxt-property-decorator'; -import { isMobileDevice } from '~/assets/ts/device'; -import { ClientInfo, markAsContact, recordRead } from '~/assets/ts/api/appointment'; +import { Vue, Component, Prop, Action, namespace, Watch } from 'nuxt-property-decorator'; +import appointmentService from '~/shared/services/appointment.service'; +import UtilsService from '~/shared/services/utils.service'; +import { hideReviews } from '~/shared/const/hide-reviews'; +import { AppointmentMemoInfo, ClientInfo } from '~/shared/models/client.model'; +import myConsultantService from '~/shared/services/my-consultant.service'; +import { ElRow } from 'element-ui/types/row'; + +const localStorage = namespace('localStorage'); @Component({ filters: { formatNumber(index: number) { @@ -118,12 +152,58 @@ } }) export default class ClientList extends Vue { - @Action updateMyAppointment!: (data: ClientInfo) => void - @Action storeConsultantList!: () => void; + @Action + updateMyAppointment!: (data: ClientInfo) => void; - @Prop() client!: ClientInfo; + @Prop() + client!: ClientInfo; + + @localStorage.Mutation + storageClearAppointmentIdFromMsg!: () => void; + isVisibleDialog = false; - width = ''; + dialogWidth = ''; + hideReviews = hideReviews; + + isEdit = false; + memoInfo: AppointmentMemoInfo = { + appointmentId: 0, + content: '', + id: 0 + } + memo = ''; + + ////////////////////////////////////////////////////////////////////// + + @Watch('$route', {immediate: true}) + onRouteChange() { + const appointmentIdFromMsg = this.$route.query.appointmentId; + if (appointmentIdFromMsg && +appointmentIdFromMsg === this.client.id) { + this.openDetail(); + } + } + + ////////////////////////////////////////////////////////////////////// + + mounted() { + this.memoInfo = this.client.appointmentMemoList.length > 0 + ? JSON.parse(JSON.stringify(this.client.appointmentMemoList[0])) + : {appointmentId: 0, content: '', id: 0}; + this.memo = this.memoInfo.content; + } + + get newAppointment(): boolean { + return !this.client.consultantViewTime + && this.client.communicateStatus === 'reserved'; + } + + get isReserved() { + return this.client.communicateStatus === 'reserved'; + } + + get isRead() { + return !!this.client.consultantReadTime; + } get requirements() { return this.client.requirement.split(','); @@ -133,7 +213,7 @@ if (this.client.gender) { return this.client.gender === 'male' ? '���' : '憟單��'; } - return '' + return ''; } get hopeContactTime() { @@ -141,19 +221,7 @@ return contactList.filter(item => !!item && item !== ",") } - get isReserved() { - return this.client.communicateStatus === 'reserved'; - } - - get isRead() { - return !!this.client.consultantReadTime; - } - - get isView() { - return !!this.client.consultantViewTime; - } - - get reservedTxt() { + get reservedTxt(): string { if (this.isReserved) { return this.client.consultantReadTime ? '撌脰�' : '�霈�'; } else { @@ -161,52 +229,104 @@ } } - get latestUpdateTime() { + get displayTime(): string { if (this.isReserved) { - return this.client.consultantReadTime ? this.client.consultantReadTime : this.client.appointmentDate; + return this.client.appointmentDate; } else { - return this.client.contactTime; + return this.client.lastModifiedDate; } } get time() { - const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); + const formatDate = (this.$options.filters as any).formatDate(this.displayTime); return formatDate.split(' ')[1] } get date() { - const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); + const formatDate = (this.$options.filters as any).formatDate(this.displayTime); return formatDate.split(' ')[0]; } openDetail() { - this.width = isMobileDevice() ? '80%' : ''; + setTimeout(() => { + (this.$refs.clientCardRef as any).$el.classList.add('currentShowStyle'); + }, 0) + this.dialogWidth = UtilsService.isMobileDevice() ? '80%' : ''; this.isVisibleDialog = true; } markAppointment() { - markAsContact(this.client.id).then(data => { - // TODO: 閬敺����� updated client 鞈�� - Ben 2021/11/16 - - const updatedClient = {...this.client}; - updatedClient.communicateStatus = 'contacted'; - updatedClient.contactTime = new Date(); - - this.updateMyAppointment(updatedClient); + myConsultantService.markAsContact(this.client.id).then(data => { + this.updateMyAppointment(data); this.isVisibleDialog = false; - }) } - close() { - if (!this.client.consultantReadTime) { - recordRead(this.client.id).then(res => { + closeDialog(): void { + const unread = !this.client.consultantReadTime; + if (unread) { + appointmentService.recordRead(this.client.id).then((_) => { const updatedClient = {...this.client}; - updatedClient.consultantReadTime = new Date(); - + updatedClient.consultantReadTime = new Date().toString(); this.updateMyAppointment(updatedClient); }); + }; + this.isEdit = false; + this.clearAppointmentIdFromMsg(); + } + + private clearAppointmentIdFromMsg() { + this.storageClearAppointmentIdFromMsg(); + this.$router.push({query: {}}); + setTimeout(() => { + (this.$refs.clientCardRef as ElRow).$el.classList.remove('currentShowStyle') + },1000) + } + + saveMemo() { + if (this.client.appointmentMemoList.length > 0) { + const params = { + content: this.memo, + id: this.client.appointmentMemoList[0].id + }; + this.updateMemo(params); + return; } + + const params = { + content: this.memo, + appointmentId: this.client.id, + } + this.createMemo(params); + } + + private createMemo(params) { + appointmentService.createMemo(params).then(memoRes => { + this.storeMemo(memoRes); + }); + } + + private updateMemo(params) { + appointmentService.updateMemo(params).then(memoRes => { + this.storeMemo(memoRes); + }); + } + + private storeMemo(memoRes) { + this.memoInfo = memoRes; + this.memo = this.memoInfo.content; + this.client.appointmentMemoList[0] = this.memoInfo; + this.isEdit = false; + } + + editMemo() { + this.isEdit = !this.isEdit; + this.memo = this.memoInfo.content; + } + + cancelEditMemo() { + this.isEdit = false; + this.memo = this.memoInfo.content; } } @@ -219,14 +339,16 @@ margin-bottom: 10px; display: flex; justify-content: space-between; - + transition: background-color 0.5s; &.new { border-left: solid 4px $YELLOW; } - + &.currentShowStyle { + background-color: rgba(236, 195, 178, 0.5); + transition: background-color 0.5s; + } .unread { align-self: center; - .circle { width: 10px; height: 10px; @@ -235,72 +357,65 @@ margin: auto; } } - .satisfaction { font-size: 12px; font-weight: bold; margin-top: 5px; - .unfilled { font-weight: lighter; color: $MID_GREY; } } - - .message { - margin:10px 0; - } - .professionals { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - .professionalsTxt { font-size: 12px; font-weight: bold; margin-right: 5px; } - .noProfessionalsTxt { color: $PRUDENTIAL_GREY; font-weight: lighter; } } - .contactInfo { text-align: right; .date { font-size: 12px; } } - .unread-txt { @extend .text--primary; } - .read-txt { color: $SKY_BLUE; } - } - .flex-column { display: flex; flex-direction: column; justify-content: space-between; } - .dialogTxt { font-size: 20px; overflow-y:scroll; - max-height: 45vh; + max-height: 25vh; @include desktop { height: 400px; } } + .memoTitleStyle { + display: flex; + flex-direction: row; + justify-content: space-between; - .text-right { - text-align: right; + .edit { + align-self: flex-end; + } + } + .fixed-Height { + height: 16px; } </style> -- Gitblit v1.8.0