Line data Source code
1 : import 'package:widgetbook/src/models/models.dart'; 2 : 3 : class FilterService { 4 16 : const FilterService(); 5 : 6 1 : List<Category> filter( 7 : String searchTerm, 8 : List<Category> categories, 9 : ) { 10 1 : return _filterCategories( 11 1 : RegExp( 12 : searchTerm, 13 : caseSensitive: false, 14 : ), 15 : categories, 16 : ); 17 : } 18 : 19 1 : List<Category> _filterCategories( 20 : RegExp regExp, 21 : List<Category> categories, 22 : ) { 23 1 : final matchingOrganizers = <Category>[]; 24 2 : for (final category in categories) { 25 1 : final result = _filterOrganizer(regExp, category) as Category?; 26 1 : if (_isMatch(result)) { 27 1 : matchingOrganizers.add(result!); 28 : } 29 : } 30 : return matchingOrganizers; 31 : } 32 : 33 1 : ExpandableOrganizer? _filterOrganizer( 34 : RegExp regExp, ExpandableOrganizer organizer) { 35 2 : if (organizer.name.contains(regExp)) { 36 : return organizer; 37 : } 38 : 39 1 : final matchingFolders = <Folder>[]; 40 2 : for (final subOrganizer in organizer.folders) { 41 1 : final result = _filterOrganizer(regExp, subOrganizer); 42 1 : if (_isMatch(result)) { 43 1 : matchingFolders.add(result! as Folder); 44 : } 45 : } 46 : 47 1 : final matchingWidgets = <WidgetElement>[]; 48 2 : for (final subOrganizer in organizer.widgets) { 49 1 : final result = _filterOrganizer(regExp, subOrganizer); 50 1 : if (_isMatch(result)) { 51 1 : matchingWidgets.add(result! as WidgetElement); 52 : } 53 : } 54 : 55 2 : if (matchingFolders.isNotEmpty || matchingWidgets.isNotEmpty) { 56 1 : return _createFilteredSubtree( 57 : organizer, 58 : matchingFolders, 59 : matchingWidgets, 60 : ); 61 : } 62 : 63 : return null; 64 : } 65 : 66 1 : ExpandableOrganizer _createFilteredSubtree( 67 : ExpandableOrganizer organizer, 68 : List<Folder> folders, 69 : List<WidgetElement> widgets, 70 : ) { 71 1 : if (organizer is Category) { 72 1 : return Category( 73 1 : name: organizer.name, 74 : widgets: widgets, 75 : folders: folders, 76 : ); 77 : } 78 : 79 : // otherwise it can only be a folder 80 1 : return Folder( 81 1 : name: organizer.name, 82 : widgets: widgets, 83 : folders: folders, 84 1 : isExpanded: organizer.isExpanded, 85 : ); 86 : } 87 : 88 1 : bool _isMatch(ExpandableOrganizer? organizer) { 89 : return organizer != null; 90 : } 91 : }