From f316bd2d97efb54ef48fde17b4e38fba2fc7b1aa Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期四, 11 一月 2024 17:17:01 +0800
Subject: [PATCH] project: remove lodash library

---
 PAMapp/pages/agentInfo/edit/_agentNo.vue |  420 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 310 insertions(+), 110 deletions(-)

diff --git a/PAMapp/pages/agentInfo/edit/_agentNo.vue b/PAMapp/pages/agentInfo/edit/_agentNo.vue
index e5c3bbf..cb4f9b3 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" v-if="!!agentInfo">
+
       <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
+      <!-- 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,18 @@
         <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="������" class="pam-editInfo-date-picker">
+          <UiDatePicker
+              :isFutureDateDisabled = true
+              id="el-date-picker"
+              class="mt-10"
+              :defaultValue ="agentInfo.entryDate"
+              @changeDate="onChangeDate($event)"
+          ></UiDatePicker>
         </UiField>
       </el-row>
 
-      <el-row
+      <!-- <el-row
         type="flex"
         class="pam-paragraph">
         <el-col :span="24" class="pam-field">
@@ -85,39 +155,54 @@
             <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">
-        <UiField icon="flag" label="皞�◢�">
-        <el-checkbox
-            v-model="editInfoValue.communicationStyle"
-            :label="communicateStyle"
-            :key="index"
-            v-for="(communicateStyle, index) in communicationStyleList">
-          </el-checkbox>
-        </UiField>
-
-      </el-row>
-      <el-row
-        type="flex"
-        class="pam-paragraph">
-        <UiField icon="flag" label="撠����">
-          <el-checkbox
-            v-model="editInfoValue.expertise"
-            :label="expert"
-            :key="index"
-            v-for="(expert, index) 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>
 
@@ -125,7 +210,12 @@
         type="flex"
         class="pam-paragraph">
         <UiField icon="school" label="�犖��">
-            <el-input type="textarea" autosize v-model="editInfoValue.experiences"></el-input>
+            <el-input
+              autosize
+              type="textarea"
+              class="mt-10"
+              v-model="editInfoValue.experiences">
+            </el-input>
         </UiField>
       </el-row>
 
@@ -133,7 +223,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>
 
@@ -151,7 +241,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">
@@ -164,8 +263,7 @@
 <script lang="ts">
 import { Context } from '@nuxt/types';
 import { namespace } from 'nuxt-property-decorator';
-import { Vue, Component } from 'vue-property-decorator';
-import * as _ from "lodash";
+import { Vue, Component, Prop } from 'vue-property-decorator';
 
 import myConsultantService from '~/shared/services/my-consultant.service';
 import accountSettingService from '~/shared/services/account-setting.service';
@@ -174,42 +272,94 @@
 import { hideReviews } from '~/shared/const/hide-reviews';
 import { AgentInfoSetting } from '~/shared/models/account.model';
 import { Role } from '~/shared/models/enum/Role';
-import { agentExpertList } from '~/shared/const/agent-expert-list';
 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;
+  @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[],
+    expertise         : [] as string[],
     title             : '',
-    serveArea         : '',
+    serveArea         : [] as string[],
     companyAddress    : '',
-    seniorityYear     : 1,
-    seniorityMonth    : 0,
     concept           : '',
-    experiences        : '',
+    experiences       : '',
     awards            : '',
     communicationStyle: [] as string[],
+    photoBase64       : '',
+    phoneNumber       : '',
+    email             : '',
+    entryDate         : '',
   };
 
   communicationStyleList: string[] = agentCommunicationStyleList;
-  expertList: string[] = agentExpertList;
   role           = Role;
+
+  agentExpertList = [
+    {
+        title:'�摨瑁����',
+        label:'�摨瑁����'
+    },
+    {
+        title:'摮戊��',
+        label:'摮戊��'
+    },
+    {
+        title:'鞈閬��',
+        label:'鞈閬��'
+    },
+    {
+        title:'璅暑��隡�',
+        label:'璅暑��隡�'
+    },
+    {
+        title:'靽�瑼�/閬��',
+        label:'靽�瑼�/閬��'
+    },
+    {
+        title:'����',
+        label:'����'
+    }];
+
+  agentCommunicationStyleList = [
+    {
+        title:'雓寞��祕',
+        label:'雓寞��祕'
+    },
+    {
+        title:'��翰銝餃��',
+        label:'��翰銝餃��'
+    },
+    {
+        title:'���',
+        label:'���'
+    },
+    {
+        title:'�隢◢頞�',
+        label:'�隢◢頞�'
+    }];
 
   //////////////////////////////////////////////////////////////////////
 
