diff --git a/lib/config/app_screens.dart b/lib/config/app_screens.dart index 931ca31..92f750c 100644 --- a/lib/config/app_screens.dart +++ b/lib/config/app_screens.dart @@ -1,17 +1,14 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/screens/connect/fab.dart'; -import 'package:adguard_home_manager/screens/home/appbar.dart'; import 'package:adguard_home_manager/screens/connect/appbar.dart'; import 'package:adguard_home_manager/screens/filters/filters.dart'; import 'package:adguard_home_manager/screens/logs/logs.dart'; import 'package:adguard_home_manager/screens/connect/connect.dart'; -import 'package:adguard_home_manager/screens/logs/appbar.dart'; import 'package:adguard_home_manager/screens/home/home.dart'; import 'package:adguard_home_manager/screens/clients/clients.dart'; import 'package:adguard_home_manager/screens/settings/appbar.dart'; import 'package:adguard_home_manager/screens/settings/settings.dart'; -import 'package:adguard_home_manager/screens/home/fab.dart'; import 'package:adguard_home_manager/models/app_screen.dart'; @@ -19,14 +16,11 @@ List screensSelectServer = [ const AppScreen( name: "connect", icon: Icons.link_rounded, - appBar: ConnectAppBar(), body: Connect(), - fab: FabConnect() ), const AppScreen( name: "settings", icon: Icons.settings_rounded, - appBar: SettingsAppBar(), body: Settings() ) ]; diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 151bb22..60f8354 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -280,5 +280,6 @@ "allowClient": "Allow client", "disallowClient": "Disallow client", "noDisallowedDomains": "No disallowed domains", - "domainNotAdded": "The domain couldn't be added" + "domainNotAdded": "The domain couldn't be added", + "statusSelected": "status selected" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 12048a6..d929a26 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -280,5 +280,6 @@ "allowClient": "Permitir cliente", "disallowClient": "No permitir cliente", "noDisallowedDomains": "No hay dominios no permitidos", - "domainNotAdded": "El dominio no pudo ser añadido" + "domainNotAdded": "El dominio no pudo ser añadido", + "statusSelected": "estado/s seleccionados" } \ No newline at end of file diff --git a/lib/models/applied_filters.dart b/lib/models/applied_filters.dart new file mode 100644 index 0000000..6d6dc5d --- /dev/null +++ b/lib/models/applied_filters.dart @@ -0,0 +1,9 @@ +class AppliedFiters { + String selectedResultStatus = 'all'; + String? searchText; + + AppliedFiters({ + required this.selectedResultStatus, + required this.searchText + }); +} \ No newline at end of file diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index 49b5017..086d7d0 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -1,6 +1,8 @@ -import 'package:adguard_home_manager/models/logs.dart'; import 'package:flutter/material.dart'; +import 'package:adguard_home_manager/models/applied_filters.dart'; +import 'package:adguard_home_manager/models/logs.dart'; + class LogsProvider with ChangeNotifier { int _loadStatus = 0; LogsData? _logsData; @@ -12,6 +14,11 @@ class LogsProvider with ChangeNotifier { int _logsQuantity = 100; int _offset = 0; + AppliedFiters _appliedFilters = AppliedFiters( + selectedResultStatus: 'all', + searchText: null + ); + int get loadStatus { return _loadStatus; } @@ -40,6 +47,10 @@ class LogsProvider with ChangeNotifier { return _offset; } + AppliedFiters get appliedFilters { + return _appliedFilters; + } + void setLoadStatus(int value) { _loadStatus = value; @@ -77,8 +88,14 @@ class LogsProvider with ChangeNotifier { _selectedResultStatus = value; notifyListeners(); } + void setSearchText(String? value) { _searchText = value; notifyListeners(); } + + void setAppliedFilters(AppliedFiters value) { + _appliedFilters = value; + notifyListeners(); + } } \ No newline at end of file diff --git a/lib/screens/logs/appbar.dart b/lib/screens/logs/appbar.dart deleted file mode 100644 index 1904041..0000000 --- a/lib/screens/logs/appbar.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; - -import 'package:adguard_home_manager/screens/logs/logs_filters_modal.dart'; - -import 'package:adguard_home_manager/providers/logs_provider.dart'; - -class LogsAppBar extends StatelessWidget with PreferredSizeWidget { - const LogsAppBar({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final logsProvider = Provider.of(context); - - void openFilersModal() { - showModalBottomSheet( - context: context, - builder: (context) => const LogsFiltersModal(), - backgroundColor: Colors.transparent, - isScrollControlled: true - ); - } - - int getNumFiltersApplied() { - int number = 0; - if (logsProvider.logsOlderThan != null) { - number++; - } - if (logsProvider.searchText != null) { - number++; - } - if (logsProvider.selectedResultStatus != 'all') { - number++; - } - return number; - } - - return AppBar( - title: Text(AppLocalizations.of(context)!.logs), - actions: [ - logsProvider.loadStatus == 1 - ? TextButton.icon( - onPressed: openFilersModal, - icon: const Icon(Icons.filter_list_rounded), - label: Text("${AppLocalizations.of(context)!.filters} ${getNumFiltersApplied() > 0 ? '(${getNumFiltersApplied().toString()})' : ''}"), - ) - : const SizedBox(), - const SizedBox(width: 5), - ], - ); - } - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); -} \ No newline at end of file diff --git a/lib/screens/logs/logs.dart b/lib/screens/logs/logs.dart index 4444bca..afa4e5a 100644 --- a/lib/screens/logs/logs.dart +++ b/lib/screens/logs/logs.dart @@ -4,9 +4,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/screens/logs/logs_filters_modal.dart'; import 'package:adguard_home_manager/screens/logs/log_tile.dart'; -import 'package:adguard_home_manager/screens/logs/appbar.dart'; +import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -53,10 +54,15 @@ class _LogsWidgetState extends State { Future fetchLogs({ int? inOffset, - bool? loadingMore + bool? loadingMore, + String? responseStatus, + String? searchText, }) async { int offst = inOffset ?? widget.logsProvider.offset; + String resStatus = responseStatus ?? widget.logsProvider.selectedResultStatus; + String? search = searchText ?? widget.logsProvider.searchText; + if (loadingMore != null && loadingMore == true) { setState(() => isLoadingMore = true); } @@ -66,8 +72,8 @@ class _LogsWidgetState extends State { count: widget.logsProvider.logsQuantity, offset: offst, olderThan: widget.logsProvider.logsOlderThan, - responseStatus: widget.logsProvider.selectedResultStatus, - search: widget.logsProvider.searchText + responseStatus: resStatus, + search: search ); if (loadingMore != null && loadingMore == true) { @@ -130,6 +136,26 @@ class _LogsWidgetState extends State { Widget build(BuildContext context) { final logsProvider = Provider.of(context); + void openFilersModal() { + showModalBottomSheet( + context: context, + builder: (context) => const LogsFiltersModal(), + backgroundColor: Colors.transparent, + isScrollControlled: true + ); + } + + final Map translatedString = { + "all": AppLocalizations.of(context)!.all, + "filtered": AppLocalizations.of(context)!.filtered, + "processed": AppLocalizations.of(context)!.processed, + "whitelisted": AppLocalizations.of(context)!.processedWhitelist, + "blocked": AppLocalizations.of(context)!.blocked, + "blocked_safebrowsing": AppLocalizations.of(context)!.blockedSafeBrowsing, + "blocked_parental": AppLocalizations.of(context)!.blockedParental, + "safe_search": AppLocalizations.of(context)!.safeSearch, + }; + Widget generateBody() { switch (logsProvider.loadStatus) { case 0: @@ -243,7 +269,94 @@ class _LogsWidgetState extends State { } return Scaffold( - appBar: const LogsAppBar(), + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.logs), + actions: [ + logsProvider.loadStatus == 1 + ? IconButton( + onPressed: openFilersModal, + icon: const Icon(Icons.filter_list_rounded) + ) + : const SizedBox(), + const SizedBox(width: 5), + ], + bottom: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' + ? PreferredSize( + preferredSize: const Size(double.maxFinite, 50), + child: Container( + height: 50, + width: double.maxFinite, + padding: const EdgeInsets.only(bottom: 10), + child: ListView( + scrollDirection: Axis.horizontal, + children: [ + if (logsProvider.appliedFilters.searchText != null) ...[ + const SizedBox(width: 15), + Chip( + label: Row( + children: [ + const Icon(Icons.search), + const SizedBox(width: 10), + Text(logsProvider.appliedFilters.searchText!), + const SizedBox(width: 10), + ], + ), + deleteIcon: const Icon( + Icons.cancel_rounded, + size: 20, + ), + onDeleted: () { + logsProvider.setAppliedFilters( + AppliedFiters( + selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus, + searchText: null + ) + ); + logsProvider.setSearchText(null); + fetchLogs( + inOffset: 0, + searchText: null + ); + }, + ), + ], + if (logsProvider.appliedFilters.selectedResultStatus != 'all') ...[ + const SizedBox(width: 15), + Chip( + label: Row( + children: [ + const Icon(Icons.shield_rounded), + const SizedBox(width: 10), + Text(translatedString[logsProvider.appliedFilters.selectedResultStatus]!), + const SizedBox(width: 10), + ], + ), + deleteIcon: const Icon( + Icons.cancel_rounded, + size: 20, + ), + onDeleted: () { + logsProvider.setAppliedFilters( + AppliedFiters( + selectedResultStatus: 'all', + searchText: logsProvider.appliedFilters.searchText + ) + ); + logsProvider.setSelectedResultStatus('all'); + fetchLogs( + inOffset: 0, + responseStatus: 'all' + ); + }, + ), + ], + const SizedBox(width: 15), + ], + ), + ) + ) + : null, + ), body: generateBody() ); } diff --git a/lib/screens/logs/logs_filters_modal.dart b/lib/screens/logs/logs_filters_modal.dart index 13de643..30eb216 100644 --- a/lib/screens/logs/logs_filters_modal.dart +++ b/lib/screens/logs/logs_filters_modal.dart @@ -5,9 +5,11 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/logs/filter_status_modal.dart'; + import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; +import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/functions/format_time.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; @@ -105,6 +107,13 @@ class _LogsFiltersModalWidgetState extends State { count: logsProvider.logsQuantity ); + logsProvider.setAppliedFilters( + AppliedFiters( + selectedResultStatus: 'all', + searchText: null + ) + ); + if (result['result'] == 'success') { logsProvider.setLogsData(result['data']); logsProvider.setLoadStatus(1); @@ -140,6 +149,14 @@ class _LogsFiltersModalWidgetState extends State { responseStatus: logsProvider.selectedResultStatus, search: logsProvider.searchText, ); + + logsProvider.setAppliedFilters( + AppliedFiters( + selectedResultStatus: logsProvider.selectedResultStatus, + searchText: logsProvider.searchText, + ) + ); + if (result['result'] == 'success') { logsProvider.setLogsData(result['data']); logsProvider.setLoadStatus(1);