feat: search functionality in jobs
This commit is contained in:
@@ -7,7 +7,22 @@
|
|||||||
class="h-7"
|
class="h-7"
|
||||||
:items="[{ label: __('Jobs'), route: { name: 'Jobs' } }]"
|
:items="[{ label: __('Jobs'), route: { name: 'Jobs' } }]"
|
||||||
/>
|
/>
|
||||||
<div class="flex">
|
<div class="flex space-x-2">
|
||||||
|
<div class="w-40 md:w-44">
|
||||||
|
<FormControl
|
||||||
|
v-model="jobType"
|
||||||
|
type="select"
|
||||||
|
:options="jobTypes"
|
||||||
|
:placeholder="__('Type')"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-28 md:w-36">
|
||||||
|
<FormControl type="text" placeholder="Search" v-model="searchQuery">
|
||||||
|
<template #prefix>
|
||||||
|
<Search class="w-4 h-4 stroke-1.5 text-gray-600" name="search" />
|
||||||
|
</template>
|
||||||
|
</FormControl>
|
||||||
|
</div>
|
||||||
<router-link
|
<router-link
|
||||||
v-if="user.data?.name"
|
v-if="user.data?.name"
|
||||||
:to="{
|
:to="{
|
||||||
@@ -26,9 +41,9 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div v-if="jobs.data?.length">
|
<div v-if="jobsList?.length">
|
||||||
<div class="divide-y lg:w-3/4 mx-auto p-5">
|
<div class="divide-y lg:w-3/4 mx-auto p-5">
|
||||||
<div v-for="job in jobs.data">
|
<div v-for="job in jobsList">
|
||||||
<router-link
|
<router-link
|
||||||
:to="{
|
:to="{
|
||||||
name: 'JobDetail',
|
name: 'JobDetail',
|
||||||
@@ -47,13 +62,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button, Breadcrumbs, createResource } from 'frappe-ui'
|
import { Button, Breadcrumbs, createResource, FormControl } from 'frappe-ui'
|
||||||
import { Plus } from 'lucide-vue-next'
|
import { Plus, Search } from 'lucide-vue-next'
|
||||||
import { inject, computed } from 'vue'
|
import { inject, computed, ref, onMounted } from 'vue'
|
||||||
import JobCard from '@/components/JobCard.vue'
|
import JobCard from '@/components/JobCard.vue'
|
||||||
import { updateDocumentTitle } from '@/utils'
|
import { updateDocumentTitle } from '@/utils'
|
||||||
|
|
||||||
const user = inject('$user')
|
const user = inject('$user')
|
||||||
|
const jobType = ref(null)
|
||||||
|
const searchQuery = ref('')
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
let queries = new URLSearchParams(location.search)
|
||||||
|
if (queries.has('type')) {
|
||||||
|
jobType.value = queries.get('type')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const jobs = createResource({
|
const jobs = createResource({
|
||||||
url: 'lms.lms.api.get_job_opportunities',
|
url: 'lms.lms.api.get_job_opportunities',
|
||||||
@@ -68,5 +92,32 @@ const pageMeta = computed(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const jobsList = computed(() => {
|
||||||
|
let JobData = jobs.data
|
||||||
|
if (jobType.value && jobType.value != '') {
|
||||||
|
JobData = JobData.filter((job) => job.type == jobType.value)
|
||||||
|
}
|
||||||
|
if (searchQuery.value) {
|
||||||
|
let query = searchQuery.value.toLowerCase()
|
||||||
|
JobData = JobData.filter(
|
||||||
|
(job) =>
|
||||||
|
job.job_title.toLowerCase().includes(query) ||
|
||||||
|
job.company_name.toLowerCase().includes(query) ||
|
||||||
|
job.location.toLowerCase().includes(query)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return JobData
|
||||||
|
})
|
||||||
|
|
||||||
|
const jobTypes = computed(() => {
|
||||||
|
return [
|
||||||
|
'',
|
||||||
|
{ label: 'Full Time', value: 'Full Time' },
|
||||||
|
{ label: 'Part Time', value: 'Part Time' },
|
||||||
|
{ label: 'Contract', value: 'Contract' },
|
||||||
|
{ label: 'Freelance', value: 'Freelance' },
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
updateDocumentTitle(pageMeta)
|
updateDocumentTitle(pageMeta)
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user