11<template >
2- <SfSidebar
3- :visible =" isVisible"
4- class =" sidebar-filters"
5- title =" Filters"
6- @close =" $emit('close')"
7- >
8- <div class =" filters desktop-only" >
2+ <div >
3+ <h4 class =" heading__title h4 desktop-only" >
4+ {{ $t('Filters') }}
5+ </h4 >
6+ <div v-if =" isLoading" >
7+ <div
8+ v-for =" n in 3"
9+ :key =" n"
10+ >
11+ <SkeletonLoader
12+ class =" filters__title sf-heading--left sf-heading"
13+ height =" 20px"
14+ width =" 85%"
15+ />
16+ <SkeletonLoader width =" 50%" />
17+ <SkeletonLoader
18+ width =" 62%"
19+ />
20+ <SkeletonLoader
21+ width =" 40%"
22+ height =" 10px"
23+ />
24+ </div >
25+ </div >
26+ <div
27+ v-else
28+ class =" filters desktop-only"
29+ >
930 <SelectedFilters
1031 @removeFilter =" doRemoveFilter($event)"
1132 />
2647 @selectFilter =" selectFilter(filter, $event)"
2748 />
2849 </div >
29- </div >
30- <SfAccordion class =" filters smartphone-only" >
31- <SelectedFilters
32- @removeFilter =" doRemoveFilter($event)"
33- />
34- <hr class =" sf-divider" >
35- <div
36- v-for =" (filter, i) in filters"
37- :key =" i"
38- >
39- <SfAccordionItem
40- :key =" `filter-title-${filter.attribute_code}`"
41- :header =" filter.label"
42- class =" filters__accordion-item"
43- >
44- <component
45- :is =" getFilterConfig(filter.attribute_code).component"
46- :filter =" filter"
47- @selectFilter =" selectFilter(filter, $event)"
48- />
49- </SfAccordionItem >
50- </div >
51- </SfAccordion >
52- <template #content-bottom >
5350 <div class =" filters__buttons" >
5451 <SfButton
5552 class =" sf-button--full-width"
6461 {{ $t('Clear all') }}
6562 </SfButton >
6663 </div >
67- </template >
68- </SfSidebar >
64+ </div >
65+ <SfSidebar
66+ :visible =" isVisible"
67+ class =" sidebar-filters smartphone-only"
68+ title =" Filters"
69+ @close =" $emit('close')"
70+ >
71+ <SfAccordion class =" filters smartphone-only" >
72+ <SelectedFilters
73+ @removeFilter =" doRemoveFilter($event)"
74+ />
75+ <hr class =" sf-divider" >
76+ <div
77+ v-for =" (filter, i) in filters"
78+ :key =" i"
79+ >
80+ <SfAccordionItem
81+ :key =" `filter-title-${filter.attribute_code}`"
82+ :header =" filter.label"
83+ class =" filters__accordion-item"
84+ >
85+ <component
86+ :is =" getFilterConfig(filter.attribute_code).component"
87+ :filter =" filter"
88+ @selectFilter =" selectFilter(filter, $event)"
89+ />
90+ </SfAccordionItem >
91+ </div >
92+ </SfAccordion >
93+ <template #content-bottom >
94+ <div class =" filters__buttons" >
95+ <SfButton
96+ class =" sf-button--full-width"
97+ @click =" doApplyFilters"
98+ >
99+ {{ $t('Done') }}
100+ </SfButton >
101+ <SfButton
102+ class =" sf-button--full-width filters__button-clear"
103+ @click =" doClearFilters"
104+ >
105+ {{ $t('Clear all') }}
106+ </SfButton >
107+ </div >
108+ </template >
109+ </SfSidebar >
110+ </div >
69111</template >
70112<script lang="ts">
71113import {
@@ -80,6 +122,7 @@ import {
80122 SfSidebar ,
81123} from ' @storefront-ui/vue' ;
82124
125+ import SkeletonLoader from ' ~/components/SkeletonLoader/index.vue' ;
83126import { useUiHelpers } from ' ~/composables' ;
84127import { useFilters } from ' ./useFilters' ;
85128import { getFilterConfig , getDisabledFilters } from ' ~/modules/catalog/category/config/FiltersConfig' ;
@@ -98,6 +141,7 @@ export default defineComponent({
98141 name: ' CategoryFilters' ,
99142 components: {
100143 SelectedFilters ,
144+ SkeletonLoader ,
101145 CheckboxType : () => import (' ~/modules/catalog/category/components/filters/renderer/CheckboxType.vue' ),
102146 SwatchColorType : () => import (' ~/modules/catalog/category/components/filters/renderer/SwatchColorType.vue' ),
103147 RadioType : () => import (' ~/modules/catalog/category/components/filters/renderer/RadioType.vue' ),
@@ -127,6 +171,9 @@ export default defineComponent({
127171
128172 const doApplyFilters = () => {
129173 changeFilters (selectedFilters .value , false );
174+ if (window ?.scroll ) {
175+ window .scroll (0 , 0 );
176+ }
130177 emit (' reloadProducts' );
131178 emit (' close' );
132179 };
@@ -146,10 +193,11 @@ export default defineComponent({
146193 };
147194
148195 const filters = ref <Aggregation []>([]);
149-
196+ const isLoading = ref ( true );
150197 onMounted (async () => {
151198 const loadedFilters = await getProductFilterByCategoryCommand .execute ({ eq: catUid });
152199 filters .value = loadedFilters .filter ((filter ) => ! getDisabledFilters ().includes (filter .attribute_code ));
200+ isLoading .value = false ;
153201 });
154202
155203 provide (' UseFiltersProvider' , { isFilterSelected , selectedFilters , filters });
@@ -162,6 +210,7 @@ export default defineComponent({
162210 getFilterConfig ,
163211 selectedFilters ,
164212 filters ,
213+ isLoading ,
165214 };
166215 },
167216});
0 commit comments