From 18098111cc905e88524e7d9ce788b742637e0824 Mon Sep 17 00:00:00 2001
From: Mila <Mila@pollex.com.tw>
Date: 星期二, 14 十二月 2021 16:02:04 +0800
Subject: [PATCH] refactor: 快速篩選 1. 整理 methods 順序 2. 整理 interface、const

---
 PAMapp/components/QuickFilter/QuickFilterSelector.vue       |   13 --
 PAMapp/pages/quickFilter/index.vue                          |  107 ++++++++------------------
 PAMapp/components/QuickFilter/QuickFilterConsultantList.vue |   17 ++--
 PAMapp/assets/ts/models/quickFilter.model.ts                |   24 ++++++
 PAMapp/store/localStorage.ts                                |    2 
 PAMapp/assets/ts/api/consultant.ts                          |   10 --
 PAMapp/assets/ts/const/quickFilter-questionList.ts          |   36 +++++++++
 7 files changed, 107 insertions(+), 102 deletions(-)

diff --git a/PAMapp/assets/ts/api/consultant.ts b/PAMapp/assets/ts/api/consultant.ts
index 2cf639b..d3462a4 100644
--- a/PAMapp/assets/ts/api/consultant.ts
+++ b/PAMapp/assets/ts/api/consultant.ts
@@ -5,6 +5,7 @@
 import { UserSetting } from '../models/account.model';
 import { Consultant } from '~/assets/ts/models/consultant.model';
 import { http } from '../services/httpClient';
+import { FastQueryParams } from '../models/quickFilter.model';
 
 // 憿批恥��(TODO: OTP隤����� ���蝙�)
 export function login(user: any) {
@@ -34,7 +35,7 @@
 
 // 敹恍�祟�
 export function fastQuery(data: FastQueryParams) {
-    return http.post('/consultant/fastQuery', data)
+    return http.post<Consultant[]>('/consultant/fastQuery', data).then(res => res.data);
 }
 
 // ������
@@ -138,13 +139,6 @@
         Authorization: 'Bearer ' + localStorage.getItem('id_token')
     }
     return http.put('/appointment', editAppointmentParams, {headers});
-}
-
-export interface FastQueryParams {
-    gender             : string,
-    communicationStyles: string[],
-    avgScore           : number,
-    status             : string
 }
 
 export interface AppointmentRequests {
diff --git a/PAMapp/assets/ts/const/quickFilter-questionList.ts b/PAMapp/assets/ts/const/quickFilter-questionList.ts
new file mode 100644
index 0000000..ea35dca
--- /dev/null
+++ b/PAMapp/assets/ts/const/quickFilter-questionList.ts
@@ -0,0 +1,36 @@
+import { QuestionOption } from "../models/quickFilter.model";
+
+export const questionList: QuestionOption[] = [
+    {
+        name: 'gender',
+        title: '憿批��批',
+        detail: [
+            { name: '���', value: 'male', className: 'btn_man'},
+            { name: '憟單��', value: 'female', className: 'btn_woman'}
+        ],
+        type: 'radio'
+    },
+    // { TODO:���遛��漲
+    //     name: 'avgScore',
+    //     title: '憿批�遛��漲',
+    //     detail: [],
+    //     type: ''
+    // },
+    {
+        name: 'communicationStyles',
+        title: '皞�◢�',
+        detail: [
+            { value: '雓寞��祕', className: 'btn_owl'},
+            { value: '��翰銝餃��', className: 'btn_tiger'},
+            { value: '���', className: 'btn_koala'},
+            { value: '�隢◢頞�', className: 'btn_peacock'}
+        ],
+        type: 'checkbox'
+    },
+    // {
+    //     name: 'status',
+    //     title: '銝�����',
+    //     detail: [],
+    //     type: 'radio'
+    // }
+];
\ No newline at end of file
diff --git a/PAMapp/assets/ts/models/quickFilter.model.ts b/PAMapp/assets/ts/models/quickFilter.model.ts
new file mode 100644
index 0000000..9445659
--- /dev/null
+++ b/PAMapp/assets/ts/models/quickFilter.model.ts
@@ -0,0 +1,24 @@
+export interface QuestionOption {
+    title: string;
+    detail: Detail[];
+    type: string;
+    name: string;
+}
+
+interface Detail {
+    value: string;
+    name?: string;
+    className: string;
+}
+
+export interface FastQueryParams {
+    gender             : string,
+    communicationStyles: string[],
+    avgScore           : number,
+    status             : string
+}
+
+export interface Selected {
+    option: string;
+    value: any;
+}
\ No newline at end of file
diff --git a/PAMapp/components/QuickFilter/QuickFilterConsultantList.vue b/PAMapp/components/QuickFilter/QuickFilterConsultantList.vue
index d76e739..4e722f1 100644
--- a/PAMapp/components/QuickFilter/QuickFilterConsultantList.vue
+++ b/PAMapp/components/QuickFilter/QuickFilterConsultantList.vue
@@ -96,6 +96,15 @@
     endYPosition = 0;
     hideReviews = hideReviews ;
 
+    openPopUp(txt: string) {
+        this.popUpTxt = txt;
+        this.isVisiblePopUp = true;
+    }
+
+    showAgentDetail(agentNo: string): void {
+        this.$router.push(`/agentInfo/${agentNo}`);
+    }
+
     moveStart(event: TouchEvent) {
         this.startPosition = event.changedTouches[0].clientX;
         this.startYPosition = event.changedTouches[0].clientY;
@@ -124,14 +133,6 @@
         (this.$refs.carouselRef as ElCarousel).prev();
     }
 
-    openPopUp(txt: string) {
-        this.popUpTxt = txt;
-        this.isVisiblePopUp = true;
-    }
-
-    showAgentDetail(agentNo: string): void {
-        this.$router.push(`/agentInfo/${agentNo}`);
-    }
 }
 </script>
 
