保誠-保戶業務員媒合平台
PAMapp/pages/agentInfo/edit/_agentNo.vue
@@ -1,11 +1,12 @@
<template>
    <div>
    <div class="edit-agent-info-page">
      <el-row
        type="flex"
        justify="center">
        <UiAvatar :size="150" :agentNo="agentInfo.agentNo"></UiAvatar>
        <EditConsultantAvatar
          :agentNo="agentInfo.agentNo"
          :photoBase64.sync="editInfoValue.photoBase64"/>
      </el-row>
      <el-row
        type="flex"
        class="pt-10"
@@ -18,10 +19,33 @@
      <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-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"
@@ -56,13 +80,13 @@
        <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
            <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>月
            </el-option>
          </el-select>月
        </UiField>
      </el-row>
@@ -86,29 +110,48 @@
          </div>
        </el-col>
      </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">
@@ -147,7 +190,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 +212,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,77 +220,89 @@
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';
const localStorage = namespace('localStorage');
const testImgBase64 =""
const localStorageTest = namespace('localStorage');
@Component
export default class AgentInfoComponent extends Vue {
  @localStorage.State('current_role')
  @localStorageTest.State('current_role')
  currentRole!:string | null;
  _agentInfoSetting!: AgentInfoSetting;
  agentInfo!:AgentInfo
  role = Role;
  isAlertFieldInfo         = false;
  fieldInfoTitle           = '';
  fieldInfoDesc            = '';
  hideReviews              = hideReviews ;
  agentInfo!      : AgentInfo
  fieldInfoDesc   : string = '';
  fieldInfoTitle  : string = '';
  hideReviews     : boolean = hideReviews ;
  isAlertFieldInfo: boolean = false;
  isInfoUpdate    : boolean = false;
  editInfoValue = {
    agentNo           : '',
    name              : '',
    expert            : [] as string[],
    expertise         : [] as string[],
    title             : '',
    serveArea         : '',
    companyAddress    : '',
    seniorityYear     : 1,
    seniorityMonth    : 0,
    concept           : '',
    experiences        : '',
    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       : ''
  };
  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:'健談風趣'
    }];
  //////////////////////////////////////////////////////////////////////
@@ -250,10 +314,60 @@
  }
  mounted(){
    this.setAgentInfo(this.agentInfo);
    this.setAgentInfo(this.agentInfo);
  }
  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 || '',
      experiences       : agentInfo.experiences  || '',
      awards            : agentInfo.awards || '',
      communicationStyle: agentInfo.communicationStyle || '',
      photoBase64       : ''
    };
    this.editInfoValue = {
      ...this._agentInfoSetting,
      expertise          : _.cloneDeep(this._agentInfoSetting.expertise),
      // TODO: 確認後端此欄位後端應改為以" , "隔開 [Tomas, 2021/12/28]
      communicationStyle : this._agentInfoSetting.communicationStyle.split('、'),
    }
  }
  //////////////////////////////////////////////////////////////////////
  editAgentInfoSetting(): void {
    const editSettingInfo: any = {
      ...this.editInfoValue,
      communicationStyle: this.editInfoValue.communicationStyle.join('、'),
    }
    accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => {
      this.isInfoUpdate = true;
    });
  }
  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;
@@ -268,161 +382,41 @@
        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 || '',
                  experiences        : agentInfo.experiences  || '',
                  awards             : agentInfo.awards || '',
                  communicationStyle: agentInfo.communicationStyle || '',
                  photoBase64       : '',
              };
                this.editInfoValue.agentNo
                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.experiences     = this._agentInfoSetting.experiences;
                this.editInfoValue.awards         = this._agentInfoSetting.awards;
                this.editInfoValue.communicationStyle = this._agentInfoSetting.communicationStyle.split(',');
  }
  get nameValid():boolean {
      this.formValidStatus.name = this.editInfoValue.name ? true : false;
      return this.formValidStatus.name;
  }
  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.experiences ? 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 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 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 = {
                agentNo           :this.agentInfo.agentNo,
                name              : this.editInfoValue.name,
                expertise         : this.editInfoValue.expert,
                title             : this.editInfoValue.title,
                role              : this.agentInfo.role,
                serveArea         : this.editInfoValue.serveArea,
                gender            : this.agentInfo.gender,
                phoneNumber       : this.agentInfo.phoneNumber,
                companyAddress    : this.editInfoValue.companyAddress,
                seniorityYear     : this.editInfoValue.seniorityYear,
                seniorityMonth    : this.editInfoValue.seniorityMonth,
                concept           : this.editInfoValue.concept,
                experiences        : this.editInfoValue.experiences,
                awards             : this.editInfoValue.awards,
                communicationStyle: this.editInfoValue.communicationStyle.join(','),
                photoBase64       : ''
            }
            accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => {
              console.log(editSettingInfo)
            });
        }
  // handleRemove(file) {
  //       console.log(file);
  //     }
  //     handlePictureCardPreview(file) {
  //       this.photoBase64 = file.url;
  //       this.dialogVisible = true;
  //     }
  //     handleDownload(file) {
  //       console.log(file);
  //     }
      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;
      return !isFormValid
  }
}
</script>
<style lang="scss">
.pam-icon {
<style lang="scss" >
.edit-agent-info-page{
  .el-textarea__inner{
  font-size: 15px;
}
}
.pam-icon {
  font-size    : 15px;
  padding-right: 8px;
  color: $PRUDENTIAL_GREY;
  color        : $PRUDENTIAL_GREY;
  &.icon--primary {
    color: $PRIMARY_RED;
  }
@@ -437,9 +431,9 @@
      font-size: 12px;
    }
    .pam-field__title {
      font-size: 16px;
      font-size  : 16px;
      font-weight: bold;
      display: flex;
      display    : flex;
      align-items: center;
    }
  }
@@ -458,13 +452,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{
@@ -473,8 +467,14 @@
}
.seniority-input{
  width:50px;
  width       : 50px;
  margin-right: 5px;
}
.el-input--suffix .el-input__inner {
  padding-right: 20px;
}
</style>
.el-textarea__inner{
  font-size: 18px;
}
</style>