mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-06-28 11:59:52 +00:00
Fixed logs search bar
This commit is contained in:
parent
d65ea6520c
commit
31ad3fcf6a
1 changed files with 86 additions and 71 deletions
|
@ -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
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
),
|
],
|
||||||
)
|
);
|
||||||
],
|
}
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue