Skip to content

Commit 53a2f20

Browse files
Add filters
1 parent e170c09 commit 53a2f20

File tree

3 files changed

+158
-18
lines changed

3 files changed

+158
-18
lines changed

package-lock.json

Lines changed: 42 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"core-js": "^3.6.5",
1616
"date-fns": "^2.16.1",
1717
"duration": "^0.2.2",
18+
"fuse.js": "^6.4.6",
1819
"twilio-chat": "^4.0.0",
1920
"vue": "^2.6.11"
2021
},

src/components/chat/side.vue

Lines changed: 115 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,34 @@
1313
</chat-header>
1414
<template v-if="!addNewChat && isExpanded">
1515
<div class="chat-side__body">
16-
<div class="chat-side__search">
17-
<i class="fa fa-search"></i>
18-
<input
19-
class="seach-input"
20-
type="text"
21-
placeholder="Search ..."
22-
v-model="search"
23-
/>
24-
<i class="fa fa-sliders-h"></i>
25-
</div>
16+
<div class="chat-side__header">
17+
<div class="chat-side__search">
18+
<i class="fa fa-search"></i>
19+
<input
20+
class="seach-input"
21+
type="text"
22+
placeholder="Search ..."
23+
v-model="search"
24+
/>
25+
<div class="chat-side__action-container"
26+
:class="{'showing-filters': showFilters}"
27+
@click="showFilters=!showFilters">
28+
<i class="fa fa-sliders-h"></i>
29+
</div>
30+
31+
</div>
32+
<div class="chat-side__filters" v-if="showFilters">
33+
<button
34+
v-for="(filter, filterName) in filters"
35+
class="btn btn-tab"
36+
:class="{selected: selectedFilter == filterName}"
37+
:key="filterName"
38+
@click="selectedFilter = filterName"
39+
>
40+
{{ filter.label }}
41+
</button>
42+
</div>
43+
</div>
2644

2745
<div class="chat-side__list chat-scroller">
2846
<chat-side-item
@@ -54,6 +72,7 @@
5472
<script>
5573
import ChatHeader from "./header";
5674
import ChatSideItem from "./side-list-item";
75+
import Fuse from "fuse.js";
5776
5877
export default {
5978
name: "ChatSider",
@@ -93,6 +112,30 @@ export default {
93112
return {
94113
channelData: {},
95114
search: "",
115+
showFilters: false,
116+
selectedFilter: 'all',
117+
filters: {
118+
all: {
119+
value: '',
120+
label: "All Messages",
121+
field: ''
122+
},
123+
active: {
124+
label: 'Active',
125+
value: 0,
126+
field: 'status'
127+
},
128+
won: {
129+
label: 'Won',
130+
value: 1,
131+
field: 'status'
132+
},
133+
lost: {
134+
label: 'Lost',
135+
value: 2,
136+
field: 'status'
137+
}
138+
},
96139
addNewChat: false,
97140
};
98141
},
@@ -130,15 +173,11 @@ export default {
130173
}, 0);
131174
},
132175
133-
filteredChannels() {
134-
return this.channels
135-
.filter((channel) => {
136-
return (
137-
channel.lastMessage && channel.uniqueName.includes(this.search)
138-
);
139-
})
176+
visibleChannels() {
177+
const selectedFilter = this.filters[this.selectedFilter].value;
178+
return this.channels.filter(channel => channel.lastMessage && (!selectedFilter || channel.attributes.status == selectedFilter))
140179
.sort((a, b) => {
141-
const dateCreatedA = a.lastMessage
180+
const dateCreatedA = a.lastMessage
142181
? a.lastMessage.dateCreated.toISOString()
143182
: "";
144183
const dateCreatedB = b.lastMessage
@@ -147,6 +186,29 @@ export default {
147186
return dateCreatedA > dateCreatedB ? -1 : 1;
148187
});
149188
},
189+
190+
filteredChannels() {
191+
const options = {
192+
// isCaseSensitive: false,
193+
// includeScore: false,
194+
// shouldSort: true,
195+
// includeMatches: false,
196+
// findAllMatches: false,
197+
// minMatchCharLength: 1,
198+
// location: 0,
199+
threshold: 0.2,
200+
distance: 50,
201+
// useExtendedSearch: false,
202+
// ignoreLocation: false,
203+
// ignoreFieldNorm: false,
204+
keys: [
205+
"friendlyName"
206+
]
207+
};
208+
209+
const fuse = new Fuse(this.visibleChannels, options);
210+
return !this.search ? this.visibleChannels : fuse.search(this.search || "").map( item => item.item)
211+
},
150212
profileImage() {
151213
return this.userContext.user.attributes ? this.userContext.user.attributes.photoUrl : "";
152214
}
@@ -279,6 +341,7 @@ export default {
279341
padding: 0 15px;
280342
color: #777;
281343
position: relative;
344+
overflow: hidden;
282345
input {
283346
height: 36px;
284347
border: none;
@@ -292,6 +355,40 @@ export default {
292355
}
293356
}
294357
358+
&__action-container {
359+
height: 100%;
360+
width: 40px;
361+
display: flex;
362+
justify-content: center;
363+
align-items: center;
364+
margin-right: -15px;
365+
cursor: pointer;
366+
367+
&.showing-filters {
368+
font-weight: bolder;
369+
color: #333;
370+
background: #e4e4e4;
371+
}
372+
}
373+
374+
&__filters {
375+
width: 100%;
376+
display: flex;
377+
378+
.btn-tab {
379+
width: 100%;
380+
border-radius: 0 0 0 0;
381+
&:active, &:focus {
382+
box-shadow: none;
383+
}
384+
&.selected {
385+
background: #cacaca;
386+
font-weight: bold;
387+
}
388+
}
389+
390+
}
391+
295392
&__body {
296393
height: 91%;
297394
display: flex;

0 commit comments

Comments
 (0)