1
1
/**
2
- * @typedef { { selected: boolean; visible: boolean } } FilterItem
3
2
* @typedef { { fKeywords: Record<string, FilterItem> } } Filters
4
3
*/
5
4
@@ -22,6 +21,11 @@ class Filter {
22
21
*/
23
22
static defaultFilterKey = 'default'
24
23
24
+ /**
25
+ * HTML data attribute that contains non-default keywords
26
+ */
27
+ static KeywordsKey = 'fKeywords'
28
+
25
29
get value ( ) {
26
30
return this . _value ;
27
31
}
@@ -60,7 +64,6 @@ class Filter {
60
64
61
65
/**
62
66
* @param value { string }
63
- * @returns { FilterItem }
64
67
*/
65
68
onInputValueChange ( value ) {
66
69
return new Filter (
@@ -76,24 +79,31 @@ class Filter {
76
79
* @returns { Filters }
77
80
*/
78
81
_generateFiltersOnTyping ( value ) {
79
- const datasets = this . elementsRefs
80
- . filter ( ( elRef ) => {
81
- const name = getElementTextContent ( getElementNameRef ( elRef ) ) ;
82
- const description = getElementTextContent ( getElementDescription ( elRef ) ) ;
82
+ const elementsDatasets = this . elementsRefs
83
+ . filter ( element => {
84
+ const name = getElementTextContent ( getElementNameRef ( element ) ) ;
85
+ const description = getElementTextContent ( getElementDescription ( element ) ) ;
83
86
84
87
return name . includes ( value ) || description . includes ( value ) ;
85
88
} )
86
- . map ( ( elRef ) => this . _getDatasetWithKeywordData ( elRef . dataset ) )
87
-
89
+ . map ( element => this . _getDatasetWithKeywordData ( element . dataset ) )
88
90
89
- return dataset . reduce ( ( filtersObject , datasets ) => {
91
+ const newFilters = elementsDatasets . reduce ( ( filtersObject , datasets ) => {
90
92
datasets . forEach ( ( [ key , value ] ) => {
91
93
this . _splitByComma ( value ) . forEach ( ( val ) => {
92
94
filtersObject [ key ] = { ...filtersObject [ key ] , [ val ] : { ...filtersObject [ key ] [ val ] , visible : true } } ;
93
95
} ) ;
94
96
} ) ;
97
+
95
98
return filtersObject ;
96
99
} , this . _allFiltersAreHidden ( ) ) ;
100
+
101
+ const shouldAddDefaultFilter = elementsDatasets
102
+ . some ( d => d . length === 0 || d . some ( ( [ key ] ) => key !== Filter . KeywordsKey ) )
103
+
104
+ return shouldAddDefaultFilter
105
+ ? this . _attachDefaultFilters ( newFilters )
106
+ : newFilters
97
107
}
98
108
99
109
/**
@@ -142,26 +152,37 @@ class Filter {
142
152
* @returns { Filters }
143
153
*/
144
154
_withNewFilters ( ) {
145
- const newFilter = { selected : true , visible : true }
146
-
147
155
const newFilters = this . _elementsRefs . reduce ( ( filtersObject , elementRef ) => {
148
156
this . _getDatasetWithKeywordData ( elementRef . dataset ) . forEach ( ( [ key , value ] ) =>
149
157
this . _splitByComma ( value ) . forEach ( ( val ) => {
150
158
filtersObject [ key ] = filtersObject [ key ]
151
- ? { ...filtersObject [ key ] , [ val ] : filtersObject [ key ] [ val ] ?? newFilter }
152
- : { [ val ] : newFilter }
159
+ ? { ...filtersObject [ key ] , [ val ] : filtersObject [ key ] [ val ] ?? new FilterItem ( ) }
160
+ : { [ val ] : new FilterItem ( ) }
153
161
} )
154
162
) ;
155
163
return filtersObject ;
156
164
} , { } ) ;
157
165
158
- const shouldAddDefaultFilter = this . _elementsRefs . some ( ref => ! ! ref . dataset [ 'fKeywords' ] )
166
+ const shouldAddDefaultFilter = this . _elementsRefs . some ( ref => ! ! ref . dataset [ Filter . KeywordsKey ] )
159
167
160
168
return shouldAddDefaultFilter
161
- ? { ... newFilters , fKeywords : { ... newFilters . fKeywords , [ Filter . defaultFilterKey ] : newFilter } }
169
+ ? this . _attachDefaultFilters ( newFilters )
162
170
: newFilters
163
171
}
164
172
173
+ /**
174
+ * @private
175
+ * @param {Filters } filters
176
+ */
177
+ _attachDefaultFilters ( filters ) {
178
+ return {
179
+ ...filters , [ Filter . KeywordsKey ] : {
180
+ ...filters . fKeywords ,
181
+ [ Filter . defaultFilterKey ] : new FilterItem ( )
182
+ }
183
+ }
184
+ }
185
+
165
186
/**
166
187
* @private
167
188
* @param key { string }
@@ -193,5 +214,12 @@ class Filter {
193
214
* @returns { [key: string, value: string][] }
194
215
*/
195
216
_getDatasetWithKeywordData = ( dataset ) =>
196
- Object . entries ( dataset ) . filter ( ( [ key ] ) => startsWith ( key , "f" ) ) ;
217
+ Object . entries ( dataset ) . filter ( ( [ key ] ) => key === Filter . KeywordsKey ) ;
197
218
}
219
+
220
+ class FilterItem {
221
+ constructor ( selected = true , visible = true ) {
222
+ this . selected = selected
223
+ this . visible = visible
224
+ }
225
+ }
0 commit comments