From 697a33bd16c37db91695f19ece1d59b2ac26d5d7 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sat, 8 Oct 2022 22:41:30 +0200 Subject: [PATCH] Added edit filter list --- lib/l10n/app_en.arb | 4 +- lib/l10n/app_es.arb | 4 +- lib/screens/filters/add_list_modal.dart | 62 ++++++++++++++++---- lib/screens/filters/fab.dart | 4 +- lib/screens/filters/filters_list.dart | 63 ++++++++++++++++++++- lib/screens/filters/list_details_modal.dart | 7 ++- 6 files changed, 127 insertions(+), 17 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f4c3042..c6f9d42 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -240,5 +240,7 @@ "currentStatus": "Current status", "listDataUpdated": "List data updated successfull", "listDataNotUpdated": "Couldn't update list data", - "updatingListData": "Updating list data..." + "updatingListData": "Updating list data...", + "editWhitelist": "Edit white list", + "editBlacklist": "Edit black list" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 303fbff..efeba52 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -240,5 +240,7 @@ "currentStatus": "Estado actual", "listDataUpdated": "Datos de lista actualizados correctamente", "listDataNotUpdated": "No se han podido actualizar los datos de la lista", - "updatingListData": "Actualizando datos de lista..." + "updatingListData": "Actualizando datos de lista...", + "editWhitelist": "Editar lista blanca", + "editBlacklist": "Editar lista negra" } \ No newline at end of file diff --git a/lib/screens/filters/add_list_modal.dart b/lib/screens/filters/add_list_modal.dart index f68dde2..b0621dc 100644 --- a/lib/screens/filters/add_list_modal.dart +++ b/lib/screens/filters/add_list_modal.dart @@ -1,14 +1,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/models/filtering.dart'; + class AddListModal extends StatefulWidget { final String type; - final void Function({required String name, required String url}) onConfirm; + final Filter? list; + final void Function({required String name, required String url})? onConfirm; + final void Function({required Filter list, required String type})? onEdit; const AddListModal({ Key? key, required this.type, - required this.onConfirm, + this.list, + this.onConfirm, + this.onEdit, }) : super(key: key); @override @@ -47,6 +53,17 @@ class _AddListModalState extends State { } } + @override + void initState() { + if (widget.list != null) { + nameController.text = widget.list!.name; + urlController.text = widget.list!.url; + + validData = true; + } + super.initState(); + } + @override Widget build(BuildContext context) { return Padding( @@ -71,9 +88,13 @@ class _AddListModalState extends State { ), const SizedBox(height: 20), Text( - widget.type == 'whitelist' - ? AppLocalizations.of(context)!.addWhitelist - : AppLocalizations.of(context)!.addBlacklist, + widget.list != null + ? widget.type == 'whitelist' + ? AppLocalizations.of(context)!.editWhitelist + : AppLocalizations.of(context)!.editBlacklist + : widget.type == 'whitelist' + ? AppLocalizations.of(context)!.addWhitelist + : AppLocalizations.of(context)!.addBlacklist, style: const TextStyle( fontSize: 24 ), @@ -96,6 +117,7 @@ class _AddListModalState extends State { TextFormField( controller: urlController, onChanged: validateUrl, + enabled: widget.list != null ? false : true, decoration: InputDecoration( prefixIcon: const Icon(Icons.link_rounded), border: const OutlineInputBorder( @@ -123,12 +145,32 @@ class _AddListModalState extends State { TextButton( onPressed: () { Navigator.pop(context); - widget.onConfirm( - name: nameController.text, - url: urlController.text - ); + if (widget.list != null) { + final Filter newList = Filter( + url: urlController.text, + name: nameController.text, + lastUpdated: widget.list!.lastUpdated, + id: widget.list!.id, + rulesCount: widget.list!.rulesCount, + enabled: widget.list!.enabled + ); + widget.onEdit!( + list: newList, + type: widget.type + ); + } + else { + widget.onConfirm!( + name: nameController.text, + url: urlController.text, + ); + } }, - child: Text(AppLocalizations.of(context)!.confirm) + child: Text( + widget.list != null + ? AppLocalizations.of(context)!.save + : AppLocalizations.of(context)!.confirm + ) ), ], ), diff --git a/lib/screens/filters/fab.dart b/lib/screens/filters/fab.dart index 39f7d04..f6c2aa8 100644 --- a/lib/screens/filters/fab.dart +++ b/lib/screens/filters/fab.dart @@ -72,7 +72,7 @@ class FiltersFab extends StatelessWidget { ); } - void confirmAddList({required String name, required String url}) async { + void confirmAddList({required String name, required String url, String? type}) async { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingList); @@ -157,7 +157,7 @@ class FiltersFab extends StatelessWidget { context: context, builder: (ctx) => AddListModal( type: type, - onConfirm: confirmAddList + onConfirm: confirmAddList, ), isScrollControlled: true, backgroundColor: Colors.transparent diff --git a/lib/screens/filters/filters_list.dart b/lib/screens/filters/filters_list.dart index 497a2e1..06d4ec0 100644 --- a/lib/screens/filters/filters_list.dart +++ b/lib/screens/filters/filters_list.dart @@ -9,6 +9,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/filters/fab.dart'; import 'package:adguard_home_manager/screens/filters/list_details_modal.dart'; +import 'package:adguard_home_manager/screens/filters/add_list_modal.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; @@ -116,6 +117,55 @@ class _FiltersListState extends State { } } + void confirmEditList({required Filter list, required String type}) async { + ProcessModal processModal = ProcessModal(context: context); + processModal.open(AppLocalizations.of(context)!.addingList); + + final result1 = await updateFilterList(server: serversProvider.selectedServer!, data: { + "data": { + "enabled": list.enabled, + "name": list.name, + "url": list.url + }, + "url": list.url, + "whitelist": type == 'whitelist' ? true : false + }); + + if (result1['result'] == 'success') { + final result2 = await getFiltering(server: serversProvider.selectedServer!); + + if (result2['result'] == 'success') { + serversProvider.setFilteringData(result2['data']); + serversProvider.setFilteringLoadStatus(1, true); + } + else { + appConfigProvider.addLog(result2['log']); + serversProvider.setFilteringLoadStatus(2, true); + } + + processModal.close(); + + appConfigProvider.setShowingSnackbar(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.listDataUpdated), + backgroundColor: Colors.green, + ) + ); + } + else { + processModal.close(); + appConfigProvider.addLog(result1['log']); + appConfigProvider.setShowingSnackbar(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.listDataNotUpdated), + backgroundColor: Colors.red, + ) + ); + } + } + void openDetailsModal(Filter filter) { showModalBottomSheet( context: context, @@ -123,7 +173,18 @@ class _FiltersListState extends State { list: filter, type: widget.type, onDelete: () => {}, - edit: () => {}, + edit: (type) => { + showModalBottomSheet( + context: context, + builder: (ctx) => AddListModal( + list: filter, + type: type, + onEdit: confirmEditList + ), + isScrollControlled: true, + backgroundColor: Colors.transparent + ) + }, onEnableDisable: enableDisableList, ), backgroundColor: Colors.transparent, diff --git a/lib/screens/filters/list_details_modal.dart b/lib/screens/filters/list_details_modal.dart index 370226b..012a59f 100644 --- a/lib/screens/filters/list_details_modal.dart +++ b/lib/screens/filters/list_details_modal.dart @@ -10,7 +10,7 @@ class ListDetailsModal extends StatelessWidget { final Filter list; final String type; final void Function() onDelete; - final void Function() edit; + final void Function(String) edit; final void Function(Filter, bool) onEnableDisable; const ListDetailsModal({ @@ -134,7 +134,10 @@ class ListDetailsModal extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton( - onPressed: edit, + onPressed: () { + Navigator.pop(context); + edit(type); + }, icon: const Icon(Icons.edit) ), TextButton(