From ae4db5435180c44b37f521c463b17f2023ac1d8c Mon Sep 17 00:00:00 2001 From: wayne <wayne8692wayne8692@gmail.com> Date: 星期五, 18 二月 2022 09:25:50 +0800 Subject: [PATCH] [update] 若顧問停用時,將無法登入 (文案待確認) --- PAMapp/pages/appointment/_appointmentId/index.vue | 222 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 189 insertions(+), 33 deletions(-) diff --git a/PAMapp/pages/appointment/_appointmentId/index.vue b/PAMapp/pages/appointment/_appointmentId/index.vue index 7261a18..ec303f0 100644 --- a/PAMapp/pages/appointment/_appointmentId/index.vue +++ b/PAMapp/pages/appointment/_appointmentId/index.vue @@ -1,81 +1,177 @@ <template> <div class="appointment-client-detail-page"> <div class="date-detail"> - <!-- TODO: 閬����� step 憿舐內銝�� Date [Tomas, 2022/1/11] --> - <div>{{ appointmentDetail.appointmentDate }}</div> - <div>{{ appointmentDetail.consultantReadTime }}</div> + <div>{{ appointmentDetail.appointmentDate | formatDate }}����</div> + <div>{{ appointmentDetail.consultantReadTime | formatDate }} + <span v-if="appointmentDetail.consultantReadTime">撌脰�</span> + </div> </div> + <AppointmentProgress - :currentStep="appointmentDetail.communicateStatus" + class="mt-10" + :currentStep="appointmentProgress" ></AppointmentProgress> <section class="client-detail"> - <div class="client-detail-info"> + <div class="client-detail-info mb-30"> <div class="client-detail-info__avatar"> <div class="circle"> - {{ appointmentDetail.name }} - <div class="sm-circle"> - {{ appointmentDetail.gender === 'male' ? '�' : '憟�'}} + {{ appointmentDetail.name || 'NO NAME' }} + <div class="sm-circle sm-circle-male" v-if="appointmentDetail.gender === 'male'"> + <i class="icon-sex-male sex-icon"></i> + </div> + <div class="sm-circle sm-circle-female" v-if="appointmentDetail.gender === 'female'"> + <i class="icon-sex-female sex-icon"></i> </div> </div> </div> <div class="client-detail-info__information"> - <div>{{ appointmentDetail.age }}甇�</div> + <div>{{ appointmentDetail.age | toAgeLabel }}</div> <div>{{ appointmentDetail.phone }}</div> - <div class="text--underline">{{ appointmentDetail.email }}</div> + <div class="text--underline text--break-all"> + {{ appointmentDetail.email }} + </div> </div> </div> <div class="client-detail-demand mt-10"> - <div class="client-detail-demand__demand-list"> + + <div class="client-detail-demand__demand-list mb-10"> <div class="client-detail-demand__demand-list-label">��瘙�</div> - <div>{{ appointmentDetail.requirement }}</div> + <div class="client-detail-demand__demand-list-content">{{ appointmentDetail.requirement }}</div> </div> - <div class="client-detail-demand__hope-contact-time"> + + <div class="client-detail-demand__demand-list"> <div class="client-detail-demand__demand-list-label">�蝯�<br />��挾</div> - <div>{{ appointmentDetail.hopeContactTime }}</div> + <div class="client-detail-demand__demand-list-content"> + <div v-for="(hopeContactTime, index) in hopeContactTimeList" :key="index" + :class="{'mt-10': index > 0, 'pb-10': true, 'hope-contact-time__line': index + 1 < hopeContactTimeList.length }"> + <div v-for="(item, index) in getHopeContactTimeContent(hopeContactTime)" :key="index" :class="{'mt-10': index < 0 }"> + {{ item }} + </div> + </div> + </div> </div> </div> - <div class="client-detail-action"> - <el-button @click="$router.go(-1)" >蝯��</el-button> - <el-button @click="$router.go(-1)" style="margin-left: 0px">�/�閮�</el-button> + <div class=" btn-center" v-if="showWhenAppointmentHasClosed"> + <el-button @click="inviteReview">��遛��漲</el-button> </div> + <div class="client-detail-action" v-if="showWhenAppointmentHasContacted"> + <el-button @click="closeAppointment" class="desktop-client-detail-action-btn" >蝯��</el-button> + <el-button @click="sendMsg" style="margin-left: 0px">�蝝赤</el-button> + </div> + + <div class=" btn-center" v-if="showWhenAppointmentHasCreate"> + <el-button @click="sendMsg">���赤�</el-button> + </div> </section> + <template v-if="showWhenAppointmentHasClosed"> + <AppointmentClosedInfo :appointmentDetail="appointmentDetail" /> + </template> + + <InterviewMsg + :isVisible.sync="isVisibleDialog" + :client="appointmentDetail"> + </InterviewMsg> + + + <section class="mt-30" v-if="!showWhenAppointmentHasCreate"> + <AppointmentInterviewList :interviewList="appointmentDetail.interviewRecordDTOs" /> + </section> + + <section class="mt-30" v-if="!showWhenAppointmentHasCreate"> + <AppointmentRecordList :noticeLogs="appointmentDetail.appointmentNoticeLogs" /> + </section> + + <PopUpFrame :isOpen.sync="isShowInviteReviewDialog"> + <div class="text--middle invite-review"> + <div class="mb-30 mt-10">撌脩�遛��漲</div> + <div class="text--primary text--middle cursor--pointer text--underline" @click="isShowInviteReviewDialog = false" :size="'250px'">������</div> + </div> + </PopUpFrame> </div> </template> <script lang="ts"> -import { Context } from '@nuxt/types'; - import { Vue, Component } from 'vue-property-decorator'; +import { namespace } from 'nuxt-property-decorator'; -import appointmentService from '~/shared/services/appointment.service'; -import { AppointmentDetail } from '~/shared/models/appointment.model'; +import { Appointment } from '~/shared/models/appointment.model'; +import { ContactStatus } from '~/shared/models/enum/contact-status'; + +import reviewsService from '~/shared/services/reviews.service'; + + +const appointmentStore = namespace('appointment.store'); @Component export default class AppointmentDetailComponent extends Vue { - appointmentDetail!: AppointmentDetail; + @appointmentStore.State('appointmentDetail') + appointmentDetail!: Appointment; + + @appointmentStore.Getter('appointmentProgress') + appointmentProgress!: ContactStatus; + + isVisibleDialog = false; + isShowInviteReviewDialog = false ; + interviewTxt = ""; + contactStatus = ContactStatus; + ////////////////////////////////////////////////////////////////////// - async asyncData(context: Context) { - const appointmentId = +context.route.params.appointmentId; - return { - appointmentDetail: await appointmentService.getAppointmentDetail(appointmentId).then((res) => res) - } + closeAppointment(): void { + this.$router.push(`/appointment/${this.appointmentDetail.id}/close`); } + sendMsg():void { + this.isVisibleDialog = true; + } + + editAppointmentHasClosed(): void{ + this.$router.push(`/appointment/${this.appointmentDetail.id}/close`); + } + + get showWhenAppointmentHasClosed(): boolean { + return this.appointmentDetail.communicateStatus === this.contactStatus.DONE + || this.appointmentDetail.communicateStatus === this.contactStatus.CLOSE + || this.appointmentDetail.communicateStatus === this.contactStatus.CANCEL; + } + + get showWhenAppointmentHasCreate(): boolean { + return this.appointmentDetail.communicateStatus === this.contactStatus.PICKED + || this.appointmentDetail.communicateStatus === this.contactStatus.RESERVED; + } + + get showWhenAppointmentHasContacted() :boolean { + return this.appointmentDetail.communicateStatus === this.contactStatus.CONTACTED; + } + + get hopeContactTimeList(): any[] { + return this.appointmentDetail.hopeContactTime.split("','") + } + + getHopeContactTimeContent(hopeContactTimeString: string): string[] { + const result = hopeContactTimeString.replaceAll("'", '').split('��'); + return result; + } + + inviteReview(): void { + reviewsService.sendSatisfactionToClient(this.appointmentDetail.id).then(res => { + this.isShowInviteReviewDialog = true; + }); + } } </script> -<style lang="scss" scoped> +<style lang="scss"> .appointment-client-detail-page{ .date-detail{ display : flex; @@ -97,8 +193,7 @@ height: 100px; width: 100px; border-radius: 50%; - background-color: #fff; - border: 1px solid $PRIMARY_BLACK; + background-image: url('~/assets/images/appointment/avatar_bg.svg'); position: relative; display: flex; justify-content: center; @@ -109,12 +204,26 @@ width: 30px; border-radius: 50%; background-color: #fff; - border: 1px solid $PRIMARY_BLACK; bottom: 0; right: 0; display: flex; justify-content: center; align-items: center; + .sex-icon { + font-size: 20px; + &.icon-sex-male{ + color: $SKY_BLUE; + } + &.icon-sex-female{ + color: $CORAL; + } + } + &-male { + border: 1px solid $SKY_BLUE; + } + &-female { + border: 1px solid $LIGHT_RED; + } } } } @@ -135,9 +244,19 @@ display: flex; } .client-detail-demand__demand-list-label { - @extend .mr-10; - @extend .mdTxt; @extend .mb-10; + @extend .mdTxt; + @extend .mr-10; + line-height: 1.3; + color : $DARK_BLUE; + flex-basis: auto; + min-width : 40px; + } + .client-detail-demand__demand-list-content { + text-align: justify; + line-height: 1.3; + text-justify: auto; + word-break: break-all; } } .client-detail-action { @@ -145,4 +264,41 @@ } } } +.invite-review{ + align-items : center; + display : flex; + flex-direction: column; + } +.close-appointment-detail{ + background-color: #fff; + display: flex; + margin-top: 30px; + padding: 20px; + display: flex; + flex-direction: column; + font-size: 20px; +} +.close-appointment-detail-nav{ + display: flex; + justify-content: space-between; + flex: 1; +} +.hope-contact-time__line { + border-bottom: 1px solid #CCCCCC; +} +.btn-center{ + display: flex; + justify-content: center; + } + + @include desktop { + .client-detail-action { + display: flex; + justify-content: center; + } + .desktop-client-detail-action-btn{ + margin-right: 10px; + } + } + </style> -- Gitblit v1.8.0