mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-22 01:34:25 +00:00
Added ignored domains list config
This commit is contained in:
parent
211eab9f44
commit
c12e8c5ad3
6 changed files with 218 additions and 31 deletions
|
@ -1,6 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'package:adguard_home_manager/screens/settings/logs_settings/logs_settings.dart';
|
||||
import 'package:adguard_home_manager/widgets/section_label.dart';
|
||||
import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart';
|
||||
|
||||
class LogsConfigOptions extends StatelessWidget {
|
||||
|
@ -13,6 +16,8 @@ class LogsConfigOptions extends StatelessWidget {
|
|||
final void Function(double?) updateRetentionTime;
|
||||
final void Function() onClear;
|
||||
final void Function() onConfirm;
|
||||
final List<DomainListItemController> ignoredDomainsControllers;
|
||||
final void Function(List<DomainListItemController>) updateIgnoredDomainsControllers;
|
||||
|
||||
const LogsConfigOptions({
|
||||
super.key,
|
||||
|
@ -24,11 +29,15 @@ class LogsConfigOptions extends StatelessWidget {
|
|||
required this.retentionTime,
|
||||
required this.updateRetentionTime,
|
||||
required this.onClear,
|
||||
required this.onConfirm
|
||||
required this.onConfirm,
|
||||
required this.ignoredDomainsControllers,
|
||||
required this.updateIgnoredDomainsControllers
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
const Uuid uuid = Uuid();
|
||||
|
||||
final List<String> dropdownItemTranslation = [
|
||||
AppLocalizations.of(context)!.hours6,
|
||||
AppLocalizations.of(context)!.hours24,
|
||||
|
@ -37,7 +46,28 @@ class LogsConfigOptions extends StatelessWidget {
|
|||
AppLocalizations.of(context)!.days90,
|
||||
];
|
||||
|
||||
return Column(
|
||||
void validateDomain(String value, String id) {
|
||||
final domainRegex = RegExp(r'^([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+$');
|
||||
bool error = false;
|
||||
if (domainRegex.hasMatch(value)) {
|
||||
error = false;
|
||||
}
|
||||
else {
|
||||
error = true;
|
||||
}
|
||||
updateIgnoredDomainsControllers(
|
||||
ignoredDomainsControllers.map((entry) {
|
||||
if (entry.id != id) return entry;
|
||||
return DomainListItemController(
|
||||
id: id,
|
||||
controller: entry.controller,
|
||||
error: error
|
||||
);
|
||||
}).toList()
|
||||
);
|
||||
}
|
||||
|
||||
return ListView(
|
||||
children: [
|
||||
const SizedBox(height: 16),
|
||||
Padding(
|
||||
|
@ -100,12 +130,83 @@ class LogsConfigOptions extends StatelessWidget {
|
|||
borderRadius: BorderRadius.circular(20),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
ElevatedButton.icon(
|
||||
onPressed: onClear,
|
||||
icon: const Icon(Icons.delete_rounded),
|
||||
label: Text(AppLocalizations.of(context)!.clearLogs),
|
||||
)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 24, bottom: 8),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SectionLabel(
|
||||
label: AppLocalizations.of(context)!.ignoredDomains,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 0),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
child: IconButton(
|
||||
onPressed: () => updateIgnoredDomainsControllers([
|
||||
...ignoredDomainsControllers,
|
||||
DomainListItemController(
|
||||
id: uuid.v4(),
|
||||
controller: TextEditingController(),
|
||||
error: false
|
||||
),
|
||||
]),
|
||||
icon: const Icon(Icons.add)
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
if (ignoredDomainsControllers.isNotEmpty) ...ignoredDomainsControllers.map((controller) => Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 12, bottom: 12, left: 24, right: 10
|
||||
),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextFormField(
|
||||
controller: controller.controller,
|
||||
onChanged: (v) => validateDomain(v, controller.id),
|
||||
decoration: InputDecoration(
|
||||
prefixIcon: const Icon(Icons.link_rounded),
|
||||
border: const OutlineInputBorder(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(10)
|
||||
)
|
||||
),
|
||||
labelText: AppLocalizations.of(context)!.domain,
|
||||
errorText: controller.error
|
||||
? AppLocalizations.of(context)!.invalidDomain
|
||||
: null
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Padding(
|
||||
padding: controller.error
|
||||
? const EdgeInsets.only(bottom: 24)
|
||||
: const EdgeInsets.all(0),
|
||||
child: IconButton(
|
||||
onPressed: () => updateIgnoredDomainsControllers(
|
||||
ignoredDomainsControllers.where((e) => e.id != controller.id).toList()
|
||||
),
|
||||
icon: const Icon(Icons.remove_circle_outline_outlined)
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
if (ignoredDomainsControllers.isEmpty) Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!.noIgnoredDomainsAdded,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue