@@ -192,13 +192,11 @@ class LibraryComponent extends React.Component {
192
192
// console.log(tag, enabled);
193
193
if ( this . state . playingItem === null ) {
194
194
this . setState ( {
195
- filterQuery : '' ,
196
195
selectedTags : this . state . selectedTags . concat ( [ tag . toLowerCase ( ) ] )
197
196
} ) ;
198
197
} else {
199
198
this . props . onItemMouseLeave ( this . getFilteredData ( ) [ [ this . state . playingItem ] ] ) ;
200
199
this . setState ( {
201
- filterQuery : '' ,
202
200
playingItem : null ,
203
201
selectedTags : this . state . selectedTags . concat ( [ tag . toLowerCase ( ) ] )
204
202
} ) ;
@@ -238,42 +236,53 @@ class LibraryComponent extends React.Component {
238
236
if ( this . state . playingItem === null ) {
239
237
this . setState ( {
240
238
filterQuery : event . target . value ,
241
- selectedTags : [ ]
242
239
} ) ;
243
240
} else {
244
241
this . props . onItemMouseLeave ( this . getFilteredData ( ) [ [ this . state . playingItem ] ] ) ;
245
242
this . setState ( {
246
243
filterQuery : event . target . value ,
247
244
playingItem : null ,
248
- selectedTags : [ ]
249
245
} ) ;
250
246
}
251
247
}
252
248
handleFilterClear ( ) {
253
249
this . setState ( { filterQuery : '' } ) ;
254
250
}
251
+ get custom_extensions ( ) {
252
+ return this . state . favorites
253
+ . filter ( item => ( typeof item !== "string" ) )
254
+ . map ( item => Object . assign ( item , { custom : true } ) ) ;
255
+ }
255
256
createFilteredData ( ) {
256
- if ( this . state . selectedTags . length <= 0 ) {
257
- if ( ! this . state . filterQuery ) return this . state . data ;
258
- return this . state . data . filter ( dataItem => (
259
- ( dataItem . tags || [ ] )
260
- // Second argument to map sets `this`
261
- . map ( String . prototype . toLowerCase . call , String . prototype . toLowerCase )
262
- . concat ( dataItem . name ?
263
- ( typeof dataItem . name === 'string' ?
264
- // Use the name if it is a string, else use formatMessage to get the translated name
265
- dataItem . name : this . props . intl . formatMessage ( dataItem . name . props )
266
- ) . toLowerCase ( ) :
267
- null )
268
- . join ( '\n' ) // unlikely to partially match newlines
269
- . indexOf ( this . state . filterQuery . toLowerCase ( ) ) !== - 1
270
- ) ) ;
271
- }
272
- return this . state . data . filter ( dataItem => ( arrayIncludesItemsFrom (
273
- dataItem . tags &&
274
- dataItem . tags
275
- . map ( String . prototype . toLowerCase . call , String . prototype . toLowerCase ) ,
276
- this . state . selectedTags ) ) ) ;
257
+ const data = [ ] . concat (
258
+ this . state . data ,
259
+ ) ;
260
+
261
+ const no_tags = this . state . selectedTags . length === 0 ;
262
+ const no_query = this . state . filterQuery === "" ;
263
+ if ( no_tags && no_query ) return data ;
264
+
265
+ return data . filter ( dataItem => {
266
+ var tags = ( dataItem . tags ?? [ ] ) . map ( tag => tag . toLowerCase ( ) ) ;
267
+
268
+ if ( ! arrayIncludesItemsFrom ( tags , this . state . selectedTags ) ) return false ;
269
+
270
+ if ( no_query ) return true ;
271
+
272
+ var name = dataItem . name ;
273
+ if ( name ) {
274
+ if ( typeof dataItem . name !== "string" ) {
275
+ name = this . props . intl . formatMessage ( dataItem . name . props ) ;
276
+ }
277
+ tags . push ( name . toLowerCase ( ) ) ;
278
+ }
279
+
280
+ tags = tags . join ( "\n" ) ;
281
+
282
+ const query = this . state . filterQuery . toLowerCase ( ) ;
283
+
284
+ return tags . includes ( query )
285
+ } ) ;
277
286
}
278
287
getFilteredData ( ) {
279
288
const filtered = this . createFilteredData ( ) ;
@@ -282,16 +291,13 @@ class LibraryComponent extends React.Component {
282
291
return filtered ;
283
292
}
284
293
285
- const final = [ ] . concat (
286
- this . state . favorites
287
- . filter ( item => ( typeof item !== "string" ) )
288
- . map ( item => ( { ...item , custom : true } ) )
289
- . reverse ( ) ,
294
+ const fully_filtered = [ ] . concat (
295
+ this . custom_extensions ,
290
296
filtered . filter ( item => ( this . state . favorites . includes ( item . extensionId ) ) ) ,
291
297
filtered . filter ( item => ( ! this . state . favorites . includes ( item . extensionId ) ) )
292
- ) . map ( item => ( { ... item , custom : typeof item . custom === "boolean" ? item . custom : false } ) ) ;
293
-
294
- return final ;
298
+ ) . map ( item => Object . assign ( item , { custom : ! ! item . custom } ) ) ;
299
+
300
+ return fully_filtered ;
295
301
}
296
302
scrollToTop ( ) {
297
303
this . filteredDataRef . scrollTop = 0 ;
0 commit comments