Added search ip domain logs

This commit is contained in:
Juan Gilsanz Polo 2022-10-02 13:55:41 +02:00
parent 441dad441d
commit 97494ef1a1
4 changed files with 257 additions and 172 deletions

View file

@ -7,6 +7,7 @@ class LogsProvider with ChangeNotifier {
DateTime? _logsOlderThan;
String _selectedResultStatus = 'all';
String? _searchIpDomain;
int _logsQuantity = 100;
int _offset = 0;
@ -27,6 +28,10 @@ class LogsProvider with ChangeNotifier {
return _selectedResultStatus;
}
String? get searchIpDomain {
return _searchIpDomain;
}
int get logsQuantity {
return _logsQuantity;
}
@ -55,6 +60,7 @@ class LogsProvider with ChangeNotifier {
_logsOlderThan = null;
_offset = 0;
_selectedResultStatus = 'all';
_searchIpDomain = null;
notifyListeners();
}
@ -71,4 +77,8 @@ class LogsProvider with ChangeNotifier {
_selectedResultStatus = value;
notifyListeners();
}
void setSearchIpDomain(String value) {
_searchIpDomain = value;
notifyListeners();
}
}

View file

@ -2,9 +2,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/services/http_requests.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/providers/logs_provider.dart';
class FilterStatusModal extends StatefulWidget {
@ -31,30 +28,11 @@ class _FilterStatusModalState extends State<FilterStatusModal> {
@override
Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context);
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void apply() async {
logsProvider.setLoadStatus(0);
logsProvider.setSelectedResultStatus(selectedResultStatus);
Navigator.pop(context);
final result = await getLogs(
server: serversProvider.selectedServer!,
count: logsProvider.logsQuantity,
responseStatus: selectedResultStatus
);
if (result['result'] == 'success') {
logsProvider.setLogsData(result['data']);
logsProvider.setLoadStatus(1);
}
else {
appConfigProvider.addLog(result['log']);
logsProvider.setLoadStatus(2);
}
}
Widget filterStatusListItem({

View file

@ -14,6 +14,38 @@ import 'package:adguard_home_manager/providers/logs_provider.dart';
class LogsFiltersModal extends StatelessWidget {
const LogsFiltersModal({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context);
return LogsFiltersModalWidget(
logsProvider: logsProvider
);
}
}
class LogsFiltersModalWidget extends StatefulWidget {
final LogsProvider logsProvider;
const LogsFiltersModalWidget({
Key? key,
required this.logsProvider
}) : super(key: key);
@override
State<LogsFiltersModalWidget> createState() => _LogsFiltersModalWidgetState();
}
class _LogsFiltersModalWidgetState extends State<LogsFiltersModalWidget> {
TextEditingController addressController = TextEditingController();
String? addressFieldError;
@override
void initState() {
addressController.text = widget.logsProvider.searchIpDomain ?? '';
super.initState();
}
@override
Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context);
@ -56,24 +88,6 @@ class LogsFiltersModal extends StatelessWidget {
).toUtc();
logsProvider.setLogsOlderThan(value);
logsProvider.setLoadStatus(0);
logsProvider.setOffset(0);
final result = await getLogs(
server: serversProvider.selectedServer!,
count: logsProvider.logsQuantity,
olderThan: logsProvider.logsOlderThan
);
if (result['result'] == 'success') {
logsProvider.setLogsData(result['data']);
logsProvider.setLoadStatus(1);
}
else {
appConfigProvider.addLog(result['log']);
logsProvider.setLoadStatus(2);
}
}
}
}
@ -109,8 +123,57 @@ class LogsFiltersModal extends StatelessWidget {
);
}
return Container(
height: 350,
void validateAddress(String? value) {
if (value != null && value != '') {
RegExp ipAddress = RegExp(r'^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$');
RegExp domain = RegExp(r'^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$');
if (ipAddress.hasMatch(value) == true || domain.hasMatch(value) == true) {
setState(() {
addressFieldError = null;
});
logsProvider.setSearchIpDomain(addressController.text);
}
else {
setState(() {
addressFieldError = AppLocalizations.of(context)!.invalidIpDomain;
});
}
}
else {
setState(() {
addressFieldError = AppLocalizations.of(context)!.ipDomainNotEmpty;
});
}
}
void filterLogs() async {
Navigator.pop(context);
logsProvider.setLoadStatus(0);
logsProvider.setOffset(0);
final result = await getLogs(
server: serversProvider.selectedServer!,
count: logsProvider.logsQuantity,
olderThan: logsProvider.logsOlderThan,
responseStatus: logsProvider.selectedResultStatus,
search: logsProvider.searchIpDomain,
);
if (result['result'] == 'success') {
logsProvider.setLogsData(result['data']);
logsProvider.setLoadStatus(1);
}
else {
appConfigProvider.addLog(result['log']);
logsProvider.setLoadStatus(2);
}
}
return Padding(
padding: MediaQuery.of(context).viewInsets,
child: Container(
height: 470,
decoration: BoxDecoration(
color: Theme.of(context).dialogBackgroundColor,
borderRadius: const BorderRadius.only(
@ -141,6 +204,38 @@ class LogsFiltersModal extends StatelessWidget {
child: ListView(
physics: const NeverScrollableScrollPhysics(),
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Row(
children: [
SizedBox(
width: MediaQuery.of(context).size.width - 108,
child: TextFormField(
controller: addressController,
onChanged: validateAddress,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.link_rounded),
errorText: addressFieldError,
border: const OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(10)
)
),
labelText: AppLocalizations.of(context)!.ipDomain,
),
),
),
const SizedBox(width: 20),
IconButton(
onPressed: () => setState(() {
addressController.text = '';
addressFieldError = null;
}),
icon: const Icon(Icons.clear)
)
],
),
),
Material(
color: Colors.transparent,
child: InkWell(
@ -234,14 +329,15 @@ class LogsFiltersModal extends StatelessWidget {
child: Text(AppLocalizations.of(context)!.resetFilters)
),
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(AppLocalizations.of(context)!.close)
onPressed: filterLogs,
child: Text(AppLocalizations.of(context)!.apply)
),
],
),
)
],
),
),
);
}
}

View file

@ -366,9 +366,10 @@ Future getLogs({
int? offset,
DateTime? olderThan,
String? responseStatus,
String? search
}) async {
final result = await getRequest(
urlPath: '/querylog?limit=$count${offset != null ? '&offset=$offset' : ''}${olderThan != null ? '&older_than=${olderThan.toIso8601String()}' : ''}${responseStatus != null ? '&response_status=$responseStatus' : ''}',
urlPath: '/querylog?limit=$count${offset != null ? '&offset=$offset' : ''}${olderThan != null ? '&older_than=${olderThan.toIso8601String()}' : ''}${responseStatus != null ? '&response_status=$responseStatus' : ''}${search != null ? '&search=$search' : ''}',
server: server
);