mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-04 20:30:35 +00:00
Chips for applied logs filters
This commit is contained in:
parent
9e468318fc
commit
b336856349
8 changed files with 166 additions and 70 deletions
|
@ -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<AppScreen> 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()
|
||||
)
|
||||
];
|
||||
|
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
9
lib/models/applied_filters.dart
Normal file
9
lib/models/applied_filters.dart
Normal file
|
@ -0,0 +1,9 @@
|
|||
class AppliedFiters {
|
||||
String selectedResultStatus = 'all';
|
||||
String? searchText;
|
||||
|
||||
AppliedFiters({
|
||||
required this.selectedResultStatus,
|
||||
required this.searchText
|
||||
});
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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<LogsProvider>(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);
|
||||
}
|
|
@ -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<LogsWidget> {
|
|||
|
||||
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<LogsWidget> {
|
|||
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<LogsWidget> {
|
|||
Widget build(BuildContext context) {
|
||||
final logsProvider = Provider.of<LogsProvider>(context);
|
||||
|
||||
void openFilersModal() {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) => const LogsFiltersModal(),
|
||||
backgroundColor: Colors.transparent,
|
||||
isScrollControlled: true
|
||||
);
|
||||
}
|
||||
|
||||
final Map<String, String> 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<LogsWidget> {
|
|||
}
|
||||
|
||||
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()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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<LogsFiltersModalWidget> {
|
|||
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<LogsFiltersModalWidget> {
|
|||
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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue