Chips for applied logs filters

This commit is contained in:
Juan Gilsanz Polo 2022-10-09 18:47:34 +02:00
parent 9e468318fc
commit b336856349
8 changed files with 166 additions and 70 deletions

View file

@ -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()
)
];

View file

@ -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"
}

View file

@ -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"
}

View file

@ -0,0 +1,9 @@
class AppliedFiters {
String selectedResultStatus = 'all';
String? searchText;
AppliedFiters({
required this.selectedResultStatus,
required this.searchText
});
}

View file

@ -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();
}
}

View file

@ -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);
}

View file

@ -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()
);
}

View file

@ -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);