From bd4fa28584a5357676f682b57f57d5da5151272d Mon Sep 17 00:00:00 2001 From: Abdullah Deshmukh Date: Mon, 16 Aug 2021 12:34:34 -0700 Subject: [PATCH] Implements default lints page (#871) --- .../linting_tool/lib/model/rules_store.dart | 22 ++++++ .../lib/pages/default_lints_page.dart | 73 ++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/experimental/linting_tool/lib/model/rules_store.dart b/experimental/linting_tool/lib/model/rules_store.dart index d1b145b1d..b95f0dfb6 100644 --- a/experimental/linting_tool/lib/model/rules_store.dart +++ b/experimental/linting_tool/lib/model/rules_store.dart @@ -6,6 +6,7 @@ import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:linting_tool/model/profile.dart'; import 'package:linting_tool/model/rule.dart'; import 'package:linting_tool/repository/repository.dart'; import 'package:http/http.dart' as http; @@ -29,6 +30,27 @@ class RuleStore extends ChangeNotifier { String? get error => _error; + List get defaultProfiles { + List _defaultProfiles = []; + + var rulesWithDefaultSets = + rules.where((rule) => rule.sets.isNotEmpty).toList(); + + for (final rule in rulesWithDefaultSets) { + for (final setName in rule.sets) { + var profileIndex = + _defaultProfiles.indexWhere((profile) => profile.name == setName); + if (profileIndex >= 0) { + _defaultProfiles[profileIndex].rules.add(rule); + } else { + _defaultProfiles.add(RulesProfile(name: setName, rules: [rule])); + } + } + } + + return _defaultProfiles; + } + Future fetchRules() async { if (!_isLoading) _isLoading = true; notifyListeners(); diff --git a/experimental/linting_tool/lib/pages/default_lints_page.dart b/experimental/linting_tool/lib/pages/default_lints_page.dart index 28d890330..65ac1d742 100644 --- a/experimental/linting_tool/lib/pages/default_lints_page.dart +++ b/experimental/linting_tool/lib/pages/default_lints_page.dart @@ -3,13 +3,82 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; +import 'package:linting_tool/layout/adaptive.dart'; +import 'package:linting_tool/model/rules_store.dart'; +import 'package:linting_tool/pages/rules_page.dart'; +import 'package:linting_tool/theme/colors.dart'; +import 'package:provider/provider.dart'; class DefaultLintsPage extends StatelessWidget { const DefaultLintsPage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - // TODO(abd99): Implement DefaultLintsPage, showing a list of default lint rules. - return const Text('Default Profiles'); + return Consumer( + builder: (context, rulesStore, child) { + if (rulesStore.isLoading) { + return const CircularProgressIndicator.adaptive(); + } + + if (rulesStore.defaultProfiles.isNotEmpty) { + var defaultSets = rulesStore.defaultProfiles; + final isDesktop = isDisplayLarge(context); + final isTablet = isDisplayMedium(context); + final startPadding = isTablet + ? 60.0 + : isDesktop + ? 120.0 + : 4.0; + final endPadding = isTablet + ? 60.0 + : isDesktop + ? 120.0 + : 4.0; + + return ListView.separated( + padding: EdgeInsetsDirectional.only( + start: startPadding, + end: endPadding, + top: isDesktop ? 28 : 0, + bottom: isDesktop ? kToolbarHeight : 0, + ), + cacheExtent: 5, + itemCount: defaultSets.length, + itemBuilder: (context, index) { + var profile = rulesStore.defaultProfiles[index]; + return ListTile( + title: Text( + profile.name, + ), + tileColor: AppColors.white50, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RulesPage(profile: profile), + ), + ); + }, + ); + }, + separatorBuilder: (context, index) => const SizedBox(height: 4), + ); + } + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(rulesStore.error ?? 'Failed to load rules.'), + const SizedBox( + height: 16.0, + ), + IconButton( + onPressed: () => rulesStore.fetchRules(), + icon: const Icon(Icons.refresh), + ), + ], + ); + }, + ); } }