From 2e4872a6c503d2519247fea52543b7a86a1c4db9 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sat, 15 Oct 2022 21:47:00 +0200 Subject: [PATCH] Added config logs modal --- lib/l10n/app_en.arb | 11 +- lib/l10n/app_es.arb | 11 +- lib/screens/logs/logs.dart | 23 +++ lib/screens/logs/logs_config_modal.dart | 245 ++++++++++++++++++++++++ 4 files changed, 288 insertions(+), 2 deletions(-) create mode 100644 lib/screens/logs/logs_config_modal.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 3f0a2f8..448810c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -392,5 +392,14 @@ "addDnsRewrite": "Add DNS rewrite", "addingRewrite": "Adding rewrite...", "dnsRewriteRuleAdded": "DNS rewrite rule addded successfully", - "dnsRewriteRuleNotAdded": "DNS rewrite rule could not be added" + "dnsRewriteRuleNotAdded": "DNS rewrite rule could not be added", + "logsSettings": "Logs settings", + "enableLog": "Enable log", + "clearLogs": "Clear logs", + "anonymizeClientIp": "Anonymize client IP", + "hours6": "6 hours", + "days30": "30 days", + "days90": "90 days", + "retentionTime": "Retention time", + "selectOneItem": "Select one item" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index e075a89..f245d30 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -392,5 +392,14 @@ "addDnsRewrite": "Añadir reescritura DNS", "addingRewrite": "Añadiend reescritura...", "dnsRewriteRuleAdded": "Regla de reescritura DNS añadida correctamente", - "dnsRewriteRuleNotAdded": "La regla de reescritura DNS no ha podido ser añadida" + "dnsRewriteRuleNotAdded": "La regla de reescritura DNS no ha podido ser añadida", + "logsSettings": "Ajustes de registros", + "enableLog": "Habilitar registro", + "clearLogs": "Borrar registros", + "anonymizeClientIp": "Anonimizar IP de los clientes", + "hours6": "6 horas", + "days30": "30 días", + "days90": "90 días", + "retentionTime": "Tiempo de retención", + "selectOneItem": "Selecciona un elemento" } \ No newline at end of file diff --git a/lib/screens/logs/logs.dart b/lib/screens/logs/logs.dart index afa4e5a..f9bd875 100644 --- a/lib/screens/logs/logs.dart +++ b/lib/screens/logs/logs.dart @@ -5,6 +5,7 @@ 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/logs_config_modal.dart'; import 'package:adguard_home_manager/screens/logs/log_tile.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; @@ -268,6 +269,14 @@ class _LogsWidgetState extends State { } } + void updateConfig(Map data) async { + + } + + void clearQueries() async { + + } + return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context)!.logs), @@ -278,6 +287,20 @@ class _LogsWidgetState extends State { icon: const Icon(Icons.filter_list_rounded) ) : const SizedBox(), + IconButton( + onPressed: () => { + showModalBottomSheet( + context: context, + builder: (context) => LogsConfigModal( + onConfirm: updateConfig, + onClear: clearQueries, + ), + backgroundColor: Colors.transparent, + isScrollControlled: true + ) + }, + icon: const Icon(Icons.settings) + ), const SizedBox(width: 5), ], bottom: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' diff --git a/lib/screens/logs/logs_config_modal.dart b/lib/screens/logs/logs_config_modal.dart new file mode 100644 index 0000000..a50f839 --- /dev/null +++ b/lib/screens/logs/logs_config_modal.dart @@ -0,0 +1,245 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/providers/app_config_provider.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; + +class LogsConfigModal extends StatelessWidget { + final void Function(Map) onConfirm; + final void Function() onClear; + + const LogsConfigModal({ + Key? key, + required this.onConfirm, + required this.onClear, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + + return LogsConfigModalWidget( + serversProvider: serversProvider, + appConfigProvider: appConfigProvider, + context: context, + onConfirm: onConfirm, + onClear: onClear, + ); + } +} + +class LogsConfigModalWidget extends StatefulWidget { + final ServersProvider serversProvider; + final AppConfigProvider appConfigProvider; + final BuildContext context; + final void Function(Map) onConfirm; + final void Function() onClear; + + const LogsConfigModalWidget({ + Key? key, + required this.serversProvider, + required this.appConfigProvider, + required this.context, + required this.onConfirm, + required this.onClear, + }) : super(key: key); + + @override + State createState() => _LogsConfigModalWidgetState(); +} + +class _LogsConfigModalWidgetState extends State { + bool generalSwitch = false; + bool anonymizeClientIp = false; + String? retentionTime = ""; + + List> retentionItems = []; + + @override + void initState() { + retentionItems = [ + { + 'label': AppLocalizations.of(widget.context)!.hours6, + 'value': 0.25 + }, + { + 'label': AppLocalizations.of(widget.context)!.hours24, + 'value': 1 + }, + { + 'label': AppLocalizations.of(widget.context)!.days7, + 'value': 7 + }, + { + 'label': AppLocalizations.of(widget.context)!.days30, + 'value': 30 + }, + { + 'label': AppLocalizations.of(widget.context)!.days90, + 'value': 90 + }, + ]; + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + height: 450, + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(28) + ), + color: Theme.of(context).dialogBackgroundColor + ), + child: Column( + children: [ + const Padding( + padding: EdgeInsets.only(top: 28), + child: Icon( + Icons.settings, + size: 26, + ), + ), + const SizedBox(height: 20), + Text( + AppLocalizations.of(context)!.logsSettings, + style: const TextStyle( + fontSize: 24 + ), + ), + const SizedBox(height: 30), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Material( + color: Theme.of(context).primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(28), + child: InkWell( + onTap: () => setState(() => generalSwitch = !generalSwitch), + borderRadius: BorderRadius.circular(28), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 8 + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of(context)!.enableLog, + style: const TextStyle( + fontSize: 18, + ), + ), + Switch( + value: generalSwitch, + onChanged: (value) => setState(() => generalSwitch = value), + activeColor: Theme.of(context).primaryColor, + ) + ], + ), + ), + ), + ), + ), + const SizedBox(height: 20), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () => setState(() => anonymizeClientIp = !anonymizeClientIp), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of(context)!.anonymizeClientIp, + style: const TextStyle( + fontSize: 16 + ), + ), + Switch( + value: anonymizeClientIp, + onChanged: (value) => setState(() => anonymizeClientIp = value), + activeColor: Theme.of(context).primaryColor, + ) + ], + ), + ), + ), + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 28), + child: DropdownButtonFormField( + items: retentionItems.map>((Map item) { + return DropdownMenuItem( + value: item['value'].toString(), + child: Text(item['label']), + ); + }).toList(), + onChanged: (value) => setState(() => retentionTime = value), + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10) + ) + ), + label: Text(AppLocalizations.of(context)!.retentionTime) + ), + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.all(20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton( + onPressed: widget.onClear, + child: Text(AppLocalizations.of(context)!.clearLogs) + ), + Row( + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(AppLocalizations.of(context)!.cancel) + ), + const SizedBox(width: 20), + TextButton( + onPressed: retentionTime != '' + ? () => widget.onConfirm({ + "enabled": generalSwitch, + "interval": double.parse(retentionTime!), + "anonymize_client_ip": anonymizeClientIp + }) + : null, + child: Text( + AppLocalizations.of(context)!.confirm, + style: TextStyle( + color: retentionTime != '' + ? Theme.of(context).primaryColor + : Colors.grey + ), + ) + ), + ], + ) + ], + ), + ) + ], + ), + ) + ], + ), + ); + } +} \ No newline at end of file