Skip to content

Commit e19618e

Browse files
committed
Projects search and filter logic
1 parent 80fa338 commit e19618e

File tree

1 file changed

+102
-3
lines changed

1 file changed

+102
-3
lines changed

src/components/ProjectsGrid.vue

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,82 @@
1414
</div>
1515
<!-- Projects grid title end -->
1616

17+
<!-- Filter and search projects start -->
18+
<div class="mt-10 sm:mt-16">
19+
<h3
20+
class="
21+
text-center text-secondary-dark
22+
dark:text-ternary-light
23+
text-md
24+
sm:text-xl
25+
font-normal
26+
mb-3
27+
"
28+
>
29+
Search projects by title or filter by category
30+
</h3>
31+
<div
32+
class="
33+
flex
34+
justify-between
35+
border-b border-primary-light
36+
dark:border-secondary-dark
37+
pb-3
38+
gap-3
39+
"
40+
>
41+
<div class="flex justify-between gap-2">
42+
<span
43+
class="
44+
hidden
45+
sm:block
46+
bg-primary-light
47+
dark:bg-ternary-dark
48+
p-2.5
49+
shadow-sm
50+
rounded-xl
51+
cursor-pointer
52+
"
53+
>
54+
<i
55+
data-feather="search"
56+
class="text-ternary-dark dark:text-ternary-light"
57+
></i>
58+
</span>
59+
<input
60+
v-model="searchProject"
61+
class="
62+
pl-3
63+
pr-1
64+
sm:px-4
65+
py-2
66+
border-1 border-gray-200
67+
dark:border-secondary-dark
68+
rounded-lg
69+
text-sm
70+
sm:text-md
71+
bg-secondary-light
72+
dark:bg-ternary-dark
73+
text-primary-dark
74+
dark:text-ternary-light
75+
"
76+
id="name"
77+
name="name"
78+
type="search"
79+
required=""
80+
placeholder="Search Projects"
81+
aria-label="Name"
82+
/>
83+
</div>
84+
<ProjectsFilter @change="selectedProject = $event" />
85+
</div>
86+
</div>
87+
<!-- Filter and search projects end -->
88+
1789
<!-- Projects grid start -->
18-
<div class="grid grid-cols-1 sm:grid-cols-3 mt-16 sm:gap-10">
90+
<div class="grid grid-cols-1 sm:grid-cols-3 mt-6 sm:gap-10">
1991
<ProjectSingle
20-
v-for="project in projects"
92+
v-for="project in filteredProjects"
2193
:key="project.id"
2294
:project="project"
2395
/>
@@ -30,12 +102,15 @@
30102
<script>
31103
import feather from 'feather-icons';
32104
import ProjectSingle from './ProjectSingle.vue';
105+
import ProjectsFilter from './ProjectsFilter.vue';
33106
34107
export default {
35108
name: 'Projects',
36-
components: { ProjectSingle },
109+
components: { ProjectSingle, ProjectsFilter },
37110
data() {
38111
return {
112+
selectedProject: '',
113+
searchProject: '',
39114
projectsHeading: 'Projects Portfolio',
40115
projectsDescription:
41116
'Some of the projects I have successfully completed',
@@ -80,6 +155,30 @@ export default {
80155
// publicPath: process.env.BASE_URL,
81156
};
82157
},
158+
computed: {
159+
filteredProjects() {
160+
if (this.selectedProject) {
161+
return this.filterProjectsByCategory();
162+
} else if (this.searchProject) {
163+
return this.filterProjectsBySearch();
164+
}
165+
return this.projects;
166+
},
167+
},
168+
methods: {
169+
filterProjectsByCategory() {
170+
return this.projects.filter((item) => {
171+
let category =
172+
item.category.charAt(0).toUpperCase() +
173+
item.category.slice(1);
174+
return category.includes(this.selectedProject);
175+
});
176+
},
177+
filterProjectsBySearch() {
178+
let project = new RegExp(this.searchProject, 'i');
179+
return this.projects.filter((el) => el.title.match(project));
180+
},
181+
},
83182
mounted() {
84183
feather.replace();
85184
},

0 commit comments

Comments
 (0)