Fixed logs search bar

This commit is contained in:
Juan Gilsanz Polo 2024-03-09 14:40:02 +01:00
parent d65ea6520c
commit 31ad3fcf6a

View file

@ -8,11 +8,14 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/logs/filters/logs_filters_modal.dart'; import 'package:adguard_home_manager/screens/logs/filters/logs_filters_modal.dart';
import 'package:adguard_home_manager/config/globals.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/functions/desktop_mode.dart'; import 'package:adguard_home_manager/functions/desktop_mode.dart';
import 'package:adguard_home_manager/models/applied_filters.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/logs_provider.dart';
final GlobalKey _searchButtonKey = GlobalKey();
class LogsListAppBar extends StatelessWidget { class LogsListAppBar extends StatelessWidget {
final bool innerBoxIsScrolled; final bool innerBoxIsScrolled;
final bool showDivider; final bool showDivider;
@ -52,6 +55,25 @@ class LogsListAppBar extends StatelessWidget {
} }
} }
void showSearchDialog() {
showDialog(
context: context,
builder: (context) => _Search(
searchButtonRenderBox: _searchButtonKey.currentContext!.findRenderObject() as RenderBox,
onSearch: (v) {
logsProvider.setAppliedFilters(
AppliedFiters(
selectedResultStatus: logsProvider.appliedFilters.selectedResultStatus,
searchText: v != "" ? v : null,
clients: logsProvider.appliedFilters.clients
)
);
logsProvider.filterLogs();
},
),
);
}
final Map<String, String> translatedString = { final Map<String, String> translatedString = {
"all": AppLocalizations.of(context)!.all, "all": AppLocalizations.of(context)!.all,
"filtered": AppLocalizations.of(context)!.filtered, "filtered": AppLocalizations.of(context)!.filtered,
@ -77,22 +99,8 @@ class LogsListAppBar extends StatelessWidget {
tooltip: AppLocalizations.of(context)!.refresh, tooltip: AppLocalizations.of(context)!.refresh,
), ),
if (logsProvider.loadStatus == LoadStatus.loaded) IconButton( if (logsProvider.loadStatus == LoadStatus.loaded) IconButton(
onPressed: () => showDialog( key: _searchButtonKey,
context: context, onPressed: showSearchDialog,
builder: (context) => _Search(
hasTopBar: MediaQuery.of(context).viewPadding.top > 0,
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), icon: const Icon(Icons.search_rounded),
tooltip: AppLocalizations.of(context)!.search, tooltip: AppLocalizations.of(context)!.search,
), ),
@ -235,11 +243,11 @@ class LogsListAppBar extends StatelessWidget {
class _Search extends StatefulWidget { class _Search extends StatefulWidget {
final void Function(String) onSearch; final void Function(String) onSearch;
final bool hasTopBar; final RenderBox searchButtonRenderBox;
const _Search({ const _Search({
required this.onSearch, required this.onSearch,
required this.hasTopBar, required this.searchButtonRenderBox,
}); });
@override @override
@ -261,67 +269,74 @@ class _SearchState extends State<_Search> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context); final logsProvider = Provider.of<LogsProvider>(context);
final Offset position = widget.searchButtonRenderBox.localToGlobal(Offset.zero);
return GestureDetector( return GestureDetector(
onTap: () => Navigator.pop(context), onTap: () => Navigator.pop(context),
child: Material( child: Material(
color: Colors.transparent, color: Colors.transparent,
child: Column( child: LayoutBuilder(
mainAxisSize: MainAxisSize.min, builder: (context, constraints) {
children: [ final double width = constraints.maxWidth - 32 > 500 ? 500 : constraints.maxWidth - 32;
GestureDetector( return Stack(
onTap: () => {}, alignment: Alignment.topCenter,
child: ConstrainedBox( children: [
constraints: const BoxConstraints(maxWidth: 500), Positioned(
child: Container( top: position.dy - MediaQuery.of(globalNavigatorKey.currentContext!).viewPadding.top,
margin: widget.hasTopBar child: SizedBox(
? const EdgeInsets.symmetric(horizontal: 16) width: width,
: const EdgeInsets.all(16), child: GestureDetector(
decoration: BoxDecoration( onTap: () => {},
color: Theme.of(context).colorScheme.surface, child: Container(
borderRadius: BorderRadius.circular(16) decoration: BoxDecoration(
), color: Theme.of(context).colorScheme.surface,
child: ClipRRect( borderRadius: BorderRadius.circular(16)
borderRadius: BorderRadius.circular(16), ),
child: TextFormField( child: ClipRRect(
controller: _searchController, borderRadius: BorderRadius.circular(16),
onChanged: (v) { child: TextFormField(
if (v == "") { controller: _searchController,
logsProvider.setSearchText(null); onChanged: (v) {
return; if (v == "") {
}
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); logsProvider.setSearchText(null);
}, return;
icon: const Icon( }
Icons.close_rounded, logsProvider.setSearchText(v);
size: 20, },
), onFieldSubmitted: (v) {
tooltip: AppLocalizations.of(context)!.clearSearch, widget.onSearch(v);
) Navigator.pop(context);
: null },
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
),
),
),
), ),
), ),
), ),
), )
), ],
) );
], }
), ),
), ),
); );