Create management portal in Flutter #39

This commit is contained in:
Scott E. Graves 2025-03-05 14:03:11 -06:00
parent f2db24b239
commit 9409622fef
3 changed files with 62 additions and 52 deletions

View File

@ -76,26 +76,62 @@ class MyHomePage extends StatefulWidget {
class _MyHomePageState extends State<MyHomePage> { class _MyHomePageState extends State<MyHomePage> {
bool _allowAdd = true; bool _allowAdd = true;
String? _apiAuth; String? _apiPassword;
String? _apiPort; String? _apiPort;
String? _bucket; String? _bucket;
String? _encryptionToken; String? _encryptionToken;
String? _hostNameOrIp; String? _hostNameOrIp;
String _mountType = 'Encrypt'; String _mountType = 'Encrypt';
String _mountName = ''; String _mountName = "";
String? _path; String? _path;
void _resetData() { void _resetData() {
_apiAuth = null; _apiPassword = null;
_apiPort = null; _apiPort = null;
_bucket = null; _bucket = null;
_encryptionToken = null; _encryptionToken = null;
_hostNameOrIp = null; _hostNameOrIp = null;
_mountName = ''; _mountName = "";
_mountType = 'Encrypt'; _mountType = 'Encrypt';
_path = null; _path = null;
} }
void _updateData(String name, String? value) {
switch (name) {
case 'ApiPassword':
_apiPassword = value ?? '';
return;
case 'ApiPort':
_apiPort = value ?? '';
return;
case 'Bucket':
_bucket = value ?? '';
return;
case 'EncryptionToken':
_encryptionToken = value ?? '';
return;
case 'HostNameOrIp':
_hostNameOrIp = value ?? '';
return;
case 'Name':
_mountName = value ?? '';
return;
case 'Provider':
_mountType = value ?? 'Encrypt';
return;
case 'Path':
_path = value ?? '';
return;
}
}
@override @override
Widget build(context) { Widget build(context) {
return Scaffold( return Scaffold(
@ -118,20 +154,7 @@ class _MyHomePageState extends State<MyHomePage> {
builder: (_, MountList mountList, __) { builder: (_, MountList mountList, __) {
return AddMountWidget( return AddMountWidget(
mountType: _mountType, mountType: _mountType,
onApiAuthChanged: (apiAuth) => _apiAuth = apiAuth, onDataChanged: _updateData,
onApiPortChanged: (apiPort) => _apiPort = apiPort,
onBucketChanged: (bucket) => _bucket = bucket,
onEncryptionTokenChanged:
(encryptionToken) =>
_encryptionToken = encryptionToken,
onHostNameOrIpChanged:
(hostNameOrIp) =>
_hostNameOrIp = hostNameOrIp,
onNameChanged:
(mountName) => _mountName = mountName ?? '',
onPathChanged: (path) => _path = path,
onTypeChanged:
(mountType) => _mountType = mountType ?? 'S3',
); );
}, },
), ),
@ -152,7 +175,7 @@ class _MyHomePageState extends State<MyHomePage> {
.add( .add(
_mountType, _mountType,
_mountName, _mountName,
apiAuth: _apiAuth, apiPassword: _apiPassword,
apiPort: _apiPort, apiPort: _apiPort,
bucket: _bucket, bucket: _bucket,
encryptionToken: _encryptionToken, encryptionToken: _encryptionToken,

View File

@ -51,7 +51,7 @@ class MountList with ChangeNotifier {
Future<void> add( Future<void> add(
String type, String type,
String name, { String name, {
String? apiAuth, String? apiPassword,
String? apiPort, String? apiPort,
String? bucket, String? bucket,
String? encryptionToken, String? encryptionToken,
@ -62,7 +62,7 @@ class MountList with ChangeNotifier {
Uri.parse( Uri.parse(
Uri.encodeFull( Uri.encodeFull(
'${getBaseUri()}/api/v1/add_mount?name=$name&type=$type&bucket=$bucket' '${getBaseUri()}/api/v1/add_mount?name=$name&type=$type&bucket=$bucket'
'&path=$path&apiAuth=$apiAuth&apiPort=$apiPort&hostNameOrIp=$hostNameOrIp' '&path=$path&apiPassword=$apiPassword&apiPort=$apiPort&hostNameOrIp=$hostNameOrIp'
'&encryptionToken=$encryptionToken', '&encryptionToken=$encryptionToken',
), ),
), ),

View File

@ -2,26 +2,12 @@ import 'package:flutter/material.dart';
class AddMountWidget extends StatefulWidget { class AddMountWidget extends StatefulWidget {
final String mountType; final String mountType;
final void Function(String? newApiAuth) onApiAuthChanged; final void Function(String name, String? value) onDataChanged;
final void Function(String? newApiPort) onApiPortChanged;
final void Function(String? newBucket) onBucketChanged;
final void Function(String? newEncryptionToken) onEncryptionTokenChanged;
final void Function(String? newHostNameOrIp) onHostNameOrIpChanged;
final void Function(String? newName) onNameChanged;
final void Function(String? newPath) onPathChanged;
final void Function(String? newType) onTypeChanged;
const AddMountWidget({ const AddMountWidget({
super.key, super.key,
required this.mountType, required this.mountType,
required this.onApiAuthChanged, required this.onDataChanged,
required this.onApiPortChanged,
required this.onBucketChanged,
required this.onEncryptionTokenChanged,
required this.onHostNameOrIpChanged,
required this.onNameChanged,
required this.onPathChanged,
required this.onTypeChanged,
}); });
@override @override
@ -40,11 +26,15 @@ class _AddMountWidgetState extends State<AddMountWidget> {
super.initState(); super.initState();
} }
List<Widget> _createTextField(String name, onChanged, {String? value}) { List<Widget> _createTextField(
String title,
String dataName, {
String? value,
}) {
return [ return [
const SizedBox(height: _padding), const SizedBox(height: _padding),
Text( Text(
name, title,
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.onSurface, color: Theme.of(context).colorScheme.onSurface,
@ -53,7 +43,7 @@ class _AddMountWidgetState extends State<AddMountWidget> {
), ),
TextField( TextField(
decoration: InputDecoration(), decoration: InputDecoration(),
onChanged: onChanged, onChanged: (value) => widget.onDataChanged(dataName, value),
controller: TextEditingController(text: value), controller: TextEditingController(text: value),
), ),
]; ];
@ -62,6 +52,7 @@ class _AddMountWidgetState extends State<AddMountWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final mountTypeLower = _mountType?.toLowerCase(); final mountTypeLower = _mountType?.toLowerCase();
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
@ -86,7 +77,7 @@ class _AddMountWidgetState extends State<AddMountWidget> {
setState(() { setState(() {
_mountType = value; _mountType = value;
}); });
widget.onTypeChanged(value); widget.onDataChanged('Provider', value);
}, },
items: items:
_items.map<DropdownMenuItem<String>>((item) { _items.map<DropdownMenuItem<String>>((item) {
@ -99,34 +90,30 @@ class _AddMountWidgetState extends State<AddMountWidget> {
], ],
), ),
if (mountTypeLower != 'remote') if (mountTypeLower != 'remote')
..._createTextField('Configuration Name', widget.onNameChanged), ..._createTextField('Configuration Name', 'Name'),
if (mountTypeLower == 'encrypt') if (mountTypeLower == 'encrypt') ..._createTextField('Path', 'Path'),
..._createTextField('Path', widget.onPathChanged),
if (mountTypeLower == 'sia') if (mountTypeLower == 'sia')
..._createTextField('ApiAuth', widget.onApiAuthChanged), ..._createTextField('ApiPassword', 'ApiPassword'),
if (mountTypeLower == 's3' || mountTypeLower == 'sia') if (mountTypeLower == 's3' || mountTypeLower == 'sia')
..._createTextField( ..._createTextField(
'Bucket', 'Bucket',
widget.onBucketChanged, 'Bucket',
value: mountTypeLower == 'sia' ? 'default' : null, value: mountTypeLower == 'sia' ? 'default' : null,
), ),
if (mountTypeLower == 'remote' || mountTypeLower == 'sia') if (mountTypeLower == 'remote' || mountTypeLower == 'sia')
..._createTextField( ..._createTextField(
'HostNameOrIp', 'HostNameOrIp',
widget.onHostNameOrIpChanged, 'HostNameOrIp',
value: 'localhost', value: 'localhost',
), ),
if (mountTypeLower == 'remote' || mountTypeLower == 'sia') if (mountTypeLower == 'remote' || mountTypeLower == 'sia')
..._createTextField( ..._createTextField(
'ApiPort', 'ApiPort',
widget.onApiPortChanged, 'ApiPort',
value: mountTypeLower == 'sia' ? '9980' : null, value: mountTypeLower == 'sia' ? '9980' : null,
), ),
if (mountTypeLower == 'remote') if (mountTypeLower == 'remote')
..._createTextField( ..._createTextField('EncryptionToken', 'EncryptionToken'),
'EncryptionToken',
widget.onEncryptionTokenChanged,
),
], ],
); );
} }