diff --git a/lib/screens/logs/filters/logs_filters_modal.dart b/lib/screens/logs/filters/logs_filters_modal.dart index b02dbd2..b506cff 100644 --- a/lib/screens/logs/filters/logs_filters_modal.dart +++ b/lib/screens/logs/filters/logs_filters_modal.dart @@ -15,7 +15,7 @@ import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; -class LogsFiltersModal extends StatefulWidget { +class LogsFiltersModal extends StatelessWidget { final bool dialog; const LogsFiltersModal({ @@ -23,22 +23,9 @@ class LogsFiltersModal extends StatefulWidget { required this.dialog }); - @override - State createState() => _LogsFiltersModalState(); -} - -class _LogsFiltersModalState extends State { - TextEditingController searchController = TextEditingController(); - - @override - void initState() { - searchController.text = Provider.of(context, listen: false).searchText ?? ''; - super.initState(); - } - @override Widget build(BuildContext context) { - if (widget.dialog == true) { + if (dialog == true) { return Padding( padding: MediaQuery.of(context).viewInsets, child: Dialog( @@ -46,10 +33,7 @@ class _LogsFiltersModalState extends State { constraints: const BoxConstraints( maxWidth: 500 ), - child: _FiltersList( - searchController: searchController, - onClearSearch: () => setState(() => searchController.text = "") - ) + child: const _FiltersList() ) ), ); @@ -65,11 +49,8 @@ class _LogsFiltersModalState extends State { topRight: Radius.circular(28) ) ), - child: SafeArea( - child: _FiltersList( - searchController: searchController, - onClearSearch: () => setState(() => searchController.text = "") - ), + child: const SafeArea( + child: _FiltersList(), ) ), ); @@ -78,13 +59,7 @@ class _LogsFiltersModalState extends State { } class _FiltersList extends StatelessWidget { - final TextEditingController searchController; - final void Function() onClearSearch; - - const _FiltersList({ - required this.searchController, - required this.onClearSearch, - }); + const _FiltersList(); @override Widget build(BuildContext context) { @@ -194,35 +169,6 @@ class _FiltersList extends StatelessWidget { ), ], ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: Row( - children: [ - Expanded( - child: TextFormField( - controller: searchController, - onChanged: logsProvider.setSearchText, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.search_rounded), - border: const OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(10) - ) - ), - labelText: AppLocalizations.of(context)!.search, - suffixIcon: IconButton( - onPressed: () { - onClearSearch(); - logsProvider.setSearchText(null); - }, - icon: const Icon(Icons.clear) - ), - ), - ), - ) - ], - ), - ), Container(height: 16), CustomListTile( title: AppLocalizations.of(context)!.client, @@ -300,7 +246,6 @@ class _FiltersList extends StatelessWidget { children: [ TextButton( onPressed: () { - searchController.text = ""; logsProvider.requestResetFilters(); }, child: Text(AppLocalizations.of(context)!.resetFilters) diff --git a/lib/screens/logs/logs_list_appbar.dart b/lib/screens/logs/logs_list_appbar.dart index 01a870c..ee4dfd1 100644 --- a/lib/screens/logs/logs_list_appbar.dart +++ b/lib/screens/logs/logs_list_appbar.dart @@ -76,14 +76,31 @@ class LogsListAppBar extends StatelessWidget { icon: const Icon(Icons.refresh_rounded), tooltip: AppLocalizations.of(context)!.refresh, ), - logsProvider.loadStatus == LoadStatus.loaded - ? IconButton( - onPressed: openFilersModal, - icon: const Icon(Icons.filter_list_rounded), - tooltip: AppLocalizations.of(context)!.filters, - ) - : const SizedBox(), - const SizedBox(width: 5), + if (logsProvider.loadStatus == LoadStatus.loaded) IconButton( + onPressed: () => showDialog( + context: context, + builder: (context) => _Search( + onSearch: (v) { + logsProvider.setAppliedFilters( + AppliedFiters( + selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus, + searchText: v != "" ? v : null, + clients: logsProvider.appliedFilters.clients + ) + ); + logsProvider.filterLogs(); + }, + ), + ), + icon: const Icon(Icons.search_rounded), + tooltip: AppLocalizations.of(context)!.search, + ), + if (logsProvider.loadStatus == LoadStatus.loaded) IconButton( + onPressed: openFilersModal, + icon: const Icon(Icons.filter_list_rounded), + tooltip: AppLocalizations.of(context)!.filters, + ), + const SizedBox(width: 8), ], bottom: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' || logsProvider.appliedFilters.clients.isNotEmpty ? PreferredSize( @@ -213,4 +230,95 @@ class LogsListAppBar extends StatelessWidget { : null, ); } +} + +class _Search extends StatefulWidget { + final void Function(String) onSearch; + + const _Search({ + required this.onSearch + }); + + @override + State<_Search> createState() => _SearchState(); +} + +class _SearchState extends State<_Search> { + final _searchController = TextEditingController(); + + @override + void initState() { + final logsProvider = Provider.of(context, listen: false); + _searchController.text = logsProvider.appliedFilters.searchText ?? ""; + + super.initState(); + } + + @override + Widget build(BuildContext context) { + final logsProvider = Provider.of(context); + + return GestureDetector( + onTap: () => Navigator.pop(context), + child: Material( + color: Colors.transparent, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + GestureDetector( + onTap: () => {}, + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 500), + child: Container( + margin: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(16) + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: TextFormField( + controller: _searchController, + onChanged: (v) { + if (v == "") { + logsProvider.setSearchText(null); + return; + } + logsProvider.setSearchText(v); + }, + onFieldSubmitted: (v) { + widget.onSearch(v); + Navigator.pop(context); + }, + autofocus: true, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)!.search, + prefixIcon: const Icon(Icons.search_rounded), + border: InputBorder.none, + filled: true, + fillColor: Colors.grey.withOpacity(0.2), + suffixIcon: _searchController.text != "" + ? IconButton( + onPressed: () { + _searchController.text = ""; + logsProvider.setSearchText(null); + }, + icon: const Icon( + Icons.close_rounded, + size: 20, + ), + tooltip: AppLocalizations.of(context)!.clearSearch, + ) + : null + ), + ), + ), + ), + ), + ) + ], + ), + ), + ); + } } \ No newline at end of file