Create management portal in Flutter #39

This commit is contained in:
Scott E. Graves 2025-03-06 12:50:31 -06:00
parent d2065af398
commit 8da6008e29
3 changed files with 65 additions and 77 deletions

View File

@ -110,7 +110,7 @@ class _AddMountScreenState extends State<AddMountScreen> {
child: MountSettingsWidget(
isAdd: true,
mount: _mount!,
onChanged: (settings) => _settings[_mountType] = settings,
settings: _settings[_mountType]!,
showAdvanced: _showAdvanced,
),
),

View File

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:repertory/models/mount.dart';
import 'package:repertory/widgets/mount_settings.dart';
@ -34,6 +36,7 @@ class _EditMountScreenState extends State<EditMountScreen> {
),
body: MountSettingsWidget(
mount: widget.mount,
settings: jsonDecode(jsonEncode(widget.mount.mountConfig.settings)),
showAdvanced: _showAdvanced,
),
);

View File

@ -1,5 +1,3 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -12,11 +10,13 @@ class MountSettingsWidget extends StatefulWidget {
final bool showAdvanced;
final Mount mount;
final Function? onChanged;
final Map<String, dynamic> settings;
const MountSettingsWidget({
super.key,
this.isAdd = false,
required this.mount,
this.onChanged,
required this.settings,
required this.showAdvanced,
});
@ -25,8 +25,6 @@ class MountSettingsWidget extends StatefulWidget {
}
class _MountSettingsWidgetState extends State<MountSettingsWidget> {
Map<String, dynamic> _settings = {};
void _addBooleanSetting(list, root, key, value, isAdvanced) {
if (!isAdvanced || widget.showAdvanced) {
list.add(
@ -37,13 +35,13 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
onPressed: (_) {
setState(() {
root[key] = !value;
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
},
onToggle: (bool nextValue) {
setState(() {
root[key] = nextValue;
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
},
),
@ -76,7 +74,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
onPressed: () {
setState(() {
root[key] = int.parse(updatedValue);
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
Navigator.of(context).pop();
},
@ -121,7 +119,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
onChanged: (newValue) {
setState(() {
root[key] = int.parse(newValue ?? defaultValue.toString());
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
},
items:
@ -156,7 +154,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
onChanged: (newValue) {
setState(() {
root[key] = newValue;
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
},
items:
@ -209,7 +207,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
onPressed: () {
setState(() {
root[key] = updatedValue;
widget.onChanged?.call(_settings);
widget.onChanged?.call(widget.settings);
});
Navigator.of(context).pop();
},
@ -242,15 +240,15 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
List<SettingsTile> s3ConfigSettings = [];
List<SettingsTile> siaConfigSettings = [];
_settings.forEach((key, value) {
widget.settings.forEach((key, value) {
if (key == 'ApiAuth') {
_addPasswordSetting(commonSettings, _settings, key, value, true);
_addPasswordSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'ApiPort') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'ApiUser') {
_addStringSetting(
commonSettings,
_settings,
widget.settings,
key,
value,
Icons.person,
@ -259,7 +257,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (key == 'DatabaseType') {
_addListSetting(
commonSettings,
_settings,
widget.settings,
key,
value,
databaseTypeList,
@ -267,15 +265,15 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
true,
);
} else if (key == 'DownloadTimeoutSeconds') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'EnableDownloadTimeout') {
_addBooleanSetting(commonSettings, _settings, key, value, true);
_addBooleanSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'EnableDriveEvents') {
_addBooleanSetting(commonSettings, _settings, key, value, true);
_addBooleanSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'EventLevel') {
_addListSetting(
commonSettings,
_settings,
widget.settings,
key,
value,
eventLevelList,
@ -283,19 +281,19 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
false,
);
} else if (key == 'EvictionDelayMinutes') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'EvictionUseAccessedTime') {
_addBooleanSetting(commonSettings, _settings, key, value, true);
_addBooleanSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'MaxCacheSizeBytes') {
_addIntSetting(commonSettings, _settings, key, value, false);
_addIntSetting(commonSettings, widget.settings, key, value, false);
} else if (key == 'MaxUploadCount') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'OnlineCheckRetrySeconds') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'PreferredDownloadType') {
_addListSetting(
commonSettings,
_settings,
widget.settings,
key,
value,
downloadTypeList,
@ -303,11 +301,11 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
false,
);
} else if (key == 'RetryReadCount') {
_addIntSetting(commonSettings, _settings, key, value, true);
_addIntSetting(commonSettings, widget.settings, key, value, true);
} else if (key == 'RingBufferFileSize') {
_addIntListSetting(
commonSettings,
_settings,
widget.settings,
key,
value,
ringBufferSizeList,
@ -320,7 +318,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == 'EncryptionToken') {
_addPasswordSetting(
encryptConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -328,7 +326,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'Path') {
_addStringSetting(
encryptConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.folder,
@ -341,7 +339,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == 'AgentString') {
_addStringSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.support_agent,
@ -350,7 +348,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ApiPassword') {
_addPasswordSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -358,7 +356,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ApiPort') {
_addIntSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -366,7 +364,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ApiUser') {
_addStringSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.person,
@ -375,7 +373,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'HostNameOrIp') {
_addStringSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.computer,
@ -384,7 +382,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'Path') {
_addStringSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.route,
@ -393,7 +391,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'Protocol') {
_addListSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
protocolTypeList,
@ -403,7 +401,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'TimeoutMs') {
_addIntSetting(
hostConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -415,7 +413,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == 'ApiPort') {
_addIntSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -423,7 +421,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'EncryptionToken') {
_addPasswordSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -431,7 +429,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'HostNameOrIp') {
_addStringSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.computer,
@ -440,7 +438,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'MaxConnections') {
_addIntSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -448,7 +446,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ReceiveTimeoutMs') {
_addIntSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -456,7 +454,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'SendTimeoutMs') {
_addIntSetting(
remoteConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -469,7 +467,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
List<SettingsTile> tempSettings = [];
_addBooleanSetting(
tempSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -478,7 +476,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ApiPort') {
_addIntSetting(
remoteMountSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -486,7 +484,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'ClientPoolSize') {
_addIntSetting(
remoteMountSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -494,7 +492,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'EncryptionToken') {
_addPasswordSetting(
remoteMountSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -506,7 +504,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == 'AccessKey') {
_addPasswordSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -514,7 +512,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'Bucket') {
_addStringSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.folder,
@ -523,7 +521,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'EncryptionToken') {
_addPasswordSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -531,7 +529,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'Region') {
_addStringSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.map,
@ -540,7 +538,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'SecretKey') {
_addPasswordSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -548,7 +546,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'TimeoutMs') {
_addIntSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
true,
@ -556,7 +554,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'URL') {
_addStringSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.http,
@ -565,7 +563,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'UsePathStyle') {
_addBooleanSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -573,7 +571,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
} else if (subKey == 'UseRegionInURL') {
_addBooleanSetting(
s3ConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
false,
@ -585,7 +583,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
if (subKey == 'Bucket') {
_addStringSetting(
siaConfigSettings,
_settings[key],
widget.settings[key],
subKey,
subValue,
Icons.folder,
@ -628,11 +626,12 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
SettingsSection(
title: const Text('Remote Mount'),
tiles:
_settings['RemoteMount']['Enable'] as bool
widget.settings['RemoteMount']['Enable'] as bool
? remoteMountSettings
: [remoteMountSettings[0]],
),
SettingsSection(title: const Text('Settings'), tiles: commonSettings),
if (commonSettings.isNotEmpty)
SettingsSection(title: const Text('Settings'), tiles: commonSettings),
],
);
}
@ -641,8 +640,8 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
void dispose() {
if (!widget.isAdd) {
var settings = widget.mount.mountConfig.settings;
if (!DeepCollectionEquality().equals(_settings, settings)) {
_settings.forEach((key, value) {
if (!DeepCollectionEquality().equals(widget.settings, settings)) {
widget.settings.forEach((key, value) {
if (!DeepCollectionEquality().equals(settings[key], value)) {
if (value is Map<String, dynamic>) {
value.forEach((subKey, subValue) {
@ -660,21 +659,7 @@ class _MountSettingsWidgetState extends State<MountSettingsWidget> {
});
}
}
super.dispose();
}
@override
void initState() {
_settings = jsonDecode(jsonEncode(widget.mount.mountConfig.settings));
super.initState();
}
@override
void setState(VoidCallback fn) {
if (!mounted) {
return;
}
super.setState(fn);
}
}