<template>
|
<div class="edit-agent-info-page">
|
|
<el-row
|
type="flex"
|
justify="center">
|
<EditConsultantAvatar
|
:agentNo="agentInfo.agentNo"
|
:photoBase64.sync="editInfoValue.photoBase64"/>
|
</el-row>
|
|
<!-- NOTE: 我認為編輯頁面不需要顯示 avgScore,先隱藏 [Tomas, 2022/2/10 13:55] -->
|
<!-- <el-row
|
type="flex"
|
class="pt-10"
|
justify="center"
|
align="middle" v-if="!hideReviews">
|
<i class="pam-icon icon--primary icon-star"></i>
|
<h3 class="mdTxt">{{ agentInfo.avgScore }}</h3>
|
</el-row> -->
|
|
<!-- <el-row
|
type="flex"
|
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">
|
<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>
|
|
<el-row
|
type="flex"
|
class="pam-paragraph">
|
<UiField icon="company" label="服務地區">
|
<MultiSelectBtn class="mt-30"
|
:mutiSelect.sync="editInfoValue.serveArea"
|
:nameOfSelectAll="'全台'"
|
:options="serveAreaOptions"
|
>
|
</MultiSelectBtn>
|
</UiField>
|
</el-row>
|
|
<el-row
|
type="flex"
|
class="pam-paragraph">
|
<UiField icon="address" label="公司地址">
|
<el-input v-model="editInfoValue.companyAddress" class="mt-10"></el-input>
|
</UiField>
|
</el-row>
|
|
<el-row
|
type="flex"
|
class="pam-paragraph">
|
<UiField :span="12" icon="time" label="最後上線時間">
|
{{ agentInfo.latestLoginTime | formatDate }}
|
</UiField>
|
<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
|
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">
|
<i class="pam-icon icon-thumbs-up"
|
></i>諮詢度表現 <i class="pl-5 text--primary icon-information" @click="alertFieldInfo('evaluation')"></i>
|
</div>
|
</div>
|
<div class="xsTxt">
|
{{ agentInfo.evaluation }}/50 (近一個月/累計)
|
</div>
|
</div>
|
<div class="pam-field__content pam-field-evaluation pt-10">
|
<el-progress :show-text="false" :stroke-width="15" :percentage="agentInfo.evaluation * 2"></el-progress>
|
</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">
|
<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">
|
<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" class="mt-10"></el-input>
|
</UiField>
|
</el-row>
|
|
<el-row
|
type="flex"
|
class="pam-paragraph">
|
<UiField icon="school" label="個人背景">
|
<el-input
|
autosize
|
type="textarea"
|
class="mt-10"
|
v-model="editInfoValue.experiences">
|
</el-input>
|
</UiField>
|
</el-row>
|
|
<el-row
|
type="flex"
|
class="pam-paragraph">
|
<UiField icon="trophy" label="得獎經歷">
|
<el-input type="textarea" autosize style="height:70%" v-model="editInfoValue.awards" class="mt-10"></el-input>
|
</UiField>
|
</el-row>
|
|
<PopUpFrame
|
:isOpen.sync="isAlertFieldInfo"
|
>
|
<div class="text--center mdTxt fs-18">
|
<p>{{ fieldInfoTitle }}</p>
|
<p class="mt-20 text--left text--regular">{{ fieldInfoDesc }}</p>
|
<div class="text--center mt-30">
|
<el-button
|
type="primary"
|
@click="isAlertFieldInfo = false"
|
>我知道了</el-button>
|
</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">
|
送出
|
</el-button>
|
</div>
|
</div>
|
</template>
|
|
<script lang="ts">
|
import { Context } from '@nuxt/types';
|
import { namespace } from 'nuxt-property-decorator';
|
import { Vue, Component, Prop } from 'vue-property-decorator';
|
import * as _ from "lodash";
|
|
import myConsultantService from '~/shared/services/my-consultant.service';
|
import accountSettingService from '~/shared/services/account-setting.service';
|
|
import { AgentInfo } from '~/shared/models/agent-info.model';
|
import { hideReviews } from '~/shared/const/hide-reviews';
|
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 localStorageTest = namespace('localStorage');
|
const loginStore = namespace('login.store');
|
|
@Component
|
export default class AgentInfoEditComponent extends Vue {
|
|
@localStorageTest.State
|
current_role: any;
|
|
@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 : '',
|
expertise : [] as string[],
|
title : '',
|
serveArea : [] as string[],
|
companyAddress : '',
|
seniorityYear : 1,
|
seniorityMonth : 0,
|
concept : '',
|
experiences : '',
|
awards : '',
|
communicationStyle: [] as string[],
|
photoBase64 : '',
|
phoneNumber : '',
|
email : '',
|
};
|
|
communicationStyleList: string[] = agentCommunicationStyleList;
|
role = Role;
|
|
agentExpertList = [
|
{
|
title:'健康與保障',
|
label:'健康與保障'
|
},
|
{
|
title:'子女教育',
|
label:'子女教育'
|
},
|
{
|
title:'資產規劃',
|
label:'資產規劃'
|
},
|
{
|
title:'樂活退休',
|
label:'樂活退休'
|
},
|
{
|
title:'保單健檢/規劃',
|
label:'保單健檢/規劃'
|
},
|
{
|
title:'分紅保單',
|
label:'分紅保單'
|
}];
|
|
agentCommunicationStyleList = [
|
{
|
title:'謹慎務實',
|
label:'謹慎務實'
|
},
|
{
|
title:'明快主動',
|
label:'明快主動'
|
},
|
{
|
title:'耐心傾聽',
|
label:'耐心傾聽'
|
},
|
{
|
title:'健談風趣',
|
label:'健談風趣'
|
}];
|
|
//////////////////////////////////////////////////////////////////////
|
|
async asyncData(context: Context) {
|
const agentNo = context.route.params.agentNo;
|
return {
|
agentInfo: await myConsultantService.getConsultantDetail(agentNo).then((res) => res)
|
}
|
}
|
|
mounted(){
|
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;
|
switch(field) {
|
case 'suitability':
|
this.fieldInfoTitle = '匹配度';
|
this.fieldInfoDesc = '匹配度是透過嚴選配對或快速篩選後,將每一位保險顧問資料進行比對後排序推薦給您的媒合數值,您可以作為選擇適合顧問的參考值。';
|
break;
|
// case 'evaluation':
|
// this.fieldInfoTitle = '諮詢度表現';
|
// this.fieldInfoDesc = '諮詢度表現是將每一位保險顧問近一個月回覆諮詢數量進行比對後排序推薦給您的媒合數值。';
|
// break;
|
}
|
}
|
|
////////////////////////////////////////////////////////////
|
get nameValid(): boolean {
|
return !!this.defaultAgentInfoSetting?.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 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.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;
|
padding-right: 8px;
|
color : $PRUDENTIAL_GREY;
|
&.icon--primary {
|
color: $PRIMARY_RED;
|
}
|
}
|
.pam-field {
|
display: flex;
|
flex-direction: column;
|
.pam-field__label {
|
display: flex;
|
align-items: center;
|
.pam-icon {
|
font-size: 12px;
|
}
|
.pam-field__title {
|
font-size : 16px;
|
font-weight: bold;
|
display : flex;
|
align-items: center;
|
}
|
}
|
}
|
|
.pam-field-suitability {
|
.el-progress-bar__inner {
|
background-color: $LIGHT_BLUE !important;
|
}
|
}
|
|
.pam-field-evaluation {
|
.el-progress-bar__inner {
|
background-color: $TEAL_GREEN!important;
|
}
|
}
|
|
.pam-field-experts {
|
display : flex;
|
flex-wrap: wrap;
|
}
|
|
.pam-progress__label {
|
justify-content: space-between;
|
flex-wrap : wrap;
|
line-height: 24px;
|
}
|
.account-confirm{
|
display: flex;
|
justify-content: center;
|
}
|
|
.seniority-input{
|
width : 60px;
|
margin-right: 5px;
|
}
|
.el-input--suffix .el-input__inner {
|
padding-right: 20px;
|
}
|
|
</style>
|