From 68e499e5eed17a2b1d2e47ee1790e16f001552f7 Mon Sep 17 00:00:00 2001 From: Mila <Mila@pollex.com.tw> Date: 星期三, 22 十二月 2021 16:21:28 +0800 Subject: [PATCH] Merge branch 'master' of https://192.168.0.10:8443/r/pcalife/PAM --- PAMapp/components/Client/ClientCard.vue | 205 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 153 insertions(+), 52 deletions(-) diff --git a/PAMapp/components/Client/ClientCard.vue b/PAMapp/components/Client/ClientCard.vue index 1fffe7c..e3548a1 100644 --- a/PAMapp/components/Client/ClientCard.vue +++ b/PAMapp/components/Client/ClientCard.vue @@ -1,19 +1,32 @@ <template> <div> - <el-row type="flex" class="rowStyle" @click.native="openDetail"> - <el-col :xs="5" :sm="3"> + <el-row + type="flex" + class="rowStyle cursor--pointer" + justify="space-between" + :class="{'new': newAppointment }" + @click.native="openDetail" + > + <el-col :xs="1" :sm="1" class="unread" align="middle" v-if="isReserved"> + <div class="circle" v-if="!isRead"></div> + </el-col> + <el-col :xs="5" :sm="3" align="middle"> <el-avatar :size="50" - src="" - class="cursor--pointer fix-chrome-click--issue" ></el-avatar> - <!-- <div class="satisfaction"> - <i class="icon-star pam-icon icon--yellow satisfaction"></i> - <span>{{'1'}}</span> - </div> --> + <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> + <template v-else> + <div class="unfilled">�憛急遛��漲</div> + </template> + </div> </el-col> - <el-col :xs="14" :sm="15"> - <div class="smTxt_bold name">{{client.name}}</div> + <el-col :xs="14" :sm="14" class="pl-10"> + <div class="smTxt_bold name">{{ client.name }}</div> <div class="message">������</div> <div class="professionals"> <template v-if="client.requirement"> @@ -29,33 +42,49 @@ </template> </div> </el-col> - <el-col class="flex-column contactInfo" :xs="5" :sm="6"> - <div class="smTxt_bold cursor--pointer fix-chrome-click--issue" - :class="client.communicateStatus" - >{{isReserved ? '撌脤���' : '撌脰蝯�'}} - </div> - <div class="date xsTxt text--mid_grey">{{date}}</div> - <div class="xsTxt text--mid_grey">{{time}}</div> + <el-col class="flex-column contactInfo" :xs="4" :sm="6"> + <div + class="smTxt_bold fix-chrome-click--issue" + :class="{'unread-txt': reservedTxt === '�霈�', 'read-txt': reservedTxt !== '�霈�'}" + >{{ reservedTxt }}</div> + <div + class="date xsTxt text--mid_grey" + >{{ date }}</div> + <div + class="xsTxt text--mid_grey" + >{{ time }}</div> </el-col> </el-row> <Ui-Dialog :isVisible.sync="isVisibleDialog" - :width="width" + :width="dialogWidth" + @closeDialog="closeDialog" class="pam-myDemand-dialog" > <h5 class="subTitle text--center mb-30" - >{{isReserved ? '������' : '撌脰蝯∟���'}}</h5> - <p class="smTxt text-right">{{client.appointmentDate | formatDate}}</p> + >{{isReserved ? '������' : '撌脰蝯∟���'}}</h5> + + <p v-if='isReserved' + class="smTxt text-right" + ><span v-if="isRead">{{client.consultantReadTime | formatDate}}</span> 撌脰�</p> + <p + v-if="!isReserved" + class="smTxt text-right" + >{{client.contactTime | formatDate}} �蝯�</p> + <p class="smTxt">{{client.appointmentDate | formatDate}} ����</p> + <div class="dialogTxt"> - <p>憪��{client.name}}</p> - <p>�閰梧�{client.phone}}</p> - <p>Email嚗{client.email}}</p> - <p>�批嚗{gender}}</p> - <p>撟湧翩嚗{client.age}}</p> - <p>�璆哨�{client.job}}</p> - <p>��瘙�{client.requirement.split(',').join('��')}}</p> - <p v-for="(item, index) in hopeContactTime" :key="index">��蝯⊥�挾{{index + 1 | formatNumber}}嚗{ item | formatHopeContactTime}}</p> + <p>憪���<span>{{client.name}}</span></p> + <p>�閰梧��<span>{{client.phone}}</span></p> + <p>Email嚗�<span>{{client.email}}</span></p> + <p>�批嚗�<span>{{gender}}</span></p> + <p>撟湧翩嚗�<span>{{client.age | toAgeLabel }}</span></p> + <p>�璆哨��<span>{{client.job}}</span></p> + <p>��瘙��<span>{{client.requirement.split(',').join('��')}}</span></p> + <p v-for="(item, index) in hopeContactTime" + :key="index" + >��蝯⊥�挾{{index + 1 | formatNumber}}嚗�<span>{{ item | formatHopeContactTime}}</span></p> </div> <div class="mt-30 text--center" v-if="isReserved"> <el-button @click="markAppointment">璅酉�撌脤��蝯�</el-button> @@ -65,9 +94,14 @@ </template> <script lang="ts"> -import { Vue, Component, Prop, Mutation, Action } from 'nuxt-property-decorator'; -import { isMobileDevice } from '~/assets/ts/device'; -import { ClientInfo, markAsContact } from '~/assets/ts/api/appointment'; +import { Vue, Component, Prop, Action } 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 { ClientInfo } from '~/shared/models/client.model'; +import myConsultantService from '~/shared/services/my-consultant.service'; + @Component({ filters: { @@ -89,11 +123,33 @@ } }) export default class ClientList extends Vue { - @Action updateMyAppointment!: (data: ClientInfo) => void + @Action + updateMyAppointment!: (data: ClientInfo) => void - @Prop() client!: ClientInfo; + @Action + storeConsultantList!: () => void; + + @Prop() + client!: ClientInfo; + isVisibleDialog = false; - width = ''; + dialogWidth = ''; + hideReviews = hideReviews; + + ////////////////////////////////////////////////////////////////////// + + 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(','); @@ -103,7 +159,7 @@ if (this.client.gender) { return this.client.gender === 'male' ? '���' : '憟單��'; } - return '' + return ''; } get hopeContactTime() { @@ -111,37 +167,58 @@ return contactList.filter(item => !!item && item !== ",") } + get reservedTxt(): string { + if (this.isReserved) { + return this.client.consultantReadTime ? '撌脰�' : '�霈�'; + } else { + return '撌脰蝯�' + } + } + + get latestUpdateTime() { + if (this.isReserved) { + return this.client.consultantReadTime ? this.client.consultantReadTime : this.client.appointmentDate; + } else { + return this.client.contactTime; + } + } + get time() { - const formatDate = (this.$options.filters as any).formatDate(this.client.appointmentDate); + const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); return formatDate.split(' ')[1] } get date() { - const formatDate = (this.$options.filters as any).formatDate(this.client.appointmentDate); - return formatDate.split(' ')[0] - } - - get isReserved() { - return this.client.communicateStatus === 'reserved'; + const formatDate = (this.$options.filters as any).formatDate(this.latestUpdateTime); + return formatDate.split(' ')[0]; } openDetail() { - this.width = isMobileDevice() ? '80%' : ''; + this.dialogWidth = UtilsService.isMobileDevice() ? '80%' : ''; this.isVisibleDialog = true; } markAppointment() { - markAsContact(this.client.id).then(data => { + myConsultantService.markAsContact(this.client.id).then(data => { // TODO: 閬敺����� updated client 鞈�� - Ben 2021/11/16 - const updatedClient = {...this.client}; updatedClient.communicateStatus = 'contacted'; - updatedClient.appointmentDate = new Date(); + updatedClient.contactTime = new Date().toString(); this.updateMyAppointment(updatedClient); this.isVisibleDialog = false; - }) + } + + closeDialog(): void { + const unread = !this.client.consultantReadTime; + if (unread) { + appointmentService.recordRead(this.client.id).then((_) => { + const updatedClient = {...this.client}; + updatedClient.consultantReadTime = new Date().toString(); + this.updateMyAppointment(updatedClient); + }); + } } } @@ -149,16 +226,37 @@ <style lang="scss" scoped> .rowStyle { - padding: 10px; + padding: 10px 15px 10px 5px; background-color: $PRIMARY_WHITE; margin-bottom: 10px; display: flex; justify-content: space-between; + &.new { + border-left: solid 4px $YELLOW; + } + + .unread { + align-self: center; + + .circle { + width: 10px; + height: 10px; + border-radius: 50px; + background-color: $PRIMARY_RED; + margin: auto; + } + } + .satisfaction { font-size: 12px; font-weight: bold; margin-top: 5px; + + .unfilled { + font-weight: lighter; + color: $MID_GREY; + } } .message { @@ -189,13 +287,14 @@ } } - .reserved { + .unread-txt { @extend .text--primary; } - .contacted { + .read-txt { color: $SKY_BLUE; } + } .flex-column { @@ -207,9 +306,11 @@ .dialogTxt { font-size: 20px; overflow-y:scroll; - height:400px; + max-height: 45vh; + @include desktop { + height: 400px; + } } - .text-right { text-align: right; -- Gitblit v1.8.0