@@ -222,39 +372,79 @@
 
   mounted(){
     this.setAgentInfo(this.agentInfo);
+
+    const bodyEl = document.querySelector('body');
+
+    bodyEl?.addEventListener('scroll', function() {
+      const elDatePickerEl = document.querySelector('#el-date-picker');
+      const elDatePickerPanelEl = document.querySelector('.el-picker-panel');
+      if (elDatePickerPanelEl) {
+        elDatePickerPanelEl['style']['z-index'] = 5;
+        const elDatePickerOffsetTop = elDatePickerEl!.getBoundingClientRect().top;
+        elDatePickerPanelEl!['style'].top = elDatePickerOffsetTop + 30 + 'px';
+      }
+    });
+
   }
 
   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.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 || '',
+      concept: agentInfo?.concept || '',
+      experiences: agentInfo?.experiences || '',
+      awards: agentInfo?.awards || '',
+      communicationStyle: agentInfo?.communicationStyle || '',
+      photoBase64: '',
+      email: agentInfo?.email || '',
+      entryDate: agentInfo?.entryDate || '',
     };
 
     this.editInfoValue = {
-      ...this._agentInfoSetting,
-      expertise          : _.cloneDeep(this._agentInfoSetting.expertise),
-      // TODO: 蝣箄��垢甇斗���垢���隞�" , "���� [Tomas, 2021/12/28]
-      communicationStyle : this._agentInfoSetting.communicationStyle.split('��')
-    }
+      ...this.defaultAgentInfoSetting,
+      expertise: JSON.parse(JSON.stringify(this.defaultAgentInfoSetting.expertise)),
+      communicationStyle: this.defaultAgentInfoSetting.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;
+      this.updateConsultantDetail(editSettingInfo.agentNo);
+    });
+  }
+
+  onChangeDate(date: any): void {
+    this.editInfoValue.entryDate = date;
+  }
+
+  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;
@@ -263,14 +453,29 @@
         this.fieldInfoTitle = '���漲';
         this.fieldInfoDesc = '���漲��������翰�祟�敺����雿�憿批����脰�������蝯行�����潘��隞乩������“������潦��';
         break;
-      case 'evaluation':
-        this.fieldInfoTitle = '隢株岷摨西”�';
-        this.fieldInfoDesc = '隢株岷摨西”��撠��雿�憿批�������垣閰X���脰�������蝯行�����潦��';
-        break;
+      // case 'evaluation':
+      //   this.fieldInfoTitle = '隢株岷摨西”�';
+      //   this.fieldInfoDesc = '隢株岷摨西”��撠��雿�憿批�������垣閰X���脰�������蝯行�����潦��';
+      //   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) && 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
@@ -279,33 +484,19 @@
                         && this.editInfoValue.serveArea
                         && this.editInfoValue.concept
                         && this.editInfoValue.experiences
-                        && this.editInfoValue.awards
-                        && this.editInfoValue.seniorityYear
-                        && this.editInfoValue.seniorityMonth
-                        && this.editInfoValue.expertise
-                        && this.editInfoValue.communicationStyle;
+                        && this.editInfoValue.phoneNumber.length
+                        && this.editInfoValue.entryDate
+                        && this.editInfoValue.expertise.length
+                        && this.editInfoValue.communicationStyle.length
+                        && this.editInfoValue.email.length;
       return !isFormValid
   }
-
-
-
-  editAgentInfoSetting(): void {
-    const editSettingInfo: any = {
-      ...this.editInfoValue,
-      communicationStyle: this.editInfoValue.communicationStyle.join('��'),
-      photoBase64       : '',
-    }
-
-    accountSettingService.editAgentInfoSetting(editSettingInfo).then((res: AgentInfoSetting) => {
-      console.log(editSettingInfo)
-    });
-  }
-
 }
 
 </script>
 
 <style lang="scss">
+
 .pam-icon {
   font-size    : 15px;
   padding-right: 8px;
@@ -360,8 +551,17 @@
 }
 
 .seniority-input{
-  width       : 50px;
+  width       : 60px;
   margin-right: 5px;
 }
+.el-input--suffix .el-input__inner {
+  padding-right: 20px;
+}
+
+.pam-editInfo-date-picker{
+  .pam-date.el-input {
+      width: 100%;
+  }
+}
 
 </style>

--
Gitblit v1.8.0