Skip to content

Commit 9945bf8

Browse files
committed
feat(View): Implement highlighting serach results for query
1 parent 2cf204c commit 9945bf8

File tree

1 file changed

+33
-7
lines changed

1 file changed

+33
-7
lines changed

src/views/CommentsView.vue

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,16 @@
22
<div class="h3 mb-4">{{ $t('Comments') }}</div>
33
<CommentsFilterForm class="mb-4" v-model="filters" />
44
<VTableServer :items="comments" :itemsLength="comments.length" :is-loading="commentsIsLoading">
5-
<VColumn :header="$t('Id')" field="id" />
6-
<VColumn :header="$t('Name')" field="name" />
5+
<VColumn :header="$t('Id')" field="id">
6+
<template #body="{ item }">
7+
<span v-html="highlightText(item.id)" />
8+
</template>
9+
</VColumn>
10+
<VColumn :header="$t('Name')" field="name">
11+
<template #body="{ item }">
12+
<span v-html="highlightText(item.name)" />
13+
</template>
14+
</VColumn>
715
<VColumn :header="$t('Email')" field="email" />
816
<VColumn :header="$t('Post')" field="postId">
917
<template #body>
@@ -12,7 +20,11 @@
1220
</button>
1321
</template>
1422
</VColumn>
15-
<VColumn :header="$t('Text')" field="body" />
23+
<VColumn :header="$t('Text')" field="body">
24+
<template #body="{ item }">
25+
<span v-html="highlightText(item.body)" />
26+
</template>
27+
</VColumn>
1628
<VColumn :header="$t('Status')" field="id">
1729
<template #body="{ item }">
1830
<span v-if="item.status === 'PENDING'">
@@ -65,23 +77,37 @@ export default {
6577
6678
const filteredComments = computed(() => {
6779
const enteredEmail = filters?.email && filters.email.trim().toLowerCase();
68-
const query = filters?.searchQuery && isNaN(Number(filters.querySearch)) ? filters.searchQuery.trim().toLowerCase() : undefined;
80+
const query = filters?.searchQuery && isNaN(Number(filters.searchQuery)) ? filters.searchQuery.trim().toLowerCase() : filters.searchQuery;
6981
const status = filters?.status && filters.status.trim();
7082
7183
const matchesEmail = (email) => enteredEmail && email.trim().toLowerCase().includes(enteredEmail)
72-
const matchesQuery = (id,body,name)=> id=== Number(query) || body.trim().toLowerCase().includes(query) || name.trim().toLowerCase().includes(query)
84+
const matchesQuery = (id, body, name) => id === Number(query) || body.trim().toLowerCase().includes(query) || name.trim().toLowerCase().includes(query)
7385
7486
return comments.value?.filter(comment => {
75-
if(!query && !enteredEmail && !status) return true;
87+
if (!query && !enteredEmail && !status) return true;
7688
return matchesEmail(comment.email) || matchesQuery(comment.id, comment.body, comment.name) || status === comment.status;
7789
});
7890
});
7991
92+
const highlightText = (text) => {
93+
const query = filters?.searchQuery && isNaN(Number(filters.searchQuery)) ? filters.searchQuery.trim().toLowerCase() : undefined;
94+
if (!query) return text;
95+
96+
const indexOfQuery = String(text).toLowerCase().indexOf(query);
97+
if (indexOfQuery === -1) return text;
8098
99+
const originalText = String(text)
100+
const prefix = originalText.slice(0, indexOfQuery);
101+
const matchPart = originalText.slice(indexOfQuery, indexOfQuery + query.length);
102+
const suffix = originalText.slice(indexOfQuery + query.length);
103+
return `${prefix}<mark class="border">${matchPart}</mark>${suffix}`;
104+
105+
}
81106
return {
82107
comments: filteredComments,
83108
commentsIsLoading,
84-
filters
109+
filters,
110+
highlightText
85111
}
86112
},
87113
components: {

0 commit comments

Comments
 (0)