From ba5f9f95bb8191c73c1a6fe5d1810cdfce217502 Mon Sep 17 00:00:00 2001 From: Tomas <tomasysh@gmail.com> Date: 星期一, 21 八月 2023 15:37:39 +0800 Subject: [PATCH] Update: [推廣影片] sandbox attribute add allow-presentation --- PAMapp/pages/index.vue | 222 ++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 171 insertions(+), 51 deletions(-) diff --git a/PAMapp/pages/index.vue b/PAMapp/pages/index.vue index e424a82..ab9e195 100644 --- a/PAMapp/pages/index.vue +++ b/PAMapp/pages/index.vue @@ -2,6 +2,7 @@ <div> <Ui-Carousel></Ui-Carousel> <div class="page-container"> + <div> <h5 class="mdTxt">����憿批��</h5> <div class="mt-10 pam-reserveBtn--block"> @@ -15,6 +16,7 @@ </el-button> </div> </div> + <div class="pam-paragraph"> <el-row class="rowStyle"> <el-col :span="16"> @@ -29,6 +31,8 @@ <ConsultantList class="mt-10" :agents="consultantList.slice(0, 3)"></ConsultantList> </div> + + <div class='pam-paragraph'> <div class="pam-recommend"> <h5 class="mdTxt">��靽憿批��</h5> @@ -45,41 +49,47 @@ :width="appointmentDialogWidth" class="pam-myDemand-dialog pam-dialog-reserved" > - <div v-if="appointmentDetail"> - <h5 class="subTitle text--center mb-30">������</h5> - <p class="smTxt">{{appointmentDetail.appointmentDate | formatDate}}</p> - <div class="reserved-info"> - <p>憪��{appointmentDetail.name}}</p> - <p>�閰梧�{appointmentDetail.phone}}</p> - <p>Email嚗{appointmentDetail.email}}</p> - <p>�批嚗{gender}}</p> - <p>撟湧翩嚗{appointmentDetail.age | toAgeLabel }}</p> - <p>�璆哨�{appointmentDetail.job}}</p> - <p>��瘙�{appointmentDetail.requirement.split(',').join('��')}}</p> - <p - v-for="(item, index) in hopeContactTime" - :key="index" - >��蝯⊥�挾{{index + 1 | formatNumber}}嚗{ item | formatHopeContactTime }}</p> - <div v-if="appointmentDetail.satisfactionScore"> - <div class="mdTxt mt-10 mb-10">皛踵�漲</div> - <el-rate - :value="appointmentDetail.satisfactionScore" - class="pam-myDemand-dialog__rate" - disabled> - </el-rate> - </div> - </div> + <div v-if="appointmentDetail"> + <h5 class="subTitle text--center mb-30">������</h5> + <p class="smTxt">{{appointmentDetail.appointmentDate | formatDate}}</p> + <div class="reserved-info"> + <p>憪��{appointmentDetail.name}}</p> + <p>�閰梧�{appointmentDetail.phone}}</p> + <p>Email嚗{appointmentDetail.email}}</p> + <p>�批嚗{gender}}</p> + <p>撟湧翩嚗{appointmentDetail.age | toAgeLabel }}</p> + <p>�璆哨�{appointmentDetail.job}}</p> + <p>隢株岷�撘�{appointmentDetail.consultationMethod | toConsultationMethod }}</p> + <p>��瘙�{ appointmentDetail.requirement ? appointmentDetail.requirement.split(',').join('��') : '--'}}</p> + <p + v-for="(item, index) in hopeContactTime" + :key="index" + >��蝯⊥�挾{{index + 1 | formatNumber}}嚗{ item | formatHopeContactTime }}</p> + <div v-if="appointmentDetail.satisfactionScore"> + <div class="mdTxt mt-10 mb-10">皛踵�漲</div> + <el-rate + :value="appointmentDetail.satisfactionScore" + class="pam-myDemand-dialog__rate" + disabled> + </el-rate> + </div> + </div> - <div v-if="notScoreAppointmentYet" class="reserved-btn"> - <el-button type="primary" - @click.native="isShowReviewDialog = true">蝯虫�遛��漲閰��</el-button> - </div> - </div> + <div v-if="notScoreAppointmentYet" class="reserved-btn"> + <el-button type="primary" + @click.native="reviewsBtn = true">蝯虫�遛��漲閰��</el-button> + </div> + + <div v-if="appointmentDetail.communicateStatus === 'reserved'" class="text--center mt-10"> + <el-button @click="isCancelPopup = true">������</el-button> + <el-button @click="edit" type="primary">蝺刻摩</el-button> + </div> + </div> </Ui-Dialog> <PopUpFrame :isOpen.sync="isShowReAppointmentDialog" - @closePopUp="removeUrlQueryParameter('notContactAppointmentIdFromMsg')" + @closePopUp="removeUrlQueryParameter('notContactAppointmentId')" > <div class="pam-dialog-review"> <div class="mt-30 text--middle" v-if="agentInfo"> @@ -132,23 +142,40 @@ </div> </div> </PopUpFrame> + + <div class="video-container" + v-if="isShowFilmPlayer" + style="position: fixed; bottom: 30px; right: 30px; z-index: 9999; display: flex; justify-content: flex-end;" + > + <iframe + id="ytplayer" type="text/html" width="360" height="270" + frameborder="0" + allowfullscreen + sandbox="allow-scripts allow-same-origin allow-popups allow-presentation fullscreen" + :src="filmVideoSrc" + ></iframe> + <div class="close-btn" @click="closeVideo()">X</div> + </div> + </div> </template> <script lang="ts"> - import { Vue, Component, State, Action, Watch, namespace } from 'nuxt-property-decorator'; - import { Appointment, AppointmentClosedInfo } from '~/shared/models/appointment.model'; - import { Consultant } from '~/shared/models/consultant.model'; - import { ContactStatus } from '~/shared/models/enum/contact-status'; - import { UserReviewsConsultantsParams } from '~/shared/models/reviews.model'; - import { StrictQueryParams } from '~/shared/models/strict-query.model'; - import appointmentService from '~/shared/services/appointment.service'; - import reviewsService from '~/shared/services/reviews.service'; - import UtilsService from '~/shared/services/utils.service'; - import myConsultantService from '~/shared/services/my-consultant.service'; -import { AgentInfo } from '~/shared/models/agent-info.model'; +import {Action, Component, Getter, Mutation, namespace, State, Vue, Watch} from 'nuxt-property-decorator'; - const localStorage = namespace('localStorage'); +import appointmentService from '~/shared/services/appointment.service'; +import utilService, {AccessFroms} from '~/shared/services/utils.service'; +import reviewsService from '~/shared/services/reviews.service'; +import myConsultantService from '~/shared/services/my-consultant.service'; +import {Appointment, AppointmentClosedInfo} from '~/shared/models/appointment.model'; +import {Consultant} from '~/shared/models/consultant.model'; +import {UserReviewParams} from '~/shared/models/reviews.model'; +import {StrictQueryParams} from '~/shared/models/strict-query.model'; +import {AgentInfo} from '~/shared/models/agent-info.model'; +import {ContactStatus} from '~/shared/models/enum/contact-status'; +import {SatisfactionType} from '~/shared/models/enum/satisfaction-type'; + +const localStorage = namespace('localStorage'); const roleStorage = namespace('localStorage'); @Component({ @@ -165,11 +192,17 @@ @roleStorage.Getter isAdminLogin!: boolean; + @roleStorage.Getter + isUserLogin!: boolean; + @Action storeRecommendList!: any; @Action storeConsultantList!: any; + + @Mutation + setAccessSource!: (accessSource: AccessFroms) => void; @localStorage.Mutation storageClearQuickFilter!: () => void; @@ -209,7 +242,7 @@ appointmentDate : '', appointmentMemoList: [], appointmentNoticeLogs: [], - communicateStatus : this.contactStatus.PICKED, + communicateStatus: this.contactStatus.PICKED, consultantReadTime: '', consultantViewTime: '', contactTime : '', @@ -227,6 +260,7 @@ phone : '', requirement : '', satisfactionScore : 0, + consultationMethod : '' }; agentInfo: Consultant = { @@ -244,9 +278,31 @@ appointments : [] }; + isCloseVideo = false; + + @Getter + fromAccess!: AccessFroms; + + get filmVideoSrc() { + if (!this.fromAccess) return ''; + return this.fromAccess === AccessFroms.FILM_1 + ? 'https://www.youtube.com/embed/zVBLW9hWD0g?autoplay=1&mute=1&loop=1&playlist=zVBLW9hWD0g' + : 'https://www.youtube.com/embed/655JnwbuRGA?autoplay=1&mute=1&loop=1&playlist=655JnwbuRGA'; + } + + + get isShowFilmPlayer() { + return !!this.fromAccess && !this.isCloseVideo; + } + ////////////////////////////////////////////////////////////////////// mounted() { + if (this.$route.query.from) { + const fromSource = this.$route.query.from as AccessFroms; + this.setAccessSource(fromSource); + utilService.insertAccessFrom(fromSource); + } if (this.isAdminLogin) { this.$router.push('/myAppointmentList/appointmentList'); } else { @@ -257,6 +313,16 @@ this.storeConsultantList(); this.storageClearQuickFilter(); this.storageClearRecommendConsultant(); + + if (this.isUserLogin) { + appointmentService.getNotContactAppointment().then((appointment) => { + if (appointment) { + this.$router.push({ query: { notContactAppointmentId: appointment.id + ''}}); + this.autoOpenAppointmentBy('askReAppointment', appointment.id); + } + }); + } + } } @@ -305,7 +371,7 @@ const appointmentInfo = values[1] as Appointment; this.consultantName = agentInfo.name; this.appointmentDetail = appointmentInfo; - this.appointmentDialogWidth = UtilsService.isMobileDevice() ? '80%' : ''; + this.appointmentDialogWidth = utilService.isMobileDevice() ? '80%' : ''; this.isShowAppointmentDialog = true; switch (reason) { case 'inviteReviewConsultant': @@ -331,13 +397,20 @@ this.$router.push(path); } + edit() { + this.isShowAppointmentDialog = false; + this.$router.push({path: `/questionnaire/${this.agentInfo.agentNo}`, query: {'edit': 'true'}}); + } + reAppointment(): void { appointmentService.cancelAppointment(this.appointmentDetail.id).then(() => { - const requirements = this.appointmentDetail.requirement.split(','); + const requirements = this.appointmentDetail && this.appointmentDetail.requirement + ? this.appointmentDetail.requirement.split(',') + : []; this.storeConsultantList(); this.storageStrickQueryItem({ requirements: requirements }); this.storageClearNotContactAppointmentIdFromMsg(); - this.removeUrlQueryParameter('notContactAppointmentIdFromMsg'); + this.removeUrlQueryParameter('notContactAppointmentId'); this.$router.push('/recommendConsultant'); }); } @@ -346,15 +419,18 @@ appointmentService.cancelAppointment(this.appointmentDetail.id).then(() => { this.storeConsultantList(); this.storageClearNotContactAppointmentIdFromMsg(); - this.removeUrlQueryParameter('notContactAppointmentIdFromMsg'); - this.$router.push(''); + this.removeUrlQueryParameter('notContactAppointmentId'); + this.isShowReAppointmentDialog = false; + this.isShowAppointmentDialog = false; + this.$router.push('/'); }); } userReviewsConsultants() { - const reviewParams: UserReviewsConsultantsParams = { + const reviewParams: UserReviewParams = { appointmentId: this.appointmentDetail.id, score: this.inputScore, + type: SatisfactionType.APPOINTMENT } this.appointmentDetail.satisfactionScore = this.inputScore; @@ -375,18 +451,24 @@ }) } this.$router.push(newRouteQuery); + this.storageClearSatisfactionIdFromMsg(); + this.storageClearNotContactAppointmentIdFromMsg(); + } + + closeVideo(): void { + this.isCloseVideo = true; } /////////////////////////////////////////////////////////////////////////////// - get gender() { + get gender(): string { if (this.appointmentDetail.gender) { return this.appointmentDetail.gender === 'male' ? '���' : '憟單��'; } return '' } - get hopeContactTime() { + get hopeContactTime(): string[] { const contactList = this.appointmentDetail.hopeContactTime .split("'").map((item: any) => item.slice(0, item.length)); return contactList.filter((item: any) => !!item && item !== ",") @@ -456,6 +538,7 @@ align-items: center; } + @media (min-width: 576px) and (max-width: 767px) { .quickFilter.el-button--default { background-image: url('~/assets/images/quickFilter/banner_web.svg'); @@ -472,6 +555,15 @@ margin: 0 auto; } + .landing-container { + border: 2px solid blue; + border-radius: 10px; + padding: 10px; + display: flex; + flex-direction: column; + align-items: center; + } + .pam-reserveBtn--block { display: flex; justify-content: space-between; @@ -481,4 +573,32 @@ max-width: 335px; } } + + /* 蝣箔�� .video-container ��撠�/蝯����摰祝摨� */ + .video-container { + position: relative; + width: auto; /* �����蔣��偕撖貉矽� */ + } + + /* �����見撘� */ + .close-btn { + position: absolute; + top: -10px; + right: -10px; + cursor: pointer; + font-size: 20px; + color: #fff; + background-color: #000; + width: 30px; + height: 30px; + text-align: center; + line-height: 30px; + border-radius: 50%; + opacity: 0.7; + } + + .close-btn:hover { + opacity: 1; + } + </style> -- Gitblit v1.8.0