<template>
|
<div>
|
<el-input
|
type="text"
|
placeholder="請輸入關鍵字"
|
class="mb-30 pam-clientReserved-input"
|
v-model="keyWord"
|
@input="search"
|
>
|
<i
|
slot="suffix"
|
class="icon-search search cursor--pointer"
|
></i>
|
</el-input>
|
|
<div class="mb-10 sort-indicator-container">
|
<a class="sort-indicator cursor--pointer" @click="changeSortType">
|
{{ this.sortType === 'DESC' ? '新->舊' : '舊->新' }}
|
<i v-if="isSortType" class="icon-sort-add"></i>
|
<i v-else class="icon-sort-decrease"></i>
|
</a>
|
</div>
|
|
<ClientList
|
:clients="pageList"
|
:title="'contactedList'"
|
class="mt-10"
|
></ClientList>
|
|
<UiPagination
|
v-if="togglePagination"
|
:totalList="filterList"
|
:currentPage="currentPage"
|
@changePage="changePage"
|
></UiPagination>
|
</div>
|
</template>
|
|
<script lang="ts">
|
import { Vue, Component, Watch, namespace } from 'nuxt-property-decorator';
|
|
import { Appointment } from '~/shared/models/appointment.model';
|
|
|
const appointmentStore = namespace('appointment.store');
|
const localStorage = namespace('localStorage');
|
|
@Component
|
export default class ClientContactedList extends Vue {
|
|
@appointmentStore.State('myAppointmentList')
|
myAppointmentList!: Appointment[];
|
|
@localStorage.Getter
|
currentAppointmentIdFromMsg!: string;
|
|
contactedList : Appointment[] = [];
|
currentPage : number = 1;
|
filterList : Appointment[] = [];
|
keyWord : string = '';
|
pageList : Appointment[] = [];
|
sortType : 'ASC' | 'DESC' = 'DESC';
|
togglePagination: boolean = true;
|
|
//////////////////////////////////////////////////////////////////////
|
|
mounted() {
|
this.onMyAppointmentListChange();
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
@Watch('myAppointmentList')
|
onMyAppointmentListChange() {
|
this.setContactedList();
|
}
|
|
@Watch('sortType')
|
onSortTypeChange() {
|
this.togglePagination = false;
|
setTimeout(() => {
|
this.togglePagination = true;
|
this.currentPage = 1;
|
this.setContactedList();
|
}, 0)
|
}
|
|
private setContactedList(): void {
|
this.contactedList = (this.myAppointmentList || [])
|
.filter(item => item.communicateStatus === 'contacted')
|
.map((item) => ({...item, sortTime: new Date(item.lastModifiedDate)}))
|
.sort((prevItem, nextItem) => {
|
return this.sortType === 'DESC' ? +nextItem.sortTime - +prevItem.sortTime : +prevItem.sortTime - +nextItem.sortTime
|
});
|
this.filterList = this.contactedList;
|
|
this.getCurrentPage();
|
}
|
|
private getCurrentPage(): void {
|
const currentIndex = this.filterList.findIndex(item => item.id === +this.currentAppointmentIdFromMsg);
|
const pageSize = 5;
|
if (currentIndex > -1) {
|
this.currentPage = Math.ceil((currentIndex + 1) / pageSize);
|
}
|
}
|
|
//////////////////////////////////////////////////////////////////////
|
|
search(): void {
|
if (this.keyWord) {
|
this.filterList = this.contactedList.filter(item => {
|
return item?.name?.match(this.keyWord) || item?.requirement?.match(this.keyWord)
|
})
|
} else {
|
this.filterList = this.contactedList;
|
}
|
}
|
|
changePage(pageList: Appointment[]): void {
|
this.pageList = pageList;
|
}
|
|
changeSortType(): void {
|
if (this.sortType === 'DESC') {
|
this.sortType = 'ASC';
|
} else {
|
this.sortType = 'DESC';
|
}
|
}
|
|
get isSortType () :boolean {
|
return this.sortType === 'DESC';
|
}
|
|
}
|
</script>
|
<style lang="scss" scoped>
|
.sort-indicator-container{
|
margin-bottom: 20px;
|
}
|
.sort-indicator{
|
border-radius:30px;
|
border: 1px solid #D0D0CE;
|
background-color:#fff;
|
padding: 10px 20px;
|
color: #68737A;
|
}
|
</style>
|