From e02d6534d2dba4b8adcbb80e37cc77bf8bddd26c Mon Sep 17 00:00:00 2001 From: Tomas <tomasysh@gmail.com> Date: 星期三, 09 三月 2022 16:50:48 +0800 Subject: [PATCH] update#136137: [諮詢度表現] 顧問詳細資訊API 前端調整串接 --- PAMapp/pages/agentInfo/edit/_agentNo.vue | 546 +++++++++++++++++++++++++++++++----------------------- 1 files changed, 316 insertions(+), 230 deletions(-) diff --git a/PAMapp/pages/agentInfo/edit/_agentNo.vue b/PAMapp/pages/agentInfo/edit/_agentNo.vue index 5cfafbb..eb95946 100644 --- a/PAMapp/pages/agentInfo/edit/_agentNo.vue +++ b/PAMapp/pages/agentInfo/edit/_agentNo.vue @@ -1,33 +1,100 @@ <template> - <div> + <div class="edit-agent-info-page"> + <el-row type="flex" justify="center"> - <UiAvatar :size="150" :fileName="agentInfo.img"></UiAvatar> + <EditConsultantAvatar + :agentNo="agentInfo.agentNo" + :photoBase64.sync="editInfoValue.photoBase64"/> </el-row> - <el-row + <!-- NOTE: ���蝺刻摩��銝�閬*蝷� avgScore嚗���� [Tomas, 2022/2/10 13:55] --> + <!-- <el-row type="flex" class="pt-10" justify="center" align="middle" v-if="!hideReviews"> - <!-- TODO:���遛��漲 --> <i class="pam-icon icon--primary icon-star"></i> <h3 class="mdTxt">{{ agentInfo.avgScore }}</h3> - </el-row> + </el-row> --> - <el-row + <!-- <el-row type="flex" - class="pt-10" + class="pam-paragraph" justify="center"> <el-input class="mdTxt" v-model="editInfoValue.name"></el-input> + </el-row> --> + <el-row + type="flex" + class="pam-paragraph"> + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title mb-10"> + <i class="pam-icon icon-avatar" + ></i>憿舐內��迂 + <span class="hint text--bold" v-show="!editInfoValue.name">憿舐內��迂�敹‵</span> + </div> + </div> + <el-input + v-model="editInfoValue.name" + :class="{'is-invalid': !nameValid}" + maxlength="10" + minlength="10"></el-input> + </div> + </el-col> </el-row> <el-row type="flex" class="pam-paragraph"> - <UiField :span="12" icon="agent" label="����"> - <el-input v-model="editInfoValue.title"></el-input> + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title mb-10"> + <i class="pam-icon icon-phone" + ></i>����Ⅳ + <span class="hint text--bold" v-show="!phoneValid">����Ⅳ�撘�炊</span> + <span class="hint text--bold" v-show="editInfoValue.phoneNumber.length === 0">����Ⅳ�敹‵</span> + </div> + </div> + <el-input + v-model="editInfoValue.phoneNumber" + :class="{'is-invalid': !phoneValid}" + maxlength="10" + minlength="10"></el-input> + </div> + </el-col> + </el-row> + + <el-row + type="flex" + class="pam-paragraph"> + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title mb-10"> + <i class="pam-icon icon-comment" + ></i>靽∠拳 + <span class="hint text--bold" v-show="!emailValid">靽∠拳�撘�炊</span> + <span class="hint text--bold" v-show="editInfoValue.email.length === 0">靽∠拳�敹‵</span> + </div> + </div> + <el-input + v-model="editInfoValue.email" + :class="{'is-invalid': !emailValid}" + ></el-input> + </div> + </el-col> + </el-row> + + + <el-row + type="flex" + class="pam-paragraph"> + <UiField :span="24" icon="agent" label="����"> + <el-input v-model="editInfoValue.title" class="mt-10"></el-input> </UiField> </el-row> @@ -35,7 +102,12 @@ type="flex" class="pam-paragraph"> <UiField icon="company" label="�����"> - <el-input v-model="editInfoValue.serveArea"></el-input> + <MultiSelectBtn class="mt-30" + :mutiSelect.sync="editInfoValue.serveArea" + :nameOfSelectAll="'��'" + :options="serveAreaOptions" + > + </MultiSelectBtn> </UiField> </el-row> @@ -43,7 +115,7 @@ type="flex" class="pam-paragraph"> <UiField icon="address" label="�����"> - <el-input v-model="editInfoValue.companyAddress"></el-input> + <el-input v-model="editInfoValue.companyAddress" class="mt-10"></el-input> </UiField> </el-row> @@ -53,20 +125,22 @@ <UiField :span="12" icon="time" label="��敺�����"> {{ agentInfo.latestLoginTime | formatDate }} </UiField> - <UiField :span="12" icon="calender" label="����風" style="display:flex"> - <el-input v-model="editInfoValue.seniorityYear" class="seniority-input"></el-input>撟� - <el-select style="width:60px" v-model="editInfoValue.seniorityMonth" class="seniority-input"> - <el-option - v-for="(month) in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]" - :value="month" - :key="month"> - {{ month }} - </el-option> - </el-select>��� + <UiField :span="12" icon="calender" label="����風"> + <div class="mt-10" style="display: flex; align-items: center"> + <el-input v-model="editInfoValue.seniorityYear" class="seniority-input" ></el-input>撟� + <el-select style="width:60px" v-model="editInfoValue.seniorityMonth" class="seniority-input"> + <el-option + v-for="(month) in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]" + :value="month" + :key="month"> + {{ month }} + </el-option> + </el-select>��� + </div> </UiField> </el-row> - <el-row + <!-- <el-row type="flex" class="pam-paragraph"> <el-col :span="24" class="pam-field"> @@ -85,35 +159,54 @@ <el-progress :show-text="false" :stroke-width="15" :percentage="agentInfo.evaluation * 2"></el-progress> </div> </el-col> - </el-row> + </el-row> --> + <el-row type="flex" class="pam-paragraph"> - <el-checkbox - v-model="editInfoValue.communicationStyle" - :label="communicateStyle" - :key="index" - v-for="(communicateStyle, index) in communicationStyleList"> - </el-checkbox> - + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title"> + <i class="pam-icon icon-flag" + ></i>皞�◢� <span class="hint text--bold">(�銴,��憭�2���)</span> + </div> + </div> + <MultiSelectBtn class="mt-30" + :mutiSelect.sync="editInfoValue.communicationStyle" + :options="agentCommunicationStyleList" + :maxLength="2" + > + </MultiSelectBtn> + </div> + </el-col> </el-row> + <el-row type="flex" class="pam-paragraph"> - <UiField icon="flag" label="撠����"> - <el-checkbox - v-model="editInfoValue.expert" - :label="item.name" - :key="item.id" - v-for="item in expertList"> - </el-checkbox> - </UiField> + <el-col :span="24" class="pam-field"> + <div class="pam-field__label pam-progress__label"> + <div> + <div class="pam-field__title"> + <i class="pam-icon icon-flag" + ></i>撠���� <span class="hint text--bold">(�銴)</span> + </div> + </div> + <MultiSelectBtn class="mt-30" + :mutiSelect.sync="editInfoValue.expertise" + :options="agentExpertList" + > + </MultiSelectBtn> + </div> + </el-col> </el-row> + <el-row type="flex" class="pam-paragraph"> <UiField icon="comment" label="�犖��艙"> - <el-input type="textarea" autosize v-model="editInfoValue.concept"></el-input> + <el-input type="textarea" autosize v-model="editInfoValue.concept" class="mt-10"></el-input> </UiField> </el-row> @@ -121,7 +214,12 @@ type="flex" class="pam-paragraph"> <UiField icon="school" label="�犖��"> - <el-input type="textarea" autosize v-model="editInfoValue.experience"></el-input> + <el-input + autosize + type="textarea" + class="mt-10" + v-model="editInfoValue.experiences"> + </el-input> </UiField> </el-row> @@ -129,7 +227,7 @@ type="flex" class="pam-paragraph"> <UiField icon="trophy" label="敺��風"> - <el-input type="textarea" autosize style="height:70%" v-model="editInfoValue.awards"></el-input> + <el-input type="textarea" autosize style="height:70%" v-model="editInfoValue.awards" class="mt-10"></el-input> </UiField> </el-row> @@ -147,7 +245,16 @@ </div> </div> </PopUpFrame> - + <PopUpFrame :isOpen.sync="isInfoUpdate"> + <div class="text--center mdTxt fs-18"> + <p class="mt-20 text--center ">撣唾��������</p> + <el-button + type="primary" + @click="backToInfo" + class="mt-20" + >������</el-button> + </div> + </PopUpFrame> <div class="pam-paragraph account-confirm"> <el-button :disabled="isSubmitBtnDisabled" @click.native="editAgentInfoSetting"> @@ -160,7 +267,7 @@ <script lang="ts"> import { Context } from '@nuxt/types'; import { namespace } from 'nuxt-property-decorator'; -import { Vue, Component } from 'vue-property-decorator'; +import { Vue, Component, Prop } from 'vue-property-decorator'; import * as _ from "lodash"; import myConsultantService from '~/shared/services/my-consultant.service'; @@ -168,74 +275,96 @@ import { AgentInfo } from '~/shared/models/agent-info.model'; import { hideReviews } from '~/shared/const/hide-reviews'; -import { Role } from '~/shared/models/enum/Role'; import { AgentInfoSetting } from '~/shared/models/account.model'; +import { Role } from '~/shared/models/enum/Role'; +import { agentCommunicationStyleList } from '~/shared/const/agent-communication-style-list'; +import { taiwanCities } from '~/shared/const/taiwan-cities'; -const localStorage = namespace('localStorage'); +const localStorageTest = namespace('localStorage'); +const loginStore = namespace('login.store'); @Component -export default class AgentInfoComponent extends Vue { +export default class AgentInfoEditComponent extends Vue { - @localStorage.State('current_role') - currentRole!:string | null; + @localStorageTest.State + current_role: any; - _agentInfoSetting!: AgentInfoSetting; - agentInfo!:AgentInfo - role = Role; - isAlertFieldInfo = false; - fieldInfoTitle = ''; - fieldInfoDesc = ''; - hideReviews = hideReviews ; + @loginStore.Action + updateConsultantDetail!: (agentNo: string) => Promise<AgentInfo>; + + defaultAgentInfoSetting!: AgentInfoSetting; + agentInfo! : AgentInfo + fieldInfoDesc : string = ''; + fieldInfoTitle : string = ''; + hideReviews : boolean = hideReviews ; + isAlertFieldInfo: boolean = false; + isInfoUpdate : boolean = false; + serveAreaOptions: any[] = taiwanCities.map((city) => ({ title: city, label: city })); editInfoValue = { + agentNo : '', name : '', - expert : [] as string[], + expertise : [] as string[], title : '', - serveArea : '', + serveArea : [] as string[], companyAddress : '', seniorityYear : 1, seniorityMonth : 0, concept : '', - experience : '', + experiences : '', awards : '', communicationStyle: [] as string[], - } - - formValidStatus = { - name : true, - title : true, - companyAddress: true, - serveArea : true, - seniorityYear : true, - seniorityMonth: true, - expert : true, - concept : true, - experience : true, - awards : true, - communicationStyle:true + photoBase64 : '', + phoneNumber : '', + email : '', }; - expertList=[ + communicationStyleList: string[] = agentCommunicationStyleList; + role = Role; + + agentExpertList = [ { - name:'�摨瑁����' - }, - { - name:'摮戊��' - }, - { - name:'鞈閬��' - }, - { - name:'璅暑��隡�' - }, - { - name:'靽�瑼�/閬��' + title:'�摨瑁����', + label:'�摨瑁����' }, { - name:'����'} - ]; + title:'摮戊��', + label:'摮戊��' + }, + { + title:'鞈閬��', + label:'鞈閬��' + }, + { + title:'璅暑��隡�', + label:'璅暑��隡�' + }, + { + title:'靽�瑼�/閬��', + label:'靽�瑼�/閬��' + }, + { + title:'����', + label:'����' + }]; - communicationStyleList: string[] = ['雓寞��祕', '��翰銝餃��', '���', '�隢◢頞�']; + agentCommunicationStyleList = [ + { + title:'雓寞��祕', + label:'雓寞��祕' + }, + { + title:'��翰銝餃��', + label:'��翰銝餃��' + }, + { + title:'���', + label:'���' + }, + { + title:'�隢◢頞�', + label:'�隢◢頞�' + }]; ////////////////////////////////////////////////////////////////////// @@ -247,10 +376,66 @@ } mounted(){ - this.setAgentInfo(this.agentInfo); + this.setAgentInfo(this.agentInfo); } + private setAgentInfo(agentInfo: AgentInfo): void { + const [agentYear, _yearUnit , agentMonth, _monthUnit] = agentInfo.seniority.split(" "); + this.defaultAgentInfoSetting = { + agentNo : agentInfo.agentNo||'', + name : agentInfo.name || '', + expertise : agentInfo.expertise || [], + title : agentInfo.title || '', + role : agentInfo.role||'', + serveArea : agentInfo?.serveArea.split('��'), + gender : agentInfo.gender||'', + phoneNumber : agentInfo.phoneNumber||'', + companyAddress : agentInfo.companyAddress || '', + seniorityYear : agentYear? +agentYear : 0, + seniorityMonth : agentMonth ? +agentMonth : 0, + concept : agentInfo.concept || '', + experiences : agentInfo.experiences || '', + awards : agentInfo.awards || '', + communicationStyle: agentInfo.communicationStyle || '', + photoBase64 : '', + email : agentInfo.email || '' + }; + + this.editInfoValue = { + ...this.defaultAgentInfoSetting, + expertise : _.cloneDeep(this.defaultAgentInfoSetting.expertise), + // TODO: 蝣箄��垢甇斗���垢���隞�" , "���� [Tomas, 2021/12/28] + communicationStyle : this.defaultAgentInfoSetting.communicationStyle.split('��'), + } + } + + ////////////////////////////////////////////////////////////////////// + + editAgentInfoSetting(): void { + console.log('???', this.editInfoValue) + const editSettingInfo: any = { + ...this.editInfoValue, + communicationStyle: this.editInfoValue.communicationStyle.join('��'), + serveArea: this.editInfoValue.serveArea.join('��'), + }; + console.log('!!!', editSettingInfo); + accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => { + this.isInfoUpdate = true; + this.updateConsultantDetail(editSettingInfo.agentNo); + }); + } + + backToInfo() { + this.isInfoUpdate = false + this.$router.push(`/agentInfo/${this.agentInfo.agentNo}`); + } + + selectCommunicationStyles(): void { + if (this.editInfoValue.communicationStyle.length > 2) { + this.editInfoValue.communicationStyle.shift(); + } + } alertFieldInfo(field: string): void { this.isAlertFieldInfo = true; @@ -259,156 +444,54 @@ this.fieldInfoTitle = '���漲'; this.fieldInfoDesc = '���漲��������翰�祟�敺����雿�憿批����脰�������蝯行�����潘��隞乩������“������潦��'; break; - case 'evaluation': - this.fieldInfoTitle = '隢株岷摨西”�'; - this.fieldInfoDesc = '隢株岷摨西”��撠��雿�憿批�������垣閰X���脰�������蝯行�����潦��'; - break; + // case 'evaluation': + // this.fieldInfoTitle = '隢株岷摨西”�'; + // this.fieldInfoDesc = '隢株岷摨西”��撠��雿�憿批�������垣閰X���脰�������蝯行�����潦��'; + // break; } } //////////////////////////////////////////////////////////// - - private setAgentInfo(agentInfo: AgentInfo): void { - const [agentYear, _yearUnit , agentMonth, _monthUnit] = agentInfo.seniority.split(" "); - - this._agentInfoSetting = { - agentNo : agentInfo.agentNo||'', - name : agentInfo.name || '', - expertise : agentInfo.expertise || [], - title : agentInfo.title || '', - role : agentInfo.role||'', - serveArea : agentInfo.serveArea || '', - gender : agentInfo.gender||'', - phoneNumber : agentInfo.phoneNumber||'', - companyAddress : agentInfo.companyAddress || '', - seniorityYear : agentYear? +agentYear : 0, - seniorityMonth : agentMonth ? +agentMonth: 0, - concept : agentInfo.concept || '', - experience : agentInfo.experiences || '', - award : agentInfo.awards || '', - communicationStyle: agentInfo.communicationStyle || '', - photoBase64 : '123', - }; - - this.editInfoValue.name = this._agentInfoSetting.name!; - this.editInfoValue.title = this._agentInfoSetting.title!; - this.editInfoValue.serveArea = this._agentInfoSetting.serveArea - this.editInfoValue.companyAddress = this._agentInfoSetting.companyAddress; - this.editInfoValue.seniorityYear = this._agentInfoSetting.seniorityYear; - this.editInfoValue.seniorityMonth = this._agentInfoSetting.seniorityMonth; - this.editInfoValue.expert = _.cloneDeep(this._agentInfoSetting.expertise); - this.editInfoValue.concept = this._agentInfoSetting.concept; - this.editInfoValue.experience = this._agentInfoSetting.experience; - this.editInfoValue.awards = this._agentInfoSetting.award; - this.editInfoValue.communicationStyle = this._agentInfoSetting.communicationStyle.split(','); - + get nameValid(): boolean { + return !!this.defaultAgentInfoSetting?.name; } - get nameValid():boolean { - this.formValidStatus.name = this.editInfoValue.name ? true : false; - return this.formValidStatus.name; - } + get phoneValid(): boolean { + const rule = /^09[0-9]{8}$/; + return this.editInfoValue.phoneNumber + ? rule.test(this.editInfoValue.phoneNumber) && _.isEqual(this.editInfoValue.phoneNumber.length,10) + : true; + } - get titleValid():boolean{ - this.formValidStatus.title = this.editInfoValue.title ? true : false ; - return this.formValidStatus.title; - } - - get companyAddressValid() : boolean{ - this.formValidStatus.companyAddress = this.editInfoValue.companyAddress ? true : false; - return this.formValidStatus.companyAddress; - } - - get serveAreaValid():boolean{ - this.formValidStatus.serveArea = this.editInfoValue.serveArea ? true : false; - return this.formValidStatus.serveArea; - } - - get conceptValid():boolean{ - this.formValidStatus.concept = this.editInfoValue.concept ? true : false; - return this.formValidStatus.concept; - } - - get experienceValid():boolean{ - this.formValidStatus.experience = this.editInfoValue.experience ? true : false; - return this.formValidStatus.experience; - } - - get awardsValid():boolean{ - this.formValidStatus.awards = this.editInfoValue.awards ? true : false ; - return this.formValidStatus.awards; - } - - get seniorityYearValid():boolean{ - this.formValidStatus.seniorityYear = this.editInfoValue.seniorityYear ? true : false; - return this.formValidStatus.seniorityYear; - } - - get seniorityMonthValid():boolean{ - this.formValidStatus.seniorityMonth = this.editInfoValue.seniorityMonth ? true : false; - return this.formValidStatus.seniorityYear; - } - - get communicationStyleValid():boolean{ - this.formValidStatus.communicationStyle = this.editInfoValue.communicationStyle ? true : false; - return this.formValidStatus.seniorityMonth; - } - - get expertValid():boolean{ - this.formValidStatus.expert = this.editInfoValue.expert ? true : false; - return this.formValidStatus.expert; - } + get emailValid() { + const rule = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; + return this.editInfoValue.email ? rule.test(this.editInfoValue.email) : true; + } get isSubmitBtnDisabled(): boolean { - const isFormValid = this.formValidStatus.name - && this.formValidStatus.title - && this.formValidStatus.companyAddress - && this.formValidStatus.serveArea - && this.formValidStatus.concept - && this.formValidStatus.experience - && this.formValidStatus.awards - && this.formValidStatus.seniorityYear - && this.formValidStatus.seniorityMonth - && this.formValidStatus.expert - && this.formValidStatus.communicationStyle; - return !isFormValid - } - - - - editAgentInfoSetting(): void { - const editSettingInfo: any = { - name : this.editInfoValue.name, - expertise : this.editInfoValue.expert, - title : this.editInfoValue.title, - role : this.agentInfo.role, - serveArea : this.editInfoValue.serveArea, - gender : 'male', - phoneNumber : this.agentInfo.phoneNumber, - companyAddress : this.editInfoValue.companyAddress, - seniorityYear : this.editInfoValue.seniorityYear, - seniorityMonth : this.editInfoValue.seniorityMonth, - concept : this.editInfoValue.concept, - experience : this.editInfoValue.experience, - award : this.editInfoValue.awards, - communicationStyle: this.editInfoValue.communicationStyle.join(','), - photoBase64 : '123' - } - - accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => { - console.log(editSettingInfo) - }); - } - + const isFormValid = this.editInfoValue.name + && this.editInfoValue.title + && this.editInfoValue.companyAddress + && this.editInfoValue.serveArea + && this.editInfoValue.concept + && this.editInfoValue.experiences + && this.editInfoValue.phoneNumber.length + && this.editInfoValue.seniorityYear + && this.editInfoValue.expertise.length + && this.editInfoValue.communicationStyle.length + && this.editInfoValue.email.length; + return !isFormValid + } } </script> <style lang="scss"> + .pam-icon { - font-size: 15px; + font-size : 15px; padding-right: 8px; - color: $PRUDENTIAL_GREY; + color : $PRUDENTIAL_GREY; &.icon--primary { color: $PRIMARY_RED; } @@ -423,9 +506,9 @@ font-size: 12px; } .pam-field__title { - font-size: 16px; + font-size : 16px; font-weight: bold; - display: flex; + display : flex; align-items: center; } } @@ -444,13 +527,13 @@ } .pam-field-experts { - display: flex; + display : flex; flex-wrap: wrap; } .pam-progress__label { justify-content: space-between; - flex-wrap: wrap; + flex-wrap : wrap; line-height: 24px; } .account-confirm{ @@ -459,8 +542,11 @@ } .seniority-input{ - width:50px; + width : 60px; margin-right: 5px; } +.el-input--suffix .el-input__inner { + padding-right: 20px; +} -</style> \ No newline at end of file +</style> -- Gitblit v1.8.0