Skip to content

Commit 00e56d3

Browse files
authored
Show selected/active filters (#587)
1 parent 133dc84 commit 00e56d3

File tree

7 files changed

+98
-20
lines changed

7 files changed

+98
-20
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<script>
2+
import { swatches } from '../../../stores/useSwatches'
3+
4+
export default {
5+
props: {
6+
selectedValues: {
7+
type: Object,
8+
default: () => {},
9+
},
10+
},
11+
12+
render() {
13+
return this.$scopedSlots.default(this)
14+
},
15+
16+
computed: {
17+
activeFilters() {
18+
return Object.keys(this.selectedValues)
19+
.filter((filterKey) => {
20+
let { showFilter, value } = this.selectedValues[filterKey]
21+
return showFilter && (Array.isArray(value) ? value.length : !!value)
22+
})
23+
.reduce((result, filterKey) => {
24+
let { value } = this.selectedValues[filterKey]
25+
26+
if (filterKey === 'category') {
27+
return result.concat({ code: filterKey, value: config.subcategories[value] })
28+
}
29+
30+
if (filterKey === 'price') {
31+
let [minPrice, maxPrice] = value
32+
return result.concat({ code: filterKey, value: price(minPrice) + ' - ' + price(maxPrice) })
33+
}
34+
35+
if (Array.isArray(value)) {
36+
// Check if the value is a swatch value, boolean or just an array
37+
let items = Object.keys(swatches.value).includes(filterKey)
38+
? value.map((selected) => swatches.value[filterKey].options[selected].label)
39+
: value.map((item) =>
40+
item === '0'
41+
? window.config.translations.filters.no
42+
: item === '1'
43+
? window.config.translations.filters.yes
44+
: item,
45+
)
46+
47+
// We can have a filter where multiple values may be selected, so we need to map and concat all of them
48+
return result.concat(items.map((item) => ({ code: filterKey, value: item })))
49+
}
50+
51+
return result
52+
}, [])
53+
},
54+
},
55+
}
56+
</script>

resources/js/filters.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
Vue.filter('truncate', function (value, limit) {
1+
window.truncate = function (value, limit) {
22
if (value.length > limit) {
33
value = value.substring(0, limit - 3) + '...'
44
}
55

66
return value
7-
})
7+
}
8+
9+
Vue.filter('truncate', window.truncate)
810

9-
Vue.filter('price', function (value) {
11+
window.price = function (value) {
1012
return new Intl.NumberFormat(config.locale.replace('_', '-'), {
1113
style: 'currency',
1214
currency: config.currency,
1315
}).format(value)
14-
})
16+
}
17+
18+
Vue.filter('price', window.price)
1519

1620
window.url = function (path = '') {
1721
// Transform urls starting with / into url with domain

resources/js/vue-components.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,4 @@ Vue.component('login', () => import('./components/User/Login.vue'))
2828
Vue.component('listing', () => import('./components/Listing/Listing.vue'))
2929
Vue.component('checkout-success', () => import('./components/Checkout/CheckoutSuccess.vue'))
3030
Vue.component('popup', () => import('./components/Popup.vue'))
31+
Vue.component('selected-filters-values', () => import('./components/Listing/Filters/SelectedFiltersValues.vue'))

resources/lang/en/frontend.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
'email' => 'An email address is required.',
2424
],
2525

26+
'filters' => [
27+
'no' => 'No',
28+
'yes' => 'Yes',
29+
],
30+
2631
'asc' => 'asc',
2732
'desc' => 'desc',
2833
'relevance' => 'Relevance',

resources/views/listing/partials/filter/price.blade.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
:component-id="filter.code"
55
:data-field="filter.code"
66
:react="{and: ['query-filter']}"
7-
:show-filter="false"
87
:slider-options="{ dragOnClick: true, useKeyboard: false }"
98
:inner-class="{
109
slider: '!pt-4 !mt-0 mx-2',
Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
1-
<selected-filters :inner-class="{ button: '!hidden last:!inline-flex' }">
2-
<x-rapidez::button
3-
class="w-full mb-3 text-sm"
4-
slot-scope="{ clearValues, selectedValues, components }"
5-
v-on:click="clearValues"
1+
<selected-filters>
2+
<div
3+
slot-scope="{ clearValues, selectedValues, setValue, components }"
64
v-if="Object.keys(selectedValues).filter(function (id) {
75
let value = selectedValues[id].value
86
let isArray = Array.isArray(value)
9-
10-
return components.includes(id)
11-
&& selectedValues[id].showFilter
12-
&& (
13-
(isArray && value.length)
14-
|| (!isArray && value)
15-
)
16-
}).length"
7+
return components.includes(id) && selectedValues[id].showFilter && ((isArray && value.length) || (!isArray && value))}).length"
178
>
18-
@lang('Reset filters')
19-
</x-rapidez::button>
9+
<selected-filters-values :selected-values="selectedValues">
10+
<div slot-scope="{ activeFilters }" class="flex flex-wrap items-center w-full md:w-auto relative mb-5">
11+
<div class="flex flex-wrap items-baseline justify-between gap-2 w-full border-t py-4">
12+
<div class="text-neutral font-semibold text-base font-sans">
13+
@lang('You have filtered on'):
14+
</div>
15+
<button v-on:click="clearValues" class="!font-sans text-sm text-inactive transition-all hover:underline">
16+
@lang('Reset filters')
17+
</button>
18+
</div>
19+
<div class="flex gap-2 flex-wrap">
20+
<div class="flex flex-wrap gap-2 relative cursor-pointer" v-for="filter in activeFilters">
21+
<div v-on:click="setValue(filter.code, null)" class="flex justify-between items-center transition hover:opacity-80">
22+
<span class="font-sans flex gap-1 p-1 items-center text-xs test-neutral rounded-lg bg-inactive-100">
23+
@{{ filter.value }}
24+
<x-heroicon-o-x-mark class="size-3 shrink-0 text-neutral"/>
25+
</span>
26+
</div>
27+
</div>
28+
</div>
29+
</div>
30+
</selected-filters-values>
31+
</div>
2032
</selected-filters>

src/Http/Controllers/CategoryController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public function show(int $categoryId)
1010
$category = $categoryModel::findOrFail($categoryId);
1111

1212
config(['frontend.category' => $category->only('entity_id')]);
13+
config(['frontend.subcategories' => $category->subcategories->pluck('name', 'entity_id')]);
1314
session(['latest_category_path' => $category->path]);
1415

1516
return view('rapidez::category.overview', compact('category'));

0 commit comments

Comments
 (0)