mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-04-21 06:19:10 +00:00
Added support for custom time in logs settings
This commit is contained in:
parent
2a0db84959
commit
06c9f7c771
2 changed files with 78 additions and 20 deletions
|
@ -12,13 +12,16 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
final void Function(bool) updateGeneralSwitch;
|
final void Function(bool) updateGeneralSwitch;
|
||||||
final bool anonymizeClientIp;
|
final bool anonymizeClientIp;
|
||||||
final void Function(bool) updateAnonymizeClientIp;
|
final void Function(bool) updateAnonymizeClientIp;
|
||||||
final List<int> retentionItems;
|
final List<String> retentionItems;
|
||||||
final double? retentionTime;
|
final String? retentionTime;
|
||||||
final void Function(double?) updateRetentionTime;
|
final void Function(String?) updateRetentionTime;
|
||||||
final void Function() onClear;
|
final void Function() onClear;
|
||||||
final void Function() onConfirm;
|
final void Function() onConfirm;
|
||||||
final List<DomainListItemController> ignoredDomainsControllers;
|
final List<DomainListItemController> ignoredDomainsControllers;
|
||||||
final void Function(List<DomainListItemController>) updateIgnoredDomainsControllers;
|
final void Function(List<DomainListItemController>) updateIgnoredDomainsControllers;
|
||||||
|
final TextEditingController customTimeController;
|
||||||
|
final String? customTimeError;
|
||||||
|
final void Function(String) validateCustomTime;
|
||||||
|
|
||||||
const LogsConfigOptions({
|
const LogsConfigOptions({
|
||||||
super.key,
|
super.key,
|
||||||
|
@ -32,7 +35,10 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
required this.onClear,
|
required this.onClear,
|
||||||
required this.onConfirm,
|
required this.onConfirm,
|
||||||
required this.ignoredDomainsControllers,
|
required this.ignoredDomainsControllers,
|
||||||
required this.updateIgnoredDomainsControllers
|
required this.updateIgnoredDomainsControllers,
|
||||||
|
required this.customTimeController,
|
||||||
|
required this.customTimeError,
|
||||||
|
required this.validateCustomTime,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -40,6 +46,7 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
const Uuid uuid = Uuid();
|
const Uuid uuid = Uuid();
|
||||||
|
|
||||||
final List<String> dropdownItemTranslation = [
|
final List<String> dropdownItemTranslation = [
|
||||||
|
AppLocalizations.of(context)!.custom,
|
||||||
AppLocalizations.of(context)!.hours6,
|
AppLocalizations.of(context)!.hours6,
|
||||||
AppLocalizations.of(context)!.hours24,
|
AppLocalizations.of(context)!.hours24,
|
||||||
AppLocalizations.of(context)!.days7,
|
AppLocalizations.of(context)!.days7,
|
||||||
|
@ -67,7 +74,7 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
}).toList()
|
}).toList()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
print(retentionTime);
|
||||||
return ListView(
|
return ListView(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
@ -92,7 +99,7 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
child: Text(dropdownItemTranslation[item.key]),
|
child: Text(dropdownItemTranslation[item.key]),
|
||||||
)).toList(),
|
)).toList(),
|
||||||
value: retentionTime,
|
value: retentionTime,
|
||||||
onChanged: (value) => updateRetentionTime(double.tryParse(value.toString())),
|
onChanged: (value) => updateRetentionTime(value.toString()),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
border: const OutlineInputBorder(
|
border: const OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.all(
|
borderRadius: BorderRadius.all(
|
||||||
|
@ -104,6 +111,24 @@ class LogsConfigOptions extends StatelessWidget {
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (retentionTime == "custom") Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 24, left: 16, right: 16),
|
||||||
|
child: TextFormField(
|
||||||
|
controller: customTimeController,
|
||||||
|
onChanged: validateCustomTime,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
prefixIcon: const Icon(Icons.schedule_rounded),
|
||||||
|
border: const OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(10)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
labelText: AppLocalizations.of(context)!.customTimeInHours,
|
||||||
|
errorText: customTimeError
|
||||||
|
),
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
),
|
||||||
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(top: 24, bottom: 8),
|
padding: const EdgeInsets.only(top: 24, bottom: 8),
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|
|
@ -37,15 +37,18 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
|
|
||||||
bool generalSwitch = false;
|
bool generalSwitch = false;
|
||||||
bool anonymizeClientIp = false;
|
bool anonymizeClientIp = false;
|
||||||
double? retentionTime;
|
String? retentionTime;
|
||||||
List<DomainListItemController> _ignoredDomainsControllers = [];
|
List<DomainListItemController> _ignoredDomainsControllers = [];
|
||||||
|
final _customTimeController = TextEditingController();
|
||||||
|
String? _customTimeError = null;
|
||||||
|
|
||||||
List<int> retentionItems = [
|
List<String> retentionItems = [
|
||||||
21600000,
|
"custom",
|
||||||
86400000,
|
"21600000",
|
||||||
604800000,
|
"86400000",
|
||||||
2592000000,
|
"604800000",
|
||||||
7776000000
|
"2592000000",
|
||||||
|
"7776000000"
|
||||||
];
|
];
|
||||||
|
|
||||||
LoadStatus loadStatus = LoadStatus.loading;
|
LoadStatus loadStatus = LoadStatus.loading;
|
||||||
|
@ -61,9 +64,10 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
setState(() {
|
setState(() {
|
||||||
generalSwitch = data.enabled ?? false;
|
generalSwitch = data.enabled ?? false;
|
||||||
anonymizeClientIp = data.anonymizeClientIp ?? false;
|
anonymizeClientIp = data.anonymizeClientIp ?? false;
|
||||||
retentionTime = data.interval != null
|
retentionTime = retentionItems.contains(data.interval.toString()) ? data.interval.toString() : "custom";
|
||||||
? double.parse(data.interval.toString())
|
if (data.interval != null && !retentionItems.contains(data.interval.toString())) {
|
||||||
: null;
|
_customTimeController.text = (data.interval!/3.6e+6).toInt().toString();
|
||||||
|
}
|
||||||
if (data.ignored != null) {
|
if (data.ignored != null) {
|
||||||
_ignoredDomainsControllers = data.ignored!.map((e) => DomainListItemController(
|
_ignoredDomainsControllers = data.ignored!.map((e) => DomainListItemController(
|
||||||
id: uuid.v4(),
|
id: uuid.v4(),
|
||||||
|
@ -79,6 +83,34 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void validateCustomTime(String value) {
|
||||||
|
try {
|
||||||
|
final regex = RegExp(r'^\d+$');
|
||||||
|
final parsed = int.parse(value);
|
||||||
|
if (!regex.hasMatch(value)) {
|
||||||
|
setState(() => _customTimeError = AppLocalizations.of(context)!.invalidTime);
|
||||||
|
}
|
||||||
|
else if (parsed < 1) {
|
||||||
|
setState(() => _customTimeError = AppLocalizations.of(context)!.notLess1Hour);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setState(() => _customTimeError = null);
|
||||||
|
}
|
||||||
|
} catch (_) {
|
||||||
|
setState(() => _customTimeError = AppLocalizations.of(context)!.invalidTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkValidValues() {
|
||||||
|
if (_ignoredDomainsControllers.where((d) => d.controller.text == "" || d.error == true).isNotEmpty) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (retentionTime == "custom" && (_customTimeError != null || _customTimeController.text == "")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
loadData();
|
loadData();
|
||||||
|
@ -90,9 +122,7 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
final serversProvider = Provider.of<ServersProvider>(context);
|
final serversProvider = Provider.of<ServersProvider>(context);
|
||||||
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
||||||
|
|
||||||
final validValues = _ignoredDomainsControllers.where(
|
final validValues = checkValidValues();
|
||||||
(d) => d.controller.text == "" || d.error == true
|
|
||||||
).isEmpty;
|
|
||||||
|
|
||||||
void clearQueries() async {
|
void clearQueries() async {
|
||||||
ProcessModal processModal = ProcessModal();
|
ProcessModal processModal = ProcessModal();
|
||||||
|
@ -127,7 +157,7 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
final result = await serversProvider.apiClient2!.updateQueryLogParameters(
|
final result = await serversProvider.apiClient2!.updateQueryLogParameters(
|
||||||
data: {
|
data: {
|
||||||
"enabled": generalSwitch,
|
"enabled": generalSwitch,
|
||||||
"interval": retentionTime,
|
"interval": retentionTime == "custom" ? int.parse(_customTimeController.text)*3.6e+6 : int.parse(retentionTime!) ,
|
||||||
"anonymize_client_ip": anonymizeClientIp,
|
"anonymize_client_ip": anonymizeClientIp,
|
||||||
"ignored": _ignoredDomainsControllers.map((e) => e.controller.text).toList()
|
"ignored": _ignoredDomainsControllers.map((e) => e.controller.text).toList()
|
||||||
}
|
}
|
||||||
|
@ -198,6 +228,9 @@ class _LogsSettingsState extends State<LogsSettings> {
|
||||||
onConfirm: updateConfig,
|
onConfirm: updateConfig,
|
||||||
ignoredDomainsControllers: _ignoredDomainsControllers,
|
ignoredDomainsControllers: _ignoredDomainsControllers,
|
||||||
updateIgnoredDomainsControllers: (v) => setState(() => _ignoredDomainsControllers = v),
|
updateIgnoredDomainsControllers: (v) => setState(() => _ignoredDomainsControllers = v),
|
||||||
|
customTimeController: _customTimeController,
|
||||||
|
customTimeError: _customTimeError,
|
||||||
|
validateCustomTime: validateCustomTime,
|
||||||
);
|
);
|
||||||
|
|
||||||
case LoadStatus.error:
|
case LoadStatus.error:
|
||||||
|
|
Loading…
Add table
Reference in a new issue