Added config logs modal

This commit is contained in:
Juan Gilsanz Polo 2022-10-15 21:47:00 +02:00
parent 0c84ca75d6
commit 2e4872a6c5
4 changed files with 288 additions and 2 deletions

View file

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

View file

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

View file

@ -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<LogsWidget> {
}
}
void updateConfig(Map<String, dynamic> data) async {
}
void clearQueries() async {
}
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.logs),
@ -278,6 +287,20 @@ class _LogsWidgetState extends State<LogsWidget> {
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'

View file

@ -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<String, dynamic>) 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<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(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<String, dynamic>) 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<LogsConfigModalWidget> createState() => _LogsConfigModalWidgetState();
}
class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
bool generalSwitch = false;
bool anonymizeClientIp = false;
String? retentionTime = "";
List<Map<String, dynamic>> 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<DropdownMenuItem<String>>((Map<String, dynamic> item) {
return DropdownMenuItem<String>(
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
),
)
),
],
)
],
),
)
],
),
)
],
),
);
}
}