From 31f6ff0ebbf3d374e6e0acdeda72bccdd86de2d5 Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期四, 10 二月 2022 14:16:15 +0800
Subject: [PATCH] update#134662: [ 顧問管理流程 ] 編輯顧問個人資料 : 所在地區,無產生選擇器

---
 PAMapp/pages/agentInfo/edit/_agentNo.vue |  455 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 231 insertions(+), 224 deletions(-)

diff --git a/PAMapp/pages/agentInfo/edit/_agentNo.vue b/PAMapp/pages/agentInfo/edit/_agentNo.vue
index 61aa91c..f0bc55f 100644
--- a/PAMapp/pages/agentInfo/edit/_agentNo.vue
+++ b/PAMapp/pages/agentInfo/edit/_agentNo.vue
@@ -1,27 +1,50 @@
 <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"
         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
         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"
@@ -35,7 +58,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>
 
@@ -56,13 +84,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 +114,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 +194,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 +216,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 +224,91 @@
 
 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 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;
+  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           : '',
-    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 +320,61 @@
   }
 
   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.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       : ''
+    };
+
+    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('��'),
+      serveArea: this.editInfoValue.serveArea.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 +389,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 +438,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 +459,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 +474,14 @@
 }
 
 .seniority-input{
-  width:50px;
+  width       : 50px;
   margin-right: 5px;
 }
+.el-input--suffix .el-input__inner {
+  padding-right: 20px;
+}
 
-</style>
\ No newline at end of file
+.el-textarea__inner{
+  font-size: 18px;
+}
+</style>

--
Gitblit v1.8.0