diff --git a/PAMapp/components/QuickFilter/QuickFilterSelector.vue b/PAMapp/components/QuickFilter/QuickFilterSelector.vue
index 558e338..e6800fb 100644
--- a/PAMapp/components/QuickFilter/QuickFilterSelector.vue
+++ b/PAMapp/components/QuickFilter/QuickFilterSelector.vue
@@ -66,13 +66,10 @@
 
 <script lang="ts">
 import { Vue, Component, Prop, Watch, Emit } from 'nuxt-property-decorator';
-import { FastQueryParams } from '~/assets/ts/api/consultant';
-import { QuestionOption } from '~/pages/quickFilter/index.vue';
 import { hideReviews } from '~/assets/ts/const/hide-reviews';
+import { FastQueryParams, QuestionOption, Selected } from '~/assets/ts/models/quickFilter.model';
 @Component
 export default class QuickFilterDrawer extends Vue {
-
-
     pickedItem: FastQueryParams = {
         communicationStyles: [],
         status: '',
@@ -80,7 +77,7 @@
         avgScore: 0
     }
     hideReviews = hideReviews ;
-    
+
     @Prop() questionOption!: QuestionOption;
     @Prop() isOpenQuestionPopUp!: boolean;
     @Prop() confirmItem!: Selected[];
@@ -131,12 +128,6 @@
             value: this.pickedItem[name]
         }
     }
-
-}
-
-export interface Selected {
-    option: string;
-    value: any;
 }
 </script>
 
diff --git a/PAMapp/pages/quickFilter/index.vue b/PAMapp/pages/quickFilter/index.vue
index 2e35267..7c8764f 100644
--- a/PAMapp/pages/quickFilter/index.vue
+++ b/PAMapp/pages/quickFilter/index.vue
@@ -66,10 +66,10 @@
 
 <script lang="ts">
 import { Vue, Component, namespace } from 'nuxt-property-decorator';
-import { FastQueryParams } from '~/assets/ts/api/consultant';
 import { Consultant } from '~/assets/ts/models/consultant.model';
-import { Selected } from '~/components/QuickFilter/QuickFilterSelector.vue';
 import { fastQuery } from '~/assets/ts/api/consultant';
+import { questionList } from '~/assets/ts/const/quickFilter-questionList';
+import { FastQueryParams, QuestionOption, Selected } from '~/assets/ts/models/quickFilter.model';
 
 const localStorage = namespace('localStorage');
 @Component
@@ -81,41 +81,9 @@
     consultantList: Consultant[] = [];
     questionOption = {};
     confirmItem: Selected[] = [];
-    questionList: QuestionOption[] = [
-        {
-            name: 'gender',
-            title: '憿批��批',
-            detail: [
-                { name: '���', value: 'male', className: 'btn_man'},
-                { name: '憟單��', value: 'female', className: 'btn_woman'}
-            ],
-            type: 'radio'
-        },
-        // { TODO:���遛��漲
-        //     name: 'avgScore',
-        //     title: '憿批�遛��漲',
-        //     detail: [],
-        //     type: ''
-        // },
-        {
-            name: 'communicationStyles',
-            title: '皞�◢�',
-            detail: [
-                { value: '雓寞��祕', className: 'btn_owl'},
-                { value: '��翰銝餃��', className: 'btn_tiger'},
-                { value: '���', className: 'btn_koala'},
-                { value: '�隢◢頞�', className: 'btn_peacock'}
-            ],
-            type: 'checkbox'
-        },
-        // {
-        //     name: 'status',
-        //     title: '銝�����',
-        //     detail: [],
-        //     type: 'radio'
-        // }
-    ];
+    questionList = questionList;
 
+    //////////////// lifecycle ////////////////
     mounted() {
         if (this.quickFilterSelectedData && this.quickFilterSelectedData.length > 0) {
             this.confirmItem = this.quickFilterSelectedData;
@@ -123,26 +91,8 @@
         }
     }
 
-    gender(): string {
-        const filter = this.confirmItem.filter(item => item.option === 'gender').map(i => i.value);
-        return filter.length === 0 ? '' : filter[0];
-    }
 
-    avgScore(): number {
-        const filter = this.confirmItem.filter(item => item.option === 'avgScore').map(i => i.value);
-        return filter.length === 0 ? '' : filter[0];
-    }
-
-    communicationStyles(): string[] {
-        return this.confirmItem.filter(item => item.option === 'communicationStyles').map(i => i.value);
-    }
-
-    isActive(name: string) {
-        return name === 'gender' && !!this.gender()
-            || name === 'avgScore' && !!this.avgScore()
-            || name === 'communicationStyles' && !!this.communicationStyles().length
-    }
-
+    //////////////////////////////////////////
     openPopUp(question: QuestionOption) {
         this.questionOption = question;
         this.isOpenQuestionPopUp =true;
@@ -159,7 +109,29 @@
         this.isOpenQuestionPopUp = false;
     }
 
-    setConfirmData(event: Selected) {
+    isActive(name: string) {
+        return name === 'gender' && !!this.gender()
+            || name === 'avgScore' && !!this.avgScore()
+            || name === 'communicationStyles' && !!this.communicationStyles().length
+    }
+
+
+    //////////////// private ////////////////
+    private gender(): string {
+        const filter = this.confirmItem.filter(item => item.option === 'gender').map(i => i.value);
+        return filter.length === 0 ? '' : filter[0];
+    }
+
+    private avgScore(): number {
+        const filter = this.confirmItem.filter(item => item.option === 'avgScore').map(i => i.value);
+        return filter.length === 0 ? '' : filter[0];
+    }
+
+    private communicationStyles(): string[] {
+        return this.confirmItem.filter(item => item.option === 'communicationStyles').map(i => i.value);
+    }
+
+    private setConfirmData(event: Selected) {
         if (event.option === 'communicationStyles') {
             this.filterCommunicationStyles(event);
         } else {
@@ -168,7 +140,7 @@
         }
     }
 
-    filterCommunicationStyles(event: Selected) {
+    private filterCommunicationStyles(event: Selected) {
         const confirmValue = this.confirmItem
             .filter(item => item.option === 'communicationStyles')
             .map(i => i.value);
@@ -188,7 +160,7 @@
         }
     }
 
-    getRecommendList() {
+    private getRecommendList() {
         const data: FastQueryParams = {
             gender: this.gender(),
             communicationStyles: this.communicationStyles(),
@@ -196,25 +168,12 @@
             status: ''
         }
 
-        fastQuery(data).then((res) => {
-            this.consultantList = res.data;
+        fastQuery(data).then((consultantList) => {
+            this.consultantList = consultantList;
             this.storageQuickFilter(JSON.stringify(this.confirmItem))
         })
     }
 
-}
-
-export interface QuestionOption {
-    title: string;
-    detail: Detail[];
-    type: string;
-    name: string;
-}
-
-interface Detail {
-    value: string;
-    name?: string;
-    className: string;
 }
 
 </script>
@@ -240,7 +199,7 @@
     .quickBtnBlock {
         display: flex;
         width: 100%;
-        height: 132px;
+        // height: 132px;
         flex-wrap: wrap;
         justify-content: space-between;
 
diff --git a/PAMapp/store/localStorage.ts b/PAMapp/store/localStorage.ts
index 84f5bb0..e31bf7c 100644
--- a/PAMapp/store/localStorage.ts
+++ b/PAMapp/store/localStorage.ts
@@ -1,6 +1,6 @@
-import { Selected } from '~/components/QuickFilter/QuickFilterSelector.vue';
 import { Module, Mutation, VuexModule ,Action } from 'vuex-module-decorators';
 import { Role } from '~/assets/ts/models/enum/Role';
+import { Selected } from '~/assets/ts/models/quickFilter.model';
 @Module
 export default class LocalStorage extends VuexModule {
   id_token = localStorage.getItem('id_token');

--
Gitblit v1.8.0