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> {
bool _allowAdd = true;
String? _apiAuth;
String? _apiPassword;
String? _apiPort;
String? _bucket;
String? _encryptionToken;
String? _hostNameOrIp;
String _mountType = 'Encrypt';
String _mountName = '';
String _mountName = "";
String? _path;
void _resetData() {
_apiAuth = null;
_apiPassword = null;
_apiPort = null;
_bucket = null;
_encryptionToken = null;
_hostNameOrIp = null;
_mountName = '';
_mountName = "";
_mountType = 'Encrypt';
_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
Widget build(context) {
return Scaffold(
@ -118,20 +154,7 @@ class _MyHomePageState extends State<MyHomePage> {
builder: (_, MountList mountList, __) {
return AddMountWidget(
mountType: _mountType,
onApiAuthChanged: (apiAuth) => _apiAuth = apiAuth,
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',
onDataChanged: _updateData,
);
},
),
@ -152,7 +175,7 @@ class _MyHomePageState extends State<MyHomePage> {
.add(
_mountType,
_mountName,
apiAuth: _apiAuth,
apiPassword: _apiPassword,
apiPort: _apiPort,
bucket: _bucket,
encryptionToken: _encryptionToken,

View File

@ -51,7 +51,7 @@ class MountList with ChangeNotifier {
Future<void> add(
String type,
String name, {
String? apiAuth,
String? apiPassword,
String? apiPort,
String? bucket,
String? encryptionToken,
@ -62,7 +62,7 @@ class MountList with ChangeNotifier {
Uri.parse(
Uri.encodeFull(
'${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',
),
),

View File

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