Skip to content

Commit d2d52c9

Browse files
committed
refactor: change removable filters behavior
- removable filters will be now updated only on the explict filter selection action - actions are now sticky so it will be easier to apply filters
1 parent 3cdf470 commit d2d52c9

File tree

4 files changed

+44
-26
lines changed

4 files changed

+44
-26
lines changed

packages/theme/modules/catalog/category/components/filters/CategoryFilters.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.filters {
2+
position: relative;
23
&__title {
34
--heading-title-font-size: var(--font-size--xl);
45
margin: var(--spacer-xl) 0 var(--spacer-base) 0;
@@ -49,6 +50,11 @@
4950

5051
&__buttons {
5152
margin: var(--spacer-sm) 0;
53+
@include for-desktop {
54+
background-color: #fff;
55+
position: sticky;
56+
bottom: 0;
57+
}
5258
}
5359

5460
&__button-clear {

packages/theme/modules/catalog/category/components/filters/CategoryFilters.vue

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
class="filters desktop-only"
2929
>
3030
<SelectedFilters
31+
:removable-filters="removableFilters"
3132
@removeFilter="doRemoveFilter($event)"
3233
/>
3334
<hr class="sf-divider">
@@ -165,12 +166,21 @@ export default defineComponent({
165166
},
166167
setup({ catUid }, { emit }) {
167168
const { changeFilters, clearFilters } = useUiHelpers();
169+
const removableFilters = ref([]);
170+
const filters = ref<Aggregation[]>([]);
171+
const isLoading = ref(true);
172+
168173
const {
169-
selectedFilters, selectFilter, removeFilter, isFilterSelected,
174+
selectedFilters, selectFilter, removeFilter, isFilterSelected, getRemovableFilters,
170175
} = useFilters();
171176
177+
const updateRemovableFilters = () => {
178+
removableFilters.value = getRemovableFilters(filters.value, selectedFilters.value);
179+
};
180+
172181
const doApplyFilters = () => {
173182
changeFilters(selectedFilters.value, false);
183+
updateRemovableFilters();
174184
if (window?.scroll) {
175185
window.scroll(0, 0);
176186
}
@@ -181,22 +191,23 @@ export default defineComponent({
181191
const doRemoveFilter = ({ id, value }: { id: string, value: string }) => {
182192
removeFilter(id, value);
183193
changeFilters(selectedFilters.value, false);
194+
updateRemovableFilters();
184195
emit('reloadProducts');
185196
emit('close');
186197
};
187198
188199
const doClearFilters = () => {
189200
clearFilters(false);
190201
selectedFilters.value = {};
202+
updateRemovableFilters();
191203
emit('reloadProducts');
192204
emit('close');
193205
};
194206
195-
const filters = ref<Aggregation[]>([]);
196-
const isLoading = ref(true);
197207
onMounted(async () => {
198208
const loadedFilters = await getProductFilterByCategoryCommand.execute({ eq: catUid });
199209
filters.value = loadedFilters.filter((filter) => !getDisabledFilters().includes(filter.attribute_code));
210+
updateRemovableFilters();
200211
isLoading.value = false;
201212
});
202213
@@ -211,6 +222,7 @@ export default defineComponent({
211222
selectedFilters,
212223
filters,
213224
isLoading,
225+
removableFilters,
214226
};
215227
},
216228
});

packages/theme/modules/catalog/category/components/filters/FiltersSidebar/SelectedFilters.vue

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,20 @@
2525
</div>
2626
</template>
2727
<script lang="ts">
28-
import { computed, defineComponent, inject } from '@nuxtjs/composition-api';
28+
import { defineComponent } from '@nuxtjs/composition-api';
2929
import { SfBadge, SfIcon } from '@storefront-ui/vue';
30-
import type { UseFiltersProviderInterface } from '~/modules/catalog/category/components/filters/CategoryFilters.vue';
3130
3231
export default defineComponent({
3332
name: 'SelectedFilters',
3433
components: {
3534
SfBadge,
3635
SfIcon,
3736
},
38-
setup() {
39-
const { selectedFilters, filters }: UseFiltersProviderInterface = inject('UseFiltersProvider');
40-
41-
const removableFilters = computed(() => {
42-
const result = [];
43-
44-
filters.value.forEach((filter) => {
45-
filter.options.forEach((option) => {
46-
if ((selectedFilters.value[filter.attribute_code] ?? []).includes(option.value)) {
47-
result.push({
48-
id: filter.attribute_code, name: filter.label, label: option.label, value: option.value,
49-
});
50-
}
51-
});
52-
});
53-
54-
return result;
55-
});
56-
return {
57-
removableFilters,
58-
};
37+
props: {
38+
removableFilters: {
39+
type: Array,
40+
default: () => [],
41+
},
5942
},
6043
});
6144
</script>

packages/theme/modules/catalog/category/components/filters/useFilters.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,29 @@ export const useFilters = () => {
5757
selectedFilters.value[filter.attribute_code].push(String(option.value));
5858
};
5959

60+
const getRemovableFilters = (filters: Aggregation[], selected: SelectedFiltersInterface) => {
61+
const result = [];
62+
63+
filters.forEach((filter) => {
64+
filter.options.forEach((option) => {
65+
if ((selected[filter.attribute_code] ?? []).includes(option.value)) {
66+
result.push({
67+
id: filter.attribute_code, name: filter.label, label: option.label, value: option.value,
68+
});
69+
}
70+
});
71+
});
72+
73+
return result;
74+
};
75+
6076
return {
6177
getSelectedFiltersFromUrl,
6278
isFilterSelected,
6379
removeFilter,
6480
selectFilter,
6581
selectedFilters,
82+
getRemovableFilters,
6683
};
6784
};
6885

0 commit comments

Comments
 (0)