| | |
| | | class="rowStyle cursor--pointer" |
| | | justify="space-between" |
| | | :class="{'new': newAppointment }" |
| | | @click.native="openDetail" |
| | | @click.native="viewDetail" |
| | | > |
| | | <el-col :xs="1" :sm="1" class="unread" align="middle" v-if="isReserved"> |
| | | <div class="test"> |
| | | <div class="unread" v-if="isReserved"> |
| | | <div class="circle" v-if="!isRead"></div> |
| | | </el-col> |
| | | <el-col :xs="5" :sm="3" align="middle"> |
| | | <el-avatar |
| | | :size="50" |
| | | ></el-avatar> |
| | | <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="14" class="pl-10"> |
| | | </div> |
| | | |
| | | <div class="pl-10"> |
| | | <div class="smTxt_bold name">{{ client.name }}</div> |
| | | <div class="my-10">預約成功</div> |
| | | <div class="my-10 xsTxt">預約成功</div> |
| | | <div class="professionals"> |
| | | <template v-if="client.requirement"> |
| | | <span |
| | |
| | | >(客戶未提供需求項目)</span> |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col class="flex-column contactInfo" :xs="4" :sm="6"> |
| | | <AppointmentProgress |
| | | :currentStep="client.communicateStatus" |
| | | ></AppointmentProgress> |
| | | </div> |
| | | </div> |
| | | <!-- <el-col :xs="5" :sm="3" align="middle"> |
| | | <el-avatar |
| | | :size="50" |
| | | ></el-avatar> |
| | | <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> --> |
| | | |
| | | <div 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> |
| | | class="invite-msg smTxt_bold" |
| | | @click.stop="showAddInterviewDialog" |
| | | v-if="client.communicateStatus === contactStatus.RESERVED"> |
| | | 傳送約訪通知 |
| | | </div> |
| | | <div |
| | | class="date xsTxt text--mid_grey" |
| | | class="invite-msg smTxt_bold" |
| | | @click.stop="navigateToCloseAppointment" |
| | | v-else-if="client.communicateStatus === contactStatus.CONTACTED"> |
| | | 結案 |
| | | </div> |
| | | <div |
| | | class="invite-msg smTxt_bold" |
| | | @click.stop="inviteReview" |
| | | v-else> |
| | | 發送滿意度 |
| | | </div> |
| | | |
| | | <div |
| | | class="date xsTxt text--black" |
| | | >{{ date }}</div> |
| | | <div |
| | | class="xsTxt text--mid_grey" |
| | | >{{ time }}</div> |
| | | </el-col> |
| | | </div> |
| | | </el-row> |
| | | |
| | | <Ui-Dialog |
| | |
| | | <el-button @click="markAppointment">標註為已連絡</el-button> |
| | | </div> |
| | | </Ui-Dialog> |
| | | |
| | | <InterviewMsg |
| | | :isVisible.sync="isShowAddInterviewDialog" |
| | | :client="client" |
| | | > |
| | | </InterviewMsg> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import { Vue, Component, Prop, Action, namespace, Watch } from 'nuxt-property-decorator'; |
| | | |
| | | import appointmentService from '~/shared/services/appointment.service'; |
| | | import myConsultantService from '~/shared/services/my-consultant.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'; |
| | | import { Appointment, AppointmentMemoInfo, ToInformAppointment } from '~/shared/models/appointment.model'; |
| | | import { ContactStatus } from '~/shared/models/enum/contact-status'; |
| | | |
| | | const localStorage = namespace('localStorage'); |
| | | @Component({ |
| | |
| | | }) |
| | | export default class ClientList extends Vue { |
| | | @Action |
| | | updateMyAppointment!: (data: ClientInfo) => void; |
| | | updateMyAppointment!: (data: Appointment) => void; |
| | | |
| | | @Prop() |
| | | client!: ClientInfo; |
| | | client!: Appointment; |
| | | |
| | | @localStorage.Mutation |
| | | storageClearAppointmentIdFromMsg!: () => void; |
| | | |
| | | isVisibleDialog = false; |
| | | dialogWidth = ''; |
| | | hideReviews = hideReviews; |
| | | contactStatus = ContactStatus; |
| | | dialogWidth = ''; |
| | | hideReviews = hideReviews; |
| | | isEdit = false; |
| | | isShowAddInterviewDialog = false; |
| | | isVisibleDialog = false; |
| | | memo = ''; |
| | | |
| | | isEdit = false; |
| | | memoInfo: AppointmentMemoInfo = { |
| | | appointmentId: 0, |
| | | content: '', |
| | | id: 0 |
| | | content : '', |
| | | id : 0 |
| | | } |
| | | memo = ''; |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | |
| | | ? JSON.parse(JSON.stringify(this.client.appointmentMemoList[0])) |
| | | : {appointmentId: 0, content: '', id: 0}; |
| | | this.memo = this.memoInfo.content; |
| | | } |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | viewDetail(): void { |
| | | this.$router.push(`/appointment/${this.client.id}`); |
| | | } |
| | | |
| | | showAddInterviewDialog(): void { |
| | | this.isShowAddInterviewDialog = true; |
| | | } |
| | | |
| | | navigateToCloseAppointment(): void { |
| | | this.$router.push(`/appointment/${this.client.id}/close`); |
| | | } |
| | | |
| | | get newAppointment(): boolean { |
| | |
| | | margin-bottom: 10px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | |
| | | transition: background-color 0.5s; |
| | | &.new { |
| | | border-left: solid 4px $YELLOW; |
| | |
| | | .circle { |
| | | width: 10px; |
| | | height: 10px; |
| | | border-radius: 50px; |
| | | border-radius: 50%; |
| | | background-color: $PRIMARY_RED; |
| | | margin: auto; |
| | | } |
| | |
| | | text-overflow: ellipsis; |
| | | .professionalsTxt { |
| | | font-size: 12px; |
| | | font-weight: bold; |
| | | margin-right: 5px; |
| | | } |
| | | .noProfessionalsTxt { |
| | |
| | | .fixed-Height { |
| | | height: 16px; |
| | | } |
| | | .test{ |
| | | display: flex; |
| | | } |
| | | .invite-msg{ |
| | | color: $PRIMARY_RED; |
| | | @extend .text--underline; |
| | | } |
| | | </style> |