From 47d01de33a7bee1c9d4434ffd9dc18ae87ceb46c Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sat, 4 Feb 2023 21:20:10 +0100 Subject: [PATCH] Changed domain search --- lib/l10n/app_en.arb | 3 +- lib/l10n/app_es.arb | 3 +- lib/models/applied_filters.dart | 4 +- lib/providers/logs_provider.dart | 14 +-- lib/screens/home/top_items.dart | 8 +- lib/screens/logs/logs.dart | 28 +++--- lib/screens/logs/logs_filters_modal.dart | 119 +++++++---------------- lib/screens/top_items/top_items.dart | 8 +- 8 files changed, 68 insertions(+), 119 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0839ce7..cfcb3d1 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -581,5 +581,6 @@ "dnsCacheCleared": "DNS cache cleared successfully", "clearingDnsCache": "Clearing cache...", "dnsCacheNotCleared": "DNS cache couldn't be cleared", - "clientsSelected": "clients selected" + "clientsSelected": "clients selected", + "invalidDomain": "Invalid domain" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 0b6e09d..a58a74d 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -581,5 +581,6 @@ "dnsCacheCleared": "Caché de DNS borrada correctamente", "clearingDnsCache": "Borrando caché...", "dnsCacheNotCleared": "La caché de DNS no pudo ser borrada", - "clientsSelected": "clientes seleccionados" + "clientsSelected": "clientes seleccionados", + "invalidDomain": "Dominio no válido" } \ No newline at end of file diff --git a/lib/models/applied_filters.dart b/lib/models/applied_filters.dart index 2b60e71..b281b42 100644 --- a/lib/models/applied_filters.dart +++ b/lib/models/applied_filters.dart @@ -1,11 +1,11 @@ class AppliedFiters { String selectedResultStatus = 'all'; - String? searchText; + String? domainText; List? clients; AppliedFiters({ required this.selectedResultStatus, - required this.searchText, + required this.domainText, required this.clients }); } \ No newline at end of file diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index db2619c..7c2411b 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -12,7 +12,7 @@ class LogsProvider with ChangeNotifier { DateTime? _logsOlderThan; String _selectedResultStatus = 'all'; - String? _searchText; + String? _domainText; List? _selectedClients; int _logsQuantity = 100; @@ -20,7 +20,7 @@ class LogsProvider with ChangeNotifier { AppliedFiters _appliedFilters = AppliedFiters( selectedResultStatus: 'all', - searchText: null, + domainText: null, clients: null ); @@ -44,8 +44,8 @@ class LogsProvider with ChangeNotifier { return _selectedResultStatus; } - String? get searchText { - return _searchText; + String? get domainText { + return _domainText; } int get logsQuantity { @@ -98,7 +98,7 @@ class LogsProvider with ChangeNotifier { _logsOlderThan = null; _offset = 0; _selectedResultStatus = 'all'; - _searchText = null; + _domainText = null; notifyListeners(); } @@ -116,8 +116,8 @@ class LogsProvider with ChangeNotifier { notifyListeners(); } - void setSearchText(String? value) { - _searchText = value; + void setDomainText(String? value) { + _domainText = value; notifyListeners(); } diff --git a/lib/screens/home/top_items.dart b/lib/screens/home/top_items.dart index 5883523..52ffeaf 100644 --- a/lib/screens/home/top_items.dart +++ b/lib/screens/home/top_items.dart @@ -140,24 +140,24 @@ class TopItems extends StatelessWidget { child: InkWell( onTap: () { if (type == 'topQueriedDomains' || type == 'topBlockedDomains') { - logsProvider.setSearchText(item.keys.toList()[0]); + logsProvider.setDomainText(item.keys.toList()[0]); logsProvider.setSelectedClients(null); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: item.keys.toList()[0], + domainText: item.keys.toList()[0], clients: null ) ); appConfigProvider.setSelectedScreen(2); } else if (type == 'topClients') { - logsProvider.setSearchText(null); + logsProvider.setDomainText(null); logsProvider.setSelectedClients([item.keys.toList()[0]]); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: null, + domainText: null, clients: [item.keys.toList()[0]] ) ); diff --git a/lib/screens/logs/logs.dart b/lib/screens/logs/logs.dart index 9bc4e36..b13c6d2 100644 --- a/lib/screens/logs/logs.dart +++ b/lib/screens/logs/logs.dart @@ -31,7 +31,7 @@ class Logs extends StatelessWidget { appConfigProvider: appConfigProvider, logsProvider: logsProvider, selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus, - searchText: logsProvider.appliedFilters.searchText, + domainText: logsProvider.appliedFilters.domainText, ); } } @@ -41,7 +41,7 @@ class LogsWidget extends StatefulWidget { final AppConfigProvider appConfigProvider; final LogsProvider logsProvider; final String selectedResultStatus; - final String? searchText; + final String? domainText; const LogsWidget({ Key? key, @@ -49,7 +49,7 @@ class LogsWidget extends StatefulWidget { required this.appConfigProvider, required this.logsProvider, required this.selectedResultStatus, - required this.searchText, + required this.domainText, }) : super(key: key); @override @@ -67,12 +67,12 @@ class _LogsWidgetState extends State { int? inOffset, bool? loadingMore, String? responseStatus, - String? searchText, + String? domainText, }) async { int offst = inOffset ?? widget.logsProvider.offset; String resStatus = responseStatus ?? widget.selectedResultStatus; - String? search = searchText ?? widget.searchText; + String? search = domainText ?? widget.domainText; if (loadingMore != null && loadingMore == true) { setState(() => isLoadingMore = true); @@ -402,7 +402,7 @@ class _LogsWidgetState extends State { ), const SizedBox(width: 5), ], - bottom: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' || logsProvider.appliedFilters.clients != null + bottom: logsProvider.appliedFilters.domainText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' || logsProvider.appliedFilters.clients != null ? PreferredSize( preferredSize: const Size(double.maxFinite, 50), child: Container( @@ -421,16 +421,16 @@ class _LogsWidgetState extends State { child: ListView( scrollDirection: Axis.horizontal, children: [ - if (logsProvider.appliedFilters.searchText != null) ...[ + if (logsProvider.appliedFilters.domainText != null) ...[ const SizedBox(width: 15), Chip( avatar: const Icon( - Icons.search, + Icons.link_rounded, ), label: Row( children: [ Text( - logsProvider.appliedFilters.searchText!, + logsProvider.appliedFilters.domainText!, ), ], ), @@ -442,14 +442,14 @@ class _LogsWidgetState extends State { logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus, - searchText: null, + domainText: null, clients: logsProvider.appliedFilters.clients ) ); - logsProvider.setSearchText(null); + logsProvider.setDomainText(null); fetchLogs( inOffset: 0, - searchText: '' + domainText: '' ); }, ), @@ -475,7 +475,7 @@ class _LogsWidgetState extends State { logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: logsProvider.appliedFilters.searchText, + domainText: logsProvider.appliedFilters.domainText, clients: logsProvider.appliedFilters.clients ) ); @@ -510,7 +510,7 @@ class _LogsWidgetState extends State { logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus, - searchText: logsProvider.appliedFilters.searchText, + domainText: logsProvider.appliedFilters.domainText, clients: null ) ); diff --git a/lib/screens/logs/logs_filters_modal.dart b/lib/screens/logs/logs_filters_modal.dart index 9d76dba..fe2b3b9 100644 --- a/lib/screens/logs/logs_filters_modal.dart +++ b/lib/screens/logs/logs_filters_modal.dart @@ -12,7 +12,6 @@ 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'; class LogsFiltersModal extends StatelessWidget { @@ -41,11 +40,13 @@ class LogsFiltersModalWidget extends StatefulWidget { } class _LogsFiltersModalWidgetState extends State { - TextEditingController searchController = TextEditingController(); + TextEditingController domainController = TextEditingController(); + String? domainError; @override void initState() { - searchController.text = widget.logsProvider.searchText ?? ''; + domainController.text = widget.logsProvider.domainText ?? ''; + domainError = null; super.initState(); } @@ -66,38 +67,9 @@ class _LogsFiltersModalWidgetState extends State { "safe_search": AppLocalizations.of(context)!.blockedSafeSearchRow, }; - void selectTime() async { - DateTime now = DateTime.now(); - DateTime? dateValue = await showDatePicker( - context: context, - initialDate: now, - firstDate: DateTime(now.year, now.month-1, now.day), - lastDate: now - ); - if (dateValue != null) { - TimeOfDay? timeValue = await showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - helpText: AppLocalizations.of(context)!.selectTime, - ); - if (timeValue != null) { - DateTime value = DateTime( - dateValue.year, - dateValue.month, - dateValue.day, - timeValue.hour, - timeValue.minute, - dateValue.second - ).toUtc(); - - logsProvider.setLogsOlderThan(value); - } - } - } - void resetFilters() async { setState(() { - searchController.text = ''; + domainController.text = ''; }); logsProvider.setLoadStatus(0); @@ -112,7 +84,7 @@ class _LogsFiltersModalWidgetState extends State { logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: null, + domainText: null, clients: null ) ); @@ -161,13 +133,13 @@ class _LogsFiltersModalWidgetState extends State { count: logsProvider.logsQuantity, olderThan: logsProvider.logsOlderThan, responseStatus: logsProvider.selectedResultStatus, - search: logsProvider.searchText, + search: logsProvider.domainText, ); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: logsProvider.selectedResultStatus, - searchText: logsProvider.searchText, + domainText: logsProvider.domainText, clients: logsProvider.selectedClients ) ); @@ -185,7 +157,7 @@ class _LogsFiltersModalWidgetState extends State { return Padding( padding: MediaQuery.of(context).viewInsets, child: Container( - height: 430, + height: 455, decoration: BoxDecoration( color: Theme.of(context).dialogBackgroundColor, borderRadius: const BorderRadius.only( @@ -229,25 +201,39 @@ class _LogsFiltersModalWidgetState extends State { children: [ Expanded( child: TextFormField( - controller: searchController, - onChanged: (value) => logsProvider.setSearchText(value), + controller: domainController, + onChanged: (value) { + logsProvider.setDomainText(value); + RegExp domain = RegExp(r'^([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+$'); + if (value == '' || domain.hasMatch(value) == true) { + setState(() { + domainError = null; + }); + } + else { + setState(() { + domainError = AppLocalizations.of(context)!.invalidDomain; + }); + } + }, decoration: InputDecoration( - prefixIcon: const Icon(Icons.search_rounded), + prefixIcon: const Icon(Icons.link_rounded), border: const OutlineInputBorder( borderRadius: BorderRadius.all( Radius.circular(10) ) ), - labelText: AppLocalizations.of(context)!.search, + labelText: AppLocalizations.of(context)!.domain, suffixIcon: IconButton( onPressed: () { setState(() { - searchController.text = ''; + domainController.text = ''; }); - logsProvider.setSearchText(null); + logsProvider.setDomainText(null); }, icon: const Icon(Icons.clear) - ) + ), + errorText: domainError ), ), ) @@ -255,47 +241,6 @@ class _LogsFiltersModalWidgetState extends State { ), ), const SizedBox(height: 16), - // Material( - // color: Colors.transparent, - // child: InkWell( - // onTap: selectTime, - // child: Padding( - // padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - // child: Row( - // children: [ - // const Icon( - // Icons.schedule, - // size: 24, - // color: Colors.grey, - // ), - // const SizedBox(width: 20), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Text( - // AppLocalizations.of(context)!.logsOlderThan, - // style: const TextStyle( - // fontSize: 16, - // fontWeight: FontWeight.w500 - // ), - // ), - // const SizedBox(height: 5), - // Text( - // logsProvider.logsOlderThan != null - // ? convertTimestampLocalTimezone(logsProvider.logsOlderThan!, 'HH:mm - dd/MM/yyyy') - // : AppLocalizations.of(context)!.notSelected, - // style: const TextStyle( - // fontSize: 14, - // color: Colors.grey - // ), - // ) - // ], - // ) - // ], - // ), - // ), - // ), - // ), CustomListTile( title: AppLocalizations.of(context)!.client, subtitle: logsProvider.selectedClients != null @@ -342,7 +287,9 @@ class _LogsFiltersModalWidgetState extends State { child: Text(AppLocalizations.of(context)!.resetFilters) ), TextButton( - onPressed: filterLogs, + onPressed: domainError == null + ? () => filterLogs() + : null, child: Text(AppLocalizations.of(context)!.apply) ), ], diff --git a/lib/screens/top_items/top_items.dart b/lib/screens/top_items/top_items.dart index efee2af..1ddf272 100644 --- a/lib/screens/top_items/top_items.dart +++ b/lib/screens/top_items/top_items.dart @@ -200,12 +200,12 @@ class _TopItemsScreenState extends State { return CustomListTile( onTap: () { if (widget.type == 'topQueriedDomains' || widget.type == 'topBlockedDomains') { - logsProvider.setSearchText(screenData[index].keys.toList()[0]); + logsProvider.setDomainText(screenData[index].keys.toList()[0]); logsProvider.setSelectedClients(null); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: screenData[index].keys.toList()[0], + domainText: screenData[index].keys.toList()[0], clients: null ) ); @@ -213,12 +213,12 @@ class _TopItemsScreenState extends State { Navigator.pop(context); } else if (widget.type == 'topClients') { - logsProvider.setSearchText(null); + logsProvider.setDomainText(null); logsProvider.setSelectedClients([screenData[index].keys.toList()[0]]); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', - searchText: null, + domainText: null, clients: [screenData[index].keys.toList()[0]] ) );