| | |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component } from 'nuxt-property-decorator'; |
| | | import { addFavoriteConsultant, appointmentDemand, AppointmentParams, AppointmentRequests ,RegisterInfo } from '~/assets/ts/api/consultant'; |
| | | import { getRequestsFromStorage, setRequestsToStorage, getRequestQuestionFromStorage, removeRequestQuestionFromStorage } from '~/assets/ts/storageRequests'; |
| | | import { Gender } from '~/assets/ts/models/enum/Gender'; |
| | | import { ContactType } from '~/assets/ts/models/enum/ContactType'; |
| | | import _ from 'lodash'; |
| | | import { isLogin } from '~/assets/ts/auth'; |
| | | <script src="./questionnaire.component.ts"></script> |
| | | |
| | | @Component |
| | | export default class Questionnaire extends Vue { |
| | | genderOptions=[ |
| | | { |
| | | title:'男性', |
| | | label:Gender.MALE, |
| | | }, |
| | | { |
| | | title:'女性', |
| | | label:Gender.FEMALE, |
| | | } |
| | | ]; |
| | | |
| | | requirementOptions=[ |
| | | { |
| | | title:'健康與保障', |
| | | label:'健康與保障', |
| | | }, |
| | | { |
| | | title:'子女教育', |
| | | label:'子女教育', |
| | | }, |
| | | { |
| | | title:'資產規劃', |
| | | label:'資產規劃', |
| | | }, |
| | | { |
| | | title:'樂活退休', |
| | | label:'樂活退休', |
| | | }, |
| | | { |
| | | title:'保單健檢/規劃', |
| | | label:'保單健檢/規劃', |
| | | }, |
| | | { |
| | | title:'分紅保單', |
| | | label:'分紅保單', |
| | | }, |
| | | ]; |
| | | |
| | | ageRangeOptions=[ |
| | | { |
| | | title:'20歲以下', |
| | | label:'under_20', |
| | | }, |
| | | { |
| | | title:'21-30 歲', |
| | | label:'21-30' |
| | | }, |
| | | { |
| | | title:'31-40 歲', |
| | | label:'31-40' |
| | | }, |
| | | { |
| | | title:'41-50 歲', |
| | | label:'41-50' |
| | | }, |
| | | { |
| | | title:'46-55 歲', |
| | | label:'46-55', |
| | | }, |
| | | { |
| | | title:'51-60 歲', |
| | | label:'51-60', |
| | | }, |
| | | { |
| | | title:'61-70 歲', |
| | | label:'61-70', |
| | | }, |
| | | { |
| | | title:'71 歲以上', |
| | | label:'over_71', |
| | | } |
| | | ]; |
| | | |
| | | quesAboutList = [ |
| | | { |
| | | title:'健康與保障', |
| | | content:'唯有把身體照顧好,才是保障幸福之本,不做盲目燃燒的蠟燭,只做綻開的陽光,陪孩子多走一哩路,人生的美正要開展。' |
| | | }, |
| | | { |
| | | title:'子女教育', |
| | | content:'孩子,我們是雙方的導師也是學生,面對未來要並肩作戰,學會勇敢無畏、克服挫折、善於理財,這條路上我們一起學。' |
| | | }, |
| | | { |
| | | title:'資產規劃', |
| | | content:'真正的財富來自嚴謹規劃資產傳承,為人生蓋一堵抵禦財務風險的牆,確保資產穩健成長,替全家族的未來做好萬全準備。' |
| | | }, |
| | | { |
| | | title:'樂活退休', |
| | | content:'拼一輩子,退休後的日子要輕鬆快活,就得提早透過保險商品規劃退休財務,替自己創造穩定收入,為精彩的熟年人生揭開序幕。' |
| | | }, |
| | | { |
| | | title:'保單健檢/規劃', |
| | | content:'全面檢視自己的保障結構是否符合現在或未來的風險移轉需求。' |
| | | }, |
| | | { |
| | | title:'分紅保單', |
| | | content:'分紅保單 分紅保單是兼具「分攤風險」與「紅利共享」特色的保單,具有一定穩定度,讓你可以同時享有壽險保障及紅利!' |
| | | } |
| | | ]; |
| | | |
| | | myRequest: AppointmentRequests = { |
| | | phone : this.userInfo?.phone ? this.userInfo.phone : '', |
| | | email : this.userInfo?.email ? this.userInfo.email : '', |
| | | contactType : _.isEqual(this.userInfo?.contactType,ContactType.SMS) ? ContactType.PHONE: ContactType.EMAIL, |
| | | gender : '', |
| | | age : '', |
| | | job : '', |
| | | requirement : [], |
| | | hopeContactTime: [{ |
| | | selectWeekOptions : [], |
| | | selectTimesOptions: [], |
| | | }], |
| | | agentNo: '', |
| | | }; |
| | | |
| | | showDrawer= false; |
| | | sendReserve = false; |
| | | |
| | | beforeRouteEnter(to: any, from: any, next: any) { |
| | | next(vm => { |
| | | if (from.name === 'login' && !isLogin()) { |
| | | vm.$router.go(-1); |
| | | return; |
| | | } |
| | | |
| | | if (!isLogin()) { |
| | | vm.$router.push('/login'); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | mounted(): void { |
| | | this.setMyRequest(); |
| | | } |
| | | |
| | | private setMyRequest(): void { |
| | | const storageMyRequest = getRequestsFromStorage(); |
| | | const storageMyQuestion = getRequestQuestionFromStorage(); |
| | | |
| | | if (storageMyRequest) { |
| | | this.myRequest = { |
| | | ...storageMyRequest, |
| | | hopeContactTime: storageMyRequest.hopeContactTime?.length |
| | | ? storageMyRequest.hopeContactTime |
| | | : [{ |
| | | selectWeekOptions: [], |
| | | selectTimesOptions: [], |
| | | }], |
| | | }; |
| | | } |
| | | |
| | | if (storageMyQuestion) { |
| | | this.myRequest = { |
| | | ...this.myRequest, |
| | | requirement: storageMyQuestion |
| | | } |
| | | removeRequestQuestionFromStorage(); |
| | | } |
| | | } |
| | | |
| | | get phoneValid(): boolean { |
| | | const rule = /^09[0-9]{8}$/; |
| | | return this.myRequest.phone |
| | | ? rule.test(this.myRequest.phone) && _.isEqual(this.myRequest.phone.length,10) |
| | | : true; |
| | | } |
| | | |
| | | get userInfo(): RegisterInfo { |
| | | const initUserInfo = JSON.parse(localStorage.getItem('userInfo')!); |
| | | return initUserInfo; |
| | | } |
| | | |
| | | get isDisabledSubmitBtn(): boolean { |
| | | return _.includes(this.myRequest.contactType,ContactType.PHONE) |
| | | ? !this.isHopeContactTimeDone() |
| | | : !this.phoneValid; |
| | | } |
| | | |
| | | get isLogin() { |
| | | return isLogin(); |
| | | } |
| | | |
| | | private isHopeContactTimeDone():boolean{ |
| | | return this.myRequest.hopeContactTime[0]?.selectWeekOptions.length >0 && this.myRequest.hopeContactTime[0]?.selectTimesOptions.length >0; |
| | | } |
| | | |
| | | sentDemand() { |
| | | addFavoriteConsultant([this.$route.params.agentNo]).then(res => this.sentAppointmentDemand()); |
| | | } |
| | | |
| | | private sentAppointmentDemand() { |
| | | const data: AppointmentParams = { |
| | | ...this.myRequest, |
| | | requirement: _.map(this.myRequest.requirement,o=>o).toString(), |
| | | hopeContactTime: this.myRequest.phone && this.phoneValid ? this.getHopeContactTime() :'', |
| | | agentNo: this.$route.params.agentNo |
| | | }; |
| | | |
| | | appointmentDemand(data).then(res => { |
| | | this.sendReserve = true; |
| | | this.myRequest.hopeContactTime = []; |
| | | setRequestsToStorage(this.myRequest); |
| | | }); |
| | | } |
| | | |
| | | getHopeContactTime() { |
| | | const selectedHopeContactTime = this.myRequest.hopeContactTime.filter((i) => i.selectWeekOptions?.length && i.selectTimesOptions?.length); |
| | | return selectedHopeContactTime.map(i => { |
| | | return `'${i.selectWeekOptions}、${i.selectTimesOptions}'`} |
| | | ).toString(); |
| | | } |
| | | |
| | | closeReservePopUp() { |
| | | this.sendReserve = false; |
| | | this.$router.push('/') |
| | | } |
| | | |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .sendReserve-txt{ |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-top: 10px; |
| | | margin-bottom: 26px; |
| | | } |
| | | |
| | | //drawer最底下文字樣式 |
| | | .qa-dialog-footer{ |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-bottom: 81px; |
| | | color: #ED1B2E; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | //送出按鈕樣式與排版 |
| | | .ques-footer{ |
| | | justify-content: center; |
| | | margin: 30px 0; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | .el-button { |
| | | width: 120px; |
| | | height:50px; |
| | | background-color: #ED1B2E; |
| | | color:#FFFFFF; |
| | | font-weight: normal; |
| | | @extend .text--middle ; |
| | | &.el-button--default { |
| | | color: $PRIMARY_RED; |
| | | background-color: #FFFFFF; |
| | | border-color: $PRIMARY_RED; |
| | | } |
| | | &.el-button--primary { |
| | | background-color: $PRIMARY_RED; |
| | | border-color: $PRIMARY_RED; |
| | | } |
| | | &.is-disabled { |
| | | color: $PRIMARY_WHITE; |
| | | background-color: $MID_GREY; |
| | | border-color: $MID_GREY; |
| | | border-style: solid; |
| | | pointer-events: none; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //詳細問題drawer中間內容空間大小設置 |
| | | .qa-dialog{ |
| | | overflow-y:auto; |
| | | height: 500px; |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | //詳細問題drawer主要標題 |
| | | .qaTextTitle{ |
| | | margin-top:30px; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .el-button+.el-button{ |
| | | margin-left: 0; |
| | | } |
| | | |
| | | .datepicker{ |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .required { |
| | | position: relative; |
| | | &::before { |
| | | content: '*'; |
| | | position: absolute; |
| | | color: #FF0000; |
| | | transform: translate(-12px, 0); |
| | | } |
| | | } |
| | | |
| | | .ques-page--reset.pam-page-container { |
| | | margin: 0px auto; |
| | | } |
| | | |
| | | .ques-header { |
| | | position: relative; |
| | | } |
| | | |
| | | .ques-header__mob-banner { |
| | | width: 100%; |
| | | min-height: 80px; |
| | | background-color: #F8F9FA; |
| | | background-image: url('~/assets/images/questionnaire/reserve_bg_mob.svg'); |
| | | background-repeat: no-repeat; |
| | | background-size: cover; |
| | | background-position: center; |
| | | } |
| | | |
| | | .ques-header__info { |
| | | position: relative; |
| | | padding:30px 20px; |
| | | margin: 0px 20px; |
| | | background-color: #B3E7E3; |
| | | border-radius: 10px; |
| | | } |
| | | |
| | | .ques-header__input-block { |
| | | display: flex; |
| | | align-items: center; |
| | | @extend .text--middle,.mt-10 ; |
| | | .ques-header__input{ |
| | | &.is-invalid{ |
| | | border: 2px solid $PRIMARY_RED !important; |
| | | } |
| | | flex: 1; |
| | | height: 50px; |
| | | border-radius: 10px; |
| | | border: 1px #CCCCCC solid; |
| | | background-color: $PRIMARY_WHITE; |
| | | padding: 15px 10px; |
| | | box-sizing: border-box; |
| | | -webkit-box-sizing: border-box; |
| | | -moz-box-sizing: border-box; |
| | | } |
| | | } |
| | | |
| | | .ques-container { |
| | | position: relative; |
| | | margin: 0px 20px; |
| | | } |
| | | |
| | | |
| | | @include desktop{ |
| | | .ques-header{ |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | min-height: 460px; |
| | | background-image: url('~/assets/images/questionnaire/reserve_bg_web.svg'); |
| | | background-repeat: no-repeat; |
| | | background-size: contain; |
| | | background-position: bottom; |
| | | } |
| | | .ques-header__mob-banner{ |
| | | display: none; |
| | | } |
| | | .ques-header__info{ |
| | | margin: 30px 20px; |
| | | width:500px; |
| | | min-height: 400px; |
| | | -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ |
| | | -moz-box-sizing: border-box; /* Firefox, other Gecko */ |
| | | box-sizing: border-box; |
| | | } |
| | | .ques-container{ |
| | | margin: 0px; |
| | | } |
| | | } |
| | | |
| | | <style lang="scss"> |
| | | @import "./questionnaire.component.scss"; |
| | | </style> |
| | | |