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