* [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 @ 2022-09-08 9:55 Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak ` (13 more replies) 0 siblings, 14 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel updates to the code for flutter 3.3 and includes some fixes & improvements i included aarons patches from december to make it easier to apply the changes necesseary for flutter 3.3 are proxmox-login-manager: 2/3 pve-flutter-frontend: 2/10 - 6/10 patches after that are only fixes & improvements (so stricly not necessary for flutter 3.3) i noticed some other things too, but for now this should be ok: e.g. we have quite some widgets/code that are not in use currently (from tims desktop variant AFAIR), maybe we should remove them for now (or move it to another repo if we want to use them) since then we could better use 'flutter analyze' (now these widgets/files make much noise to the point where it's hard to see which warnings/infos are even relevant for the app) proxmox-login-manager: Aaron Lauterer (1): login_form: keep Continue button above Android softnav Dominik Csapak (2): migrate from FlatButton to TextButton improve colors of login screen lib/proxmox_login_form.dart | 288 +++++++++++++++++++----------------- lib/proxmox_tfa_form.dart | 11 +- 2 files changed, 156 insertions(+), 143 deletions(-) pve-flutter-frontend: Aaron Lauterer (1): avoid elements hiding behind Android softnav buttons Dominik Csapak (9): increase compileSdkVersion to 32 fix null handling in MainActivity.kt move to OutlinedButton from OutlineButton move to TextButton from FlatButton move to ElevatedButton from RaisedButton improve colors for indicator/toggles fix typo Opague -> Opaque fix guest backup widget start display fix options view when ostype is null android/app/build.gradle | 2 +- .../app/pve_flutter_frontend/MainActivity.kt | 2 +- lib/main.dart | 14 + lib/pages/main_layout_slim.dart | 2 +- .../firstWelcomeScreen/pve_welcome_faq.dart | 10 +- .../firstWelcomeScreen/pve_welcome_last.dart | 26 +- lib/widgets/pve_cd_selector_widget.dart | 7 +- lib/widgets/pve_console_menu_widget.dart | 4 +- lib/widgets/pve_first_welcome_screen.dart | 32 +- lib/widgets/pve_guest_backup_widget.dart | 157 ++++----- lib/widgets/pve_lxc_options_widget.dart | 140 ++++---- lib/widgets/pve_main_navigation_drawer.dart | 4 +- lib/widgets/pve_qemu_options_widget.dart | 259 +++++++------- lib/widgets/pve_qemu_overview.dart | 319 +++++++++--------- .../pve_qemu_power_settings_widget.dart | 178 +++++----- .../pve_subscription_alert_dialog.dart | 2 +- .../pve_task_log_expansiontile_widget.dart | 4 +- 17 files changed, 602 insertions(+), 560 deletions(-) -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak ` (12 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel From: Aaron Lauterer <a.lauterer@proxmox.com> By placing the items in a SafeArea we avoid having the "Continue" button behind the Android soft navigation buttons. Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/proxmox_login_form.dart | 265 ++++++++++++++++++------------------ 1 file changed, 135 insertions(+), 130 deletions(-) diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart index 2609f71..bb00b5c 100644 --- a/lib/proxmox_login_form.dart +++ b/lib/proxmox_login_form.dart @@ -232,152 +232,157 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { child: ConstrainedBox( constraints: BoxConstraints.tightFor( height: MediaQuery.of(context).size.height), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: FutureBuilder<List<PveAccessDomainModel?>?>( - future: _accessDomains, - builder: (context, snapshot) { - return Form( - key: _formKey, - onChanged: () { - setState(() { - _submittButtonEnabled = - _formKey.currentState!.validate(); - }); - }, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Container( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/proxmox_logo_symbol_wordmark.png', - package: 'proxmox_login_manager', - ), - ], + child: SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: FutureBuilder<List<PveAccessDomainModel?>?>( + future: _accessDomains, + builder: (context, snapshot) { + return Form( + key: _formKey, + onChanged: () { + setState(() { + _submittButtonEnabled = + _formKey.currentState!.validate(); + }); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Container( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/proxmox_logo_symbol_wordmark.png', + package: 'proxmox_login_manager', + ), + ], + ), ), ), - ), - ProxmoxLoginForm( - originController: _originController, - originValidator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter origin'; - } - if (value.startsWith('https://') || - value.startsWith('http://')) { - return 'Do not prefix with scheme'; - } - try { - Uri.https(value, ''); - return null; - } on FormatException catch (_) { - return 'Invalid URI'; - } - }, - usernameController: _usernameController, - passwordController: _passwordController, - accessDomains: snapshot.data, - selectedDomain: _selectedDomain, - onDomainChanged: (value) { - setState(() { - _selectedDomain = value; - }); - }, - onOriginSubmitted: _submittButtonEnabled - ? () { - final isValid = - _formKey.currentState!.validate(); - setState(() { - _submittButtonEnabled = isValid; - }); - if (isValid) { + ProxmoxLoginForm( + originController: _originController, + originValidator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter origin'; + } + if (value.startsWith('https://') || + value.startsWith('http://')) { + return 'Do not prefix with scheme'; + } + try { + Uri.https(value, ''); + return null; + } on FormatException catch (_) { + return 'Invalid URI'; + } + }, + usernameController: _usernameController, + passwordController: _passwordController, + accessDomains: snapshot.data, + selectedDomain: _selectedDomain, + onDomainChanged: (value) { + setState(() { + _selectedDomain = value; + }); + }, + onOriginSubmitted: _submittButtonEnabled + ? () { + final isValid = + _formKey.currentState!.validate(); setState(() { - _accessDomains = - _getAccessDomains(); + _submittButtonEnabled = isValid; }); + if (isValid) { + setState(() { + _accessDomains = + _getAccessDomains(); + }); + } } - } - : null, - onPasswordSubmitted: _submittButtonEnabled - ? () { - final isValid = - _formKey.currentState!.validate(); - setState(() { - _submittButtonEnabled = isValid; - }); - if (isValid) { - _onLoginButtonPressed(); + : null, + onPasswordSubmitted: _submittButtonEnabled + ? () { + final isValid = + _formKey.currentState!.validate(); + setState(() { + _submittButtonEnabled = isValid; + }); + if (isValid) { + _onLoginButtonPressed(); + } } - } - : null, - ), - if (snapshot.hasData) - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Container( - width: MediaQuery.of(context).size.width, - child: FlatButton( - onPressed: _submittButtonEnabled - ? () { - final isValid = _formKey - .currentState! - .validate(); - setState(() { - _submittButtonEnabled = - isValid; - }); - if (isValid) { - _onLoginButtonPressed(); + : null, + ), + if (snapshot.hasData) + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + width: + MediaQuery.of(context).size.width, + child: FlatButton( + onPressed: _submittButtonEnabled + ? () { + final isValid = _formKey + .currentState! + .validate(); + setState(() { + _submittButtonEnabled = + isValid; + }); + if (isValid) { + _onLoginButtonPressed(); + } } - } - : null, - color: ProxmoxColors.orange, - disabledColor: Colors.grey, - child: Text('Continue'), + : null, + color: ProxmoxColors.orange, + disabledColor: Colors.grey, + child: Text('Continue'), + ), ), ), ), - ), - if (!snapshot.hasData) - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: Container( - width: MediaQuery.of(context).size.width, - child: FlatButton( - onPressed: _submittButtonEnabled - ? () { - final isValid = _formKey - .currentState! - .validate(); - setState(() { - _submittButtonEnabled = - isValid; - }); - if (isValid) { + if (!snapshot.hasData) + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + width: + MediaQuery.of(context).size.width, + child: FlatButton( + onPressed: _submittButtonEnabled + ? () { + final isValid = _formKey + .currentState! + .validate(); setState(() { - _accessDomains = - _getAccessDomains(); + _submittButtonEnabled = + isValid; }); + if (isValid) { + setState(() { + _accessDomains = + _getAccessDomains(); + }); + } } - } - : null, - color: ProxmoxColors.orange, - child: Text('Continue'), - disabledColor: Colors.grey, + : null, + color: ProxmoxColors.orange, + child: Text('Continue'), + disabledColor: Colors.grey, + ), ), ), ), - ), - ], - ), - ); - }), + ], + ), + ); + }), + ), ), ), ), -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak ` (11 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel since flutter 3 removed FlatButton. For this we have to do the colors a little different, so i moved the color/disabledColor into the textButtonTheme, which does not modify anything else here. Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/proxmox_login_form.dart | 33 +++++++++++++++++++-------------- lib/proxmox_tfa_form.dart | 11 +++++++---- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart index bb00b5c..5e9198f 100644 --- a/lib/proxmox_login_form.dart +++ b/lib/proxmox_login_form.dart @@ -212,9 +212,18 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { return Theme( //data: ThemeData.dark().copyWith(accentColor: Color(0xFFE47225)), data: ThemeData.dark().copyWith( - colorScheme: ColorScheme.dark().copyWith( - secondary: ProxmoxColors.orange, - onSecondary: ProxmoxColors.supportGrey)), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: ProxmoxColors.orange, + disabledBackgroundColor: Colors.grey, + ), + ), + colorScheme: ColorScheme.dark().copyWith( + secondary: ProxmoxColors.orange, + onSecondary: ProxmoxColors.supportGrey + ), + ), child: Scaffold( backgroundColor: ProxmoxColors.supportBlue, extendBodyBehindAppBar: true, @@ -324,7 +333,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { child: Container( width: MediaQuery.of(context).size.width, - child: FlatButton( + child: TextButton( onPressed: _submittButtonEnabled ? () { final isValid = _formKey @@ -339,8 +348,6 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { } } : null, - color: ProxmoxColors.orange, - disabledColor: Colors.grey, child: Text('Continue'), ), ), @@ -353,7 +360,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { child: Container( width: MediaQuery.of(context).size.width, - child: FlatButton( + child: TextButton( onPressed: _submittButtonEnabled ? () { final isValid = _formKey @@ -371,9 +378,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { } } : null, - color: ProxmoxColors.orange, child: Text('Continue'), - disabledColor: Colors.grey, ), ), ), @@ -459,7 +464,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { content: Text( 'Proxmox VE version not supported, please update your instance to use this app.'), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close'), ), @@ -532,7 +537,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { title: Text('Connection error'), content: Text('Could not establish connection.'), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close'), ), @@ -616,7 +621,7 @@ class ProxmoxApiErrorDialog extends StatelessWidget { child: Text(exception.message), ), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close'), ), @@ -648,11 +653,11 @@ class ProxmoxCertificateErrorDialog extends StatelessWidget { ), ), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close'), ), - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pushReplacement( MaterialPageRoute( builder: (context) => ProxmoxGeneralSettingsForm())), diff --git a/lib/proxmox_tfa_form.dart b/lib/proxmox_tfa_form.dart index 3743455..945c75c 100644 --- a/lib/proxmox_tfa_form.dart +++ b/lib/proxmox_tfa_form.dart @@ -81,11 +81,14 @@ class _ProxmoxTfaFormState extends State<ProxmoxTfaForm> { alignment: Alignment.bottomCenter, child: Container( width: MediaQuery.of(context).size.width, - child: FlatButton( + child: TextButton( + style: TextButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: Color(0xFFE47225), + disabledBackgroundColor: Colors.grey, + ), onPressed: () => _submitTfaCode(), - color: Color(0xFFE47225), child: Text('Continue'), - disabledColor: Colors.grey, ), ), ), @@ -129,7 +132,7 @@ class _ProxmoxTfaFormState extends State<ProxmoxTfaForm> { title: Text('Connection error'), content: Text('Could not establish connection.'), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close'), ), -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak ` (10 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel default primary color was a purple hue that did not really fit with our theme. That was used on highlighting form fields and the progress indicator. I replaced it with orange since that fits nicely with the rest of the look and feel also removed the use of accentColor int he ProxmoxProgressOverlay, so that the text appears now white instead of some shade of cyan. Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/proxmox_login_form.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/proxmox_login_form.dart b/lib/proxmox_login_form.dart index 5e9198f..706315f 100644 --- a/lib/proxmox_login_form.dart +++ b/lib/proxmox_login_form.dart @@ -220,6 +220,7 @@ class _ProxmoxLoginPageState extends State<ProxmoxLoginPage> { ), ), colorScheme: ColorScheme.dark().copyWith( + primary: ProxmoxColors.orange, secondary: ProxmoxColors.orange, onSecondary: ProxmoxColors.supportGrey ), @@ -590,7 +591,6 @@ class ProxmoxProgressOverlay extends StatelessWidget { Text( message, style: TextStyle( - color: Theme.of(context).accentColor, fontSize: 20, ), ), -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (2 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak ` (9 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel From: Aaron Lauterer <a.lauterer@proxmox.com> In a few places we had elements hiding behind the Android soft nav buttons at the bottom. Those were: * Qemu HW overview list * Qemu Power Control menu * LXC and Qemu Options list Placing them within a SafeArea avoids that. Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/widgets/pve_lxc_options_widget.dart | 140 ++++---- lib/widgets/pve_qemu_options_widget.dart | 256 +++++++------- lib/widgets/pve_qemu_overview.dart | 319 +++++++++--------- .../pve_qemu_power_settings_widget.dart | 178 +++++----- 4 files changed, 451 insertions(+), 442 deletions(-) diff --git a/lib/widgets/pve_lxc_options_widget.dart b/lib/widgets/pve_lxc_options_widget.dart index 89912dc..70db577 100644 --- a/lib/widgets/pve_lxc_options_widget.dart +++ b/lib/widgets/pve_lxc_options_widget.dart @@ -15,75 +15,77 @@ class PveLxcOptions extends StatelessWidget { builder: (context, state) { final config = state.config; if (config != null) { - return Scaffold( - appBar: AppBar(), - body: SingleChildScrollView( - child: Column( - children: <Widget>[ - ListTile( - title: Text("Name"), - subtitle: Text(config.hostname ?? 'undefined'), - ), - PveConfigSwitchListTile( - title: Text("Start on boot"), - value: config.onboot, - defaultValue: false, - pending: config.getPending('onboot'), - onChanged: (v) => - lxcBloc!.events.add(UpdateLxcConfigBool('onboot', v)), - onDeleted: () => - lxcBloc!.events.add(RevertPendingLxcConfig('onboot')), - ), - ListTile( - title: Text("Start/Shutdown order"), - subtitle: Text(config.startup ?? "Default (any)"), - ), - ListTile( - title: Text("OS Type"), - subtitle: Text("${config.ostype}"), - ), - ListTile( - title: Text("Architecture"), - subtitle: Text("${config.arch}"), - ), - PveConfigSwitchListTile( - title: Text("/dev/console"), - value: config.console, - defaultValue: true, - pending: config.getPending('console'), - onChanged: (v) => lxcBloc!.events - .add(UpdateLxcConfigBool('console', v)), - onDeleted: () => lxcBloc!.events - .add(RevertPendingLxcConfig('console')), - ), - ListTile( - title: Text("TTY Count"), - subtitle: Text("${config.tty ?? 2}"), - ), - ListTile( - title: Text("Console Mode"), - subtitle: Text(config.cmode?.name ?? 'tty'), - ), - PveConfigSwitchListTile( - title: Text("Protection"), - value: config.protection, - defaultValue: false, - pending: config.getPending('protection'), - onChanged: (v) => lxcBloc!.events - .add(UpdateLxcConfigBool('protection', v)), - onDeleted: () => lxcBloc!.events - .add(RevertPendingLxcConfig('protection')), - ), - ListTile( - title: Text("Unprivileged"), - subtitle: - Text(config.unprivileged ?? false ? 'Yes' : 'No'), - ), - ListTile( - title: Text("Features"), - subtitle: Text(config.features?.toString() ?? 'none'), - ), - ], + return SafeArea( + child: Scaffold( + appBar: AppBar(), + body: SingleChildScrollView( + child: Column( + children: <Widget>[ + ListTile( + title: Text("Name"), + subtitle: Text(config.hostname ?? 'undefined'), + ), + PveConfigSwitchListTile( + title: Text("Start on boot"), + value: config.onboot, + defaultValue: false, + pending: config.getPending('onboot'), + onChanged: (v) => lxcBloc!.events + .add(UpdateLxcConfigBool('onboot', v)), + onDeleted: () => lxcBloc!.events + .add(RevertPendingLxcConfig('onboot')), + ), + ListTile( + title: Text("Start/Shutdown order"), + subtitle: Text(config.startup ?? "Default (any)"), + ), + ListTile( + title: Text("OS Type"), + subtitle: Text("${config.ostype}"), + ), + ListTile( + title: Text("Architecture"), + subtitle: Text("${config.arch}"), + ), + PveConfigSwitchListTile( + title: Text("/dev/console"), + value: config.console, + defaultValue: true, + pending: config.getPending('console'), + onChanged: (v) => lxcBloc!.events + .add(UpdateLxcConfigBool('console', v)), + onDeleted: () => lxcBloc!.events + .add(RevertPendingLxcConfig('console')), + ), + ListTile( + title: Text("TTY Count"), + subtitle: Text("${config.tty ?? 2}"), + ), + ListTile( + title: Text("Console Mode"), + subtitle: Text(config.cmode?.name ?? 'tty'), + ), + PveConfigSwitchListTile( + title: Text("Protection"), + value: config.protection, + defaultValue: false, + pending: config.getPending('protection'), + onChanged: (v) => lxcBloc!.events + .add(UpdateLxcConfigBool('protection', v)), + onDeleted: () => lxcBloc!.events + .add(RevertPendingLxcConfig('protection')), + ), + ListTile( + title: Text("Unprivileged"), + subtitle: + Text(config.unprivileged ?? false ? 'Yes' : 'No'), + ), + ListTile( + title: Text("Features"), + subtitle: Text(config.features?.toString() ?? 'none'), + ), + ], + ), ), ), ); diff --git a/lib/widgets/pve_qemu_options_widget.dart b/lib/widgets/pve_qemu_options_widget.dart index fb28051..788923d 100644 --- a/lib/widgets/pve_qemu_options_widget.dart +++ b/lib/widgets/pve_qemu_options_widget.dart @@ -18,134 +18,136 @@ class PveQemuOptions extends StatelessWidget { builder: (context, state) { if (state.config != null) { final config = state.config!; - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(), + return SafeArea( + child: Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.close), + onPressed: () => Navigator.of(context).pop(), + ), ), - ), - body: SingleChildScrollView( - child: Form( - key: _formKey, - onChanged: () {}, - child: Column( - children: <Widget>[ - ListTile( - title: Text("Name"), - subtitle: Text(config.name ?? 'VM$guestID'), - ), - PveConfigSwitchListTile( - title: Text("Start on boot"), - value: config.onboot, - defaultValue: false, - pending: config.getPending('onboot'), - onChanged: (v) => - bloc.events.add(UpdateQemuConfigBool('onboot', v)), - onDeleted: () => - bloc.events.add(RevertPendingQemuConfig('onboot')), - ), - ListTile( - title: Text("Start/Shutdown order"), - subtitle: Text(config.startup ?? "Default (any)"), - ), - ListTile( - title: Text("OS Type"), - subtitle: Text( - "${config.ostype!.type} ${config.ostype!.description}"), - ), - //TODO add better ui component e.g. collapseable - ListTile( - title: Text("Boot Device"), - subtitle: Text(config.boot ?? 'Disk, Network, USB'), - ), - PveConfigSwitchListTile( - title: Text("Use tablet for pointer"), - value: config.tablet, - defaultValue: true, - pending: config.getPending('tablet'), - onChanged: (v) => - bloc.events.add(UpdateQemuConfigBool('tablet', v)), - onDeleted: () => - bloc.events.add(RevertPendingQemuConfig('tablet')), - ), - ListTile( - title: Text("Hotplug"), - subtitle: Text(config.hotplug ?? 'disk,network,usb'), - ), - PveConfigSwitchListTile( - title: Text("ACPI support"), - value: config.acpi, - defaultValue: true, - pending: config.getPending('acpi'), - onChanged: (v) => - bloc.events.add(UpdateQemuConfigBool('acpi', v)), - onDeleted: () => - bloc.events.add(RevertPendingQemuConfig('acpi')), - ), - PveConfigSwitchListTile( - title: Text("KVM hardware virtualization"), - value: config.kvm, - defaultValue: true, - pending: config.getPending('kvm'), - onChanged: (v) => - bloc.events.add(UpdateQemuConfigBool('kvm', v)), - onDeleted: () => - bloc.events.add(RevertPendingQemuConfig('kvm')), - ), - PveConfigSwitchListTile( - title: Text("Freeze CPU on startup"), - value: config.freeze, - defaultValue: false, - pending: config.getPending('freeze'), - onChanged: (v) => - bloc.events.add(UpdateQemuConfigBool('freeze', v)), - onDeleted: () => - bloc.events.add(RevertPendingQemuConfig('freeze')), - ), - PveConfigSwitchListTile( - title: Text("Use local time for RTC"), - value: config.localtime, - defaultValue: false, - pending: config.getPending('localtime'), - onChanged: (v) => bloc.events - .add(UpdateQemuConfigBool('localtime', v)), - onDeleted: () => bloc.events - .add(RevertPendingQemuConfig('localtime')), - ), - ListTile( - title: Text("RTC start date"), - subtitle: Text(config.startdate ?? 'now'), - ), - ListTile( - title: Text("SMBIOS settings (type1)"), - subtitle: Text(config.smbios1 ?? ''), - ), - //Todo enhance UI - ListTile( - title: Text("QEMU Guest Agent"), - subtitle: Text(config.agent ?? 'Default (disabled)'), - ), - PveConfigSwitchListTile( - title: Text("Protection"), - value: config.protection, - defaultValue: false, - pending: config.getPending('protection'), - onChanged: (v) => bloc.events - .add(UpdateQemuConfigBool('protection', v)), - onDeleted: () => bloc.events - .add(RevertPendingQemuConfig('protection')), - ), - ListTile( - title: Text("Spice Enhancements"), - subtitle: - Text(config.spiceEnhancements ?? 'No enhancements'), - ), - ListTile( - title: Text("VM State Storage"), - subtitle: Text(config.vmstatestorage ?? 'Automatic'), - ), - ], + body: SingleChildScrollView( + child: Form( + key: _formKey, + onChanged: () {}, + child: Column( + children: <Widget>[ + ListTile( + title: Text("Name"), + subtitle: Text(config.name ?? 'VM$guestID'), + ), + PveConfigSwitchListTile( + title: Text("Start on boot"), + value: config.onboot, + defaultValue: false, + pending: config.getPending('onboot'), + onChanged: (v) => bloc.events + .add(UpdateQemuConfigBool('onboot', v)), + onDeleted: () => bloc.events + .add(RevertPendingQemuConfig('onboot')), + ), + ListTile( + title: Text("Start/Shutdown order"), + subtitle: Text(config.startup ?? "Default (any)"), + ), + ListTile( + title: Text("OS Type"), + subtitle: Text( + "${config.ostype!.type} ${config.ostype!.description}"), + ), + //TODO add better ui component e.g. collapseable + ListTile( + title: Text("Boot Device"), + subtitle: Text(config.boot ?? 'Disk, Network, USB'), + ), + PveConfigSwitchListTile( + title: Text("Use tablet for pointer"), + value: config.tablet, + defaultValue: true, + pending: config.getPending('tablet'), + onChanged: (v) => bloc.events + .add(UpdateQemuConfigBool('tablet', v)), + onDeleted: () => bloc.events + .add(RevertPendingQemuConfig('tablet')), + ), + ListTile( + title: Text("Hotplug"), + subtitle: Text(config.hotplug ?? 'disk,network,usb'), + ), + PveConfigSwitchListTile( + title: Text("ACPI support"), + value: config.acpi, + defaultValue: true, + pending: config.getPending('acpi'), + onChanged: (v) => + bloc.events.add(UpdateQemuConfigBool('acpi', v)), + onDeleted: () => + bloc.events.add(RevertPendingQemuConfig('acpi')), + ), + PveConfigSwitchListTile( + title: Text("KVM hardware virtualization"), + value: config.kvm, + defaultValue: true, + pending: config.getPending('kvm'), + onChanged: (v) => + bloc.events.add(UpdateQemuConfigBool('kvm', v)), + onDeleted: () => + bloc.events.add(RevertPendingQemuConfig('kvm')), + ), + PveConfigSwitchListTile( + title: Text("Freeze CPU on startup"), + value: config.freeze, + defaultValue: false, + pending: config.getPending('freeze'), + onChanged: (v) => bloc.events + .add(UpdateQemuConfigBool('freeze', v)), + onDeleted: () => bloc.events + .add(RevertPendingQemuConfig('freeze')), + ), + PveConfigSwitchListTile( + title: Text("Use local time for RTC"), + value: config.localtime, + defaultValue: false, + pending: config.getPending('localtime'), + onChanged: (v) => bloc.events + .add(UpdateQemuConfigBool('localtime', v)), + onDeleted: () => bloc.events + .add(RevertPendingQemuConfig('localtime')), + ), + ListTile( + title: Text("RTC start date"), + subtitle: Text(config.startdate ?? 'now'), + ), + ListTile( + title: Text("SMBIOS settings (type1)"), + subtitle: Text(config.smbios1 ?? ''), + ), + //Todo enhance UI + ListTile( + title: Text("QEMU Guest Agent"), + subtitle: Text(config.agent ?? 'Default (disabled)'), + ), + PveConfigSwitchListTile( + title: Text("Protection"), + value: config.protection, + defaultValue: false, + pending: config.getPending('protection'), + onChanged: (v) => bloc.events + .add(UpdateQemuConfigBool('protection', v)), + onDeleted: () => bloc.events + .add(RevertPendingQemuConfig('protection')), + ), + ListTile( + title: Text("Spice Enhancements"), + subtitle: Text( + config.spiceEnhancements ?? 'No enhancements'), + ), + ListTile( + title: Text("VM State Storage"), + subtitle: Text(config.vmstatestorage ?? 'Automatic'), + ), + ], + ), ), ), ), diff --git a/lib/widgets/pve_qemu_overview.dart b/lib/widgets/pve_qemu_overview.dart index df8867e..45f3f66 100644 --- a/lib/widgets/pve_qemu_overview.dart +++ b/lib/widgets/pve_qemu_overview.dart @@ -70,181 +70,184 @@ class PveQemuOverview extends StatelessWidget { final config = state.config; final rrdData = state.rrdData; - return Scaffold( - appBar: AppBar( - //backgroundColor: Colors.transparent, - elevation: 0, - title: Text(config?.name ?? 'VM $guestID'), - ), - backgroundColor: Theme.of(context).colorScheme.background, - body: SingleChildScrollView( - child: Column( - children: <Widget>[ - PveGuestOverviewHeader( - background: !(status?.template ?? false) - ? PveGuestHeaderRRDPageView( - rrdData: rrdData, - ) - : Center( - child: Text( - "TEMPLATE", - style: TextStyle( - color: Colors.white, - ), - ), - ), - width: width, - guestID: guestID, - guestStatus: status?.getQemuStatus(), - guestName: config?.name ?? 'VM $guestID', - guestNodeID: state.nodeID, - guestType: 'qemu', - ha: status?.ha, - template: status?.template ?? false, - ), - ProxmoxStreamBuilder<PveTaskLogBloc, PveTaskLogState>( - bloc: taskBloc, - builder: (context, taskState) { - if (taskState.tasks != null && - taskState.tasks.isNotEmpty) { - return PveTaskExpansionTile( - headerColor: - Theme.of(context).colorScheme.onBackground, - task: taskState.tasks.first, - showMorePage: Provider<PveTaskLogBloc>( - create: (context) => PveTaskLogBloc( - apiClient: taskBloc.apiClient, - init: PveTaskLogState.init(state.nodeID), + return SafeArea( + child: Scaffold( + appBar: AppBar( + //backgroundColor: Colors.transparent, + elevation: 0, + title: Text(config?.name ?? 'VM $guestID'), + ), + backgroundColor: Theme.of(context).colorScheme.background, + body: SingleChildScrollView( + child: Column( + children: <Widget>[ + PveGuestOverviewHeader( + background: !(status?.template ?? false) + ? PveGuestHeaderRRDPageView( + rrdData: rrdData, ) - ..events.add( - FilterTasksByGuestID( - guestID: guestID, + : Center( + child: Text( + "TEMPLATE", + style: TextStyle( + color: Colors.white, ), + ), + ), + width: width, + guestID: guestID, + guestStatus: status?.getQemuStatus(), + guestName: config?.name ?? 'VM $guestID', + guestNodeID: state.nodeID, + guestType: 'qemu', + ha: status?.ha, + template: status?.template ?? false, + ), + ProxmoxStreamBuilder<PveTaskLogBloc, PveTaskLogState>( + bloc: taskBloc, + builder: (context, taskState) { + if (taskState.tasks != null && + taskState.tasks.isNotEmpty) { + return PveTaskExpansionTile( + headerColor: + Theme.of(context).colorScheme.onBackground, + task: taskState.tasks.first, + showMorePage: Provider<PveTaskLogBloc>( + create: (context) => PveTaskLogBloc( + apiClient: taskBloc.apiClient, + init: PveTaskLogState.init(state.nodeID), ) - ..events.add(LoadTasks()), - dispose: (context, bloc) => bloc.dispose(), - child: PveTaskLog(), - ), - ); - } - return Container(); - }, - ), - Container( - height: 130, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: <Widget>[ - if (!(status?.template ?? false)) - createActionCard( - 'Power Settings', - Icons.power_settings_new, - () => - showPowerMenuBottomSheet(context, bloc)), - if (!(status?.template ?? false)) + ..events.add( + FilterTasksByGuestID( + guestID: guestID, + ), + ) + ..events.add(LoadTasks()), + dispose: (context, bloc) => bloc.dispose(), + child: PveTaskLog(), + ), + ); + } + return Container(); + }, + ), + Container( + height: 130, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: <Widget>[ + if (!(status?.template ?? false)) + createActionCard( + 'Power Settings', + Icons.power_settings_new, + () => showPowerMenuBottomSheet( + context, bloc)), + if (!(status?.template ?? false)) + createActionCard( + 'Console', + Icons.queue_play_next, + () => showConsoleMenuBottomSheet( + context, + bloc.apiClient, + guestID, + state.nodeID, + 'qemu', + allowSpice: status?.spice ?? false, + )), createActionCard( - 'Console', - Icons.queue_play_next, - () => showConsoleMenuBottomSheet( - context, - bloc.apiClient, - guestID, - state.nodeID, - 'qemu', - allowSpice: status?.spice ?? false, - )), - createActionCard( - 'Options', - Icons.settings, - () => Navigator.of(context) - .push(_createOptionsRoute(bloc))), - if (!rBloc.latestState.isStandalone) + 'Options', + Icons.settings, + () => Navigator.of(context) + .push(_createOptionsRoute(bloc))), + if (!rBloc.latestState.isStandalone) + createActionCard( + 'Migrate', + FontAwesomeIcons.paperPlane, + () => Navigator.of(context).push( + _createMigrationRoute(guestID, + state.nodeID, bloc.apiClient))), createActionCard( - 'Migrate', - FontAwesomeIcons.paperPlane, + 'Backup', + FontAwesomeIcons.save, () => Navigator.of(context).push( - _createMigrationRoute(guestID, - state.nodeID, bloc.apiClient))), - createActionCard( - 'Backup', - FontAwesomeIcons.save, - () => Navigator.of(context).push( - _createBackupRoute(guestID, state.nodeID, - bloc.apiClient))), - ], + _createBackupRoute(guestID, state.nodeID, + bloc.apiClient))), + ], + ), ), ), - ), - if (config != null) - PveResourceDataCardWidget( - expandable: false, - title: Text( - 'Hardware', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20, - ), - ), - children: [ - ListTile( - leading: Icon(FontAwesomeIcons.memory), - title: Text('${config.memory}'), - subtitle: Text('Memory'), - dense: true, - ), - ListTile( - leading: Icon(Icons.memory), - title: Text( - '${config.cores} Cores ${config.sockets} Socket'), - subtitle: Text('Processor'), - dense: true, - ), - ListTile( - leading: Icon(FontAwesomeIcons.microchip), - title: Text( - config.bios?.name ?? 'Default (SeaBIOS)'), - subtitle: Text('BIOS'), - dense: true, - ), - ListTile( - leading: Icon(FontAwesomeIcons.cogs), - dense: true, - title: Text(config.machine ?? 'Default (i440fx)'), - subtitle: Text('Machine Type'), - ), - ListTile( - leading: Icon(FontAwesomeIcons.database), - title: Text( - config.scsihw?.name ?? 'Default (i440fx)'), - subtitle: Text('SCSI Controller'), - dense: true, + if (config != null) + PveResourceDataCardWidget( + expandable: false, + title: Text( + 'Hardware', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + ), ), - for (var ide in config.ide!) + children: [ ListTile( - leading: Icon(FontAwesomeIcons.compactDisc), - title: Text(ide), - subtitle: Text('CD/DVD Drive'), + leading: Icon(FontAwesomeIcons.memory), + title: Text('${config.memory}'), + subtitle: Text('Memory'), dense: true, ), - for (var scsi in config.scsi!) ListTile( - leading: Icon(FontAwesomeIcons.hdd), - title: Text(scsi), - subtitle: Text('Hard Disk'), + leading: Icon(Icons.memory), + title: Text( + '${config.cores} Cores ${config.sockets} Socket'), + subtitle: Text('Processor'), dense: true, ), - for (var net in config.net!) ListTile( - leading: Icon(FontAwesomeIcons.ethernet), + leading: Icon(FontAwesomeIcons.microchip), + title: Text( + config.bios?.name ?? 'Default (SeaBIOS)'), + subtitle: Text('BIOS'), dense: true, - subtitle: Text('Network Device'), - title: Text(net), - ) - ]), - ], - ))); + ), + ListTile( + leading: Icon(FontAwesomeIcons.cogs), + dense: true, + title: + Text(config.machine ?? 'Default (i440fx)'), + subtitle: Text('Machine Type'), + ), + ListTile( + leading: Icon(FontAwesomeIcons.database), + title: Text( + config.scsihw?.name ?? 'Default (i440fx)'), + subtitle: Text('SCSI Controller'), + dense: true, + ), + for (var ide in config.ide!) + ListTile( + leading: Icon(FontAwesomeIcons.compactDisc), + title: Text(ide), + subtitle: Text('CD/DVD Drive'), + dense: true, + ), + for (var scsi in config.scsi!) + ListTile( + leading: Icon(FontAwesomeIcons.hdd), + title: Text(scsi), + subtitle: Text('Hard Disk'), + dense: true, + ), + for (var net in config.net!) + ListTile( + leading: Icon(FontAwesomeIcons.ethernet), + dense: true, + subtitle: Text('Network Device'), + title: Text(net), + ) + ]), + ], + ))), + ); }), ); } diff --git a/lib/widgets/pve_qemu_power_settings_widget.dart b/lib/widgets/pve_qemu_power_settings_widget.dart index 2d4c496..46c07cc 100644 --- a/lib/widgets/pve_qemu_power_settings_widget.dart +++ b/lib/widgets/pve_qemu_power_settings_widget.dart @@ -18,103 +18,105 @@ class PveQemuPowerSettings extends StatelessWidget { builder: (context, state) { final qemuStatus = state.currentStatus?.getQemuStatus(); final disableShutdown = qemuStatus != PveResourceStatusType.running; - return SingleChildScrollView( - child: Container( - constraints: BoxConstraints( - minHeight: MediaQuery.of(context).size.height / 3), - child: Column( - mainAxisSize: MainAxisSize.min, - children: <Widget>[ - if (qemuStatus == PveResourceStatusType.stopped && - !(state.currentStatus!.template ?? false)) - ListTile( - leading: Icon(Icons.play_arrow), - title: Text( - "Start", - style: TextStyle(fontWeight: FontWeight.bold), + return SafeArea( + child: SingleChildScrollView( + child: Container( + constraints: BoxConstraints( + minHeight: MediaQuery.of(context).size.height / 3), + child: Column( + mainAxisSize: MainAxisSize.min, + children: <Widget>[ + if (qemuStatus == PveResourceStatusType.stopped && + !(state.currentStatus!.template ?? false)) + ListTile( + leading: Icon(Icons.play_arrow), + title: Text( + "Start", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Turn on QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.start, bloc), ), - subtitle: Text("Turn on QEMU virtual machine"), - onTap: () => - action(context, PveClusterResourceAction.start, bloc), - ), - if ([ - PveResourceStatusType.paused, - PveResourceStatusType.suspended - ].contains(qemuStatus) && - !(state.currentStatus!.template ?? false)) - ListTile( - leading: Icon(Icons.play_arrow), - title: Text( - "Resume", - style: TextStyle(fontWeight: FontWeight.bold), + if ([ + PveResourceStatusType.paused, + PveResourceStatusType.suspended + ].contains(qemuStatus) && + !(state.currentStatus!.template ?? false)) + ListTile( + leading: Icon(Icons.play_arrow), + title: Text( + "Resume", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Resume QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.resume, bloc), ), - subtitle: Text("Resume QEMU virtual machine"), - onTap: () => action( - context, PveClusterResourceAction.resume, bloc), - ), - if (!disableShutdown) ...[ - ListTile( - leading: Icon(Icons.power_settings_new), - title: Text( - "Shutdown", - style: TextStyle(fontWeight: FontWeight.bold), + if (!disableShutdown) ...[ + ListTile( + leading: Icon(Icons.power_settings_new), + title: Text( + "Shutdown", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Shutdown QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.shutdown, bloc), ), - subtitle: Text("Shutdown QEMU virtual machine"), - onTap: () => action( - context, PveClusterResourceAction.shutdown, bloc), - ), - ListTile( - leading: Icon(Icons.autorenew), - title: Text( - "Reboot", - style: TextStyle(fontWeight: FontWeight.bold), + ListTile( + leading: Icon(Icons.autorenew), + title: Text( + "Reboot", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Reboot QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.reboot, bloc), ), - subtitle: Text("Reboot QEMU virtual machine"), - onTap: () => action( - context, PveClusterResourceAction.reboot, bloc), - ), - ListTile( - leading: Icon(Icons.pause), - title: Text( - "Pause", - style: TextStyle(fontWeight: FontWeight.bold), + ListTile( + leading: Icon(Icons.pause), + title: Text( + "Pause", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Pause QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.suspend, bloc), ), - subtitle: Text("Pause QEMU virtual machine"), - onTap: () => action( - context, PveClusterResourceAction.suspend, bloc), - ), - ListTile( - leading: Icon(FontAwesomeIcons.download), - title: Text( - "Hibernate", - style: TextStyle(fontWeight: FontWeight.bold), + ListTile( + leading: Icon(FontAwesomeIcons.download), + title: Text( + "Hibernate", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Hibernate QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.hibernate, bloc), ), - subtitle: Text("Hibernate QEMU virtual machine"), - onTap: () => action( - context, PveClusterResourceAction.hibernate, bloc), - ), - ListTile( - leading: Icon(Icons.stop), - title: Text( - "Stop", - style: TextStyle(fontWeight: FontWeight.bold), + ListTile( + leading: Icon(Icons.stop), + title: Text( + "Stop", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Stop QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.stop, bloc), ), - subtitle: Text("Stop QEMU virtual machine"), - onTap: () => - action(context, PveClusterResourceAction.stop, bloc), - ), - ListTile( - leading: Icon(FontAwesomeIcons.bolt), - title: Text( - "Reset", - style: TextStyle(fontWeight: FontWeight.bold), + ListTile( + leading: Icon(FontAwesomeIcons.bolt), + title: Text( + "Reset", + style: TextStyle(fontWeight: FontWeight.bold), + ), + subtitle: Text("Reset QEMU virtual machine"), + onTap: () => action( + context, PveClusterResourceAction.reset, bloc), ), - subtitle: Text("Reset QEMU virtual machine"), - onTap: () => - action(context, PveClusterResourceAction.reset, bloc), - ), + ], ], - ], + ), ), ), ); -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (3 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak ` (8 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel current version of webview_flutter_android (2.10.0) needs it Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d287d5b..27e8d55 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -32,7 +32,7 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 31 + compileSdkVersion 32 sourceSets { main.java.srcDirs += 'src/main/kotlin' -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (4 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak ` (7 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel in newer flutter versions, call.arguments() can return null, so handle that Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- .../kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt b/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt index 8754f8c..e8aad23 100644 --- a/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt +++ b/android/app/src/main/kotlin/com/proxmox/app/pve_flutter_frontend/MainActivity.kt @@ -32,7 +32,7 @@ class MainActivity: FlutterActivity() { // Note: this method is invoked on the main thread. Log.d("METHODCHANNEL", call.method) if (call.method == "shareFile") { - val serializedShortcuts: Map<String, String> = call.arguments() + val serializedShortcuts: Map<String, String> = call.arguments()!! val path: String = serializedShortcuts.get("path")!!; val type: String = serializedShortcuts.get("type")!!; try { -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (5 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak ` (6 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel flutter 3.0 removed OutlineButton in favor of OutlinedButton. also change the default text color to white, and drop an unnecessary padding in one case Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/main.dart | 10 ++++++++++ .../firstWelcomeScreen/pve_welcome_faq.dart | 8 +++++--- .../firstWelcomeScreen/pve_welcome_last.dart | 18 ++++++++++-------- lib/widgets/pve_cd_selector_widget.dart | 7 ++++--- lib/widgets/pve_guest_backup_widget.dart | 9 ++++----- lib/widgets/pve_main_navigation_drawer.dart | 4 ++-- .../pve_task_log_expansiontile_widget.dart | 4 ++-- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index fca91c6..d467626 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -117,6 +117,11 @@ class MyApp extends StatelessWidget { textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(primary: ProxmoxColors.grey), ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: Colors.black, + ), + ), fontFamily: "Open Sans", primaryTextTheme: TextTheme( headline6: @@ -149,6 +154,11 @@ class MyApp extends StatelessWidget { textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(primary: ProxmoxColors.greyTint80), ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + foregroundColor: Colors.white, + ), + ), fontFamily: "Open Sans", primaryTextTheme: TextTheme( headline6: diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart index 2e0e44e..470d118 100644 --- a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart +++ b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart @@ -42,14 +42,16 @@ class PveWelcomePageFAQ extends StatelessWidget { text: 'Currently only the following 3rd party Spice client works:'), Center( - child: OutlineButton( + child: OutlinedButton( onPressed: () => { launch( 'https://play.google.com/store/apps/details?id=com.undatech.opaque') }, child: Text('Opague'), - borderSide: BorderSide(color: ProxmoxColors.supportGrey), - textColor: Colors.white, + style: OutlinedButton.styleFrom( + side: BorderSide(color: ProxmoxColors.supportGrey), + foregroundColor: Colors.white, + ), ), ), ], diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart index 5f135e0..3a6391e 100644 --- a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart +++ b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart @@ -57,23 +57,25 @@ class PveWelcomePageLast extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - OutlineButton( + OutlinedButton( onPressed: () => {launch('https://forum.proxmox.com')}, child: Text('Forum'), - borderSide: - BorderSide(color: ProxmoxColors.supportGrey), - textColor: Colors.white, + style: OutlinedButton.styleFrom( + side: BorderSide(color: ProxmoxColors.supportGrey), + foregroundColor: Colors.white, + ), ), - OutlineButton( + OutlinedButton( onPressed: () => { launch( 'https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-user') }, child: Text('User Mailing List'), - borderSide: - BorderSide(color: ProxmoxColors.supportGrey), - textColor: Colors.white, + style: OutlinedButton.styleFrom( + side: BorderSide(color: ProxmoxColors.supportGrey), + foregroundColor: Colors.white, + ), ), ], ), diff --git a/lib/widgets/pve_cd_selector_widget.dart b/lib/widgets/pve_cd_selector_widget.dart index c7600fe..cac5288 100644 --- a/lib/widgets/pve_cd_selector_widget.dart +++ b/lib/widgets/pve_cd_selector_widget.dart @@ -29,9 +29,10 @@ class PveCdSelector extends StatelessWidget { onChanged: (value) => cdBloc.events.add(ChangeValue(value)), ), if (state.value == CdType.iso) - OutlineButton( - borderSide: - state.hasError ? BorderSide(color: Colors.red) : null, + OutlinedButton( + style: OutlinedButton.styleFrom( + side: state.hasError ? BorderSide(color: Colors.red) : null, + ), child: Text((state.file == null || state.file!.isEmpty) ? "Choose File" : state.file!), diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart index 72a81c4..b766efb 100644 --- a/lib/widgets/pve_guest_backup_widget.dart +++ b/lib/widgets/pve_guest_backup_widget.dart @@ -258,13 +258,12 @@ class PveGuestBackupContent extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: ListView(children: [ - OutlineButton.icon( - padding: EdgeInsets.symmetric(horizontal: 8), + OutlinedButton.icon( onPressed: null, icon: Icon(Icons.restore), label: Text("Restore"), ), - OutlineButton.icon( + OutlinedButton.icon( onPressed: () async { final guard = await (_showConfirmDialog( context, @@ -279,7 +278,7 @@ class PveGuestBackupContent extends StatelessWidget { icon: Icon(Icons.delete), label: Text("Remove"), ), - OutlineButton.icon( + OutlinedButton.icon( onPressed: () => _showConfigurationDialog(context, fBloc, volid), icon: Icon(Icons.featured_play_list), @@ -462,7 +461,7 @@ class _PveBackupFormState extends State<PveBackupForm> { return null; }, ), - OutlineButton.icon( + OutlinedButton.icon( onPressed: enableSubmitButton ? () { //TODO remove when async validation is implemented diff --git a/lib/widgets/pve_main_navigation_drawer.dart b/lib/widgets/pve_main_navigation_drawer.dart index 57ad0ce..757d05e 100644 --- a/lib/widgets/pve_main_navigation_drawer.dart +++ b/lib/widgets/pve_main_navigation_drawer.dart @@ -130,14 +130,14 @@ class PveMainNavigationDrawer extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ - OutlineButton( + OutlinedButton( child: Text("new VM"), onPressed: () { Navigator.pushNamed(context, '/qemu/create'); }, ), // TODO General new button or distinct ones?? - OutlineButton( + OutlinedButton( child: Text("new CT"), onPressed: null, ) diff --git a/lib/widgets/pve_task_log_expansiontile_widget.dart b/lib/widgets/pve_task_log_expansiontile_widget.dart index 03ed1bf..dabe309 100644 --- a/lib/widgets/pve_task_log_expansiontile_widget.dart +++ b/lib/widgets/pve_task_log_expansiontile_widget.dart @@ -108,13 +108,13 @@ class _PveTaskExpansionTileState extends State<PveTaskExpansionTile> { ButtonBar( children: <Widget>[ if (widget.showMorePage != null) - OutlineButton.icon( + OutlinedButton.icon( onPressed: () => Navigator.of(context).push( _createTaskLogRoute(taskLogBloc, widget.showMorePage)), icon: Icon(Icons.format_list_bulleted), label: Text('More Tasks'), ), - OutlineButton.icon( + OutlinedButton.icon( onPressed: () => showTaskLogBottomSheet(context, taskLogBloc.apiClient, widget.task.node, widget.task.upid), icon: Icon(Icons.article), -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (6 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak ` (5 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel flutter 3.0 removed FlatButton Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/pages/main_layout_slim.dart | 2 +- lib/widgets/pve_console_menu_widget.dart | 4 +-- lib/widgets/pve_first_welcome_screen.dart | 32 ++++++++++++------- lib/widgets/pve_guest_backup_widget.dart | 6 ++-- .../pve_subscription_alert_dialog.dart | 2 +- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/pages/main_layout_slim.dart b/lib/pages/main_layout_slim.dart index 9839428..ba95fe8 100644 --- a/lib/pages/main_layout_slim.dart +++ b/lib/pages/main_layout_slim.dart @@ -853,7 +853,7 @@ class _MobileResourceFilterSheet extends StatelessWidget { 'Filter Results', ), trailing: rBloc.isFiltered - ? FlatButton( + ? TextButton( onPressed: () => rBloc.events.add(ResetFilter()), child: Text( 'Reset', diff --git a/lib/widgets/pve_console_menu_widget.dart b/lib/widgets/pve_console_menu_widget.dart index 17be9a3..ac5ad26 100644 --- a/lib/widgets/pve_console_menu_widget.dart +++ b/lib/widgets/pve_console_menu_widget.dart @@ -83,7 +83,7 @@ class PveConsoleMenu extends StatelessWidget { title: Text('Got Exception'), content: Text(e.message!), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close')) @@ -154,7 +154,7 @@ class PveConsoleMenu extends StatelessWidget { title: Text(title), content: Text(content), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('Close')) ], diff --git a/lib/widgets/pve_first_welcome_screen.dart b/lib/widgets/pve_first_welcome_screen.dart index 3a09943..46d2ee0 100644 --- a/lib/widgets/pve_first_welcome_screen.dart +++ b/lib/widgets/pve_first_welcome_screen.dart @@ -67,9 +67,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin { Widget nextDoneButton() { if (_isLast) { - return FlatButton( - textColor: _buttonTextColor, - disabledTextColor: _buttonDisabledTextColor, + return TextButton( + style: TextButton.styleFrom( + foregroundColor: _buttonTextColor, + disabledForegroundColor: _buttonDisabledTextColor, + ), child: Text( "Done", ), @@ -78,10 +80,12 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin { }, ); } else { - return FlatButton( + return TextButton( child: Text("Next"), - textColor: _buttonTextColor, - disabledTextColor: _buttonDisabledTextColor, + style: TextButton.styleFrom( + foregroundColor: _buttonTextColor, + disabledForegroundColor: _buttonDisabledTextColor, + ), onPressed: () { _controller! .nextPage(duration: _pageChangeDuration, curve: _pageChangeCurve); @@ -92,9 +96,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin { Widget skipPrevButton() { if (_isFirst) { - return FlatButton( - textColor: _buttonTextColor, - disabledTextColor: _buttonDisabledTextColor, + return TextButton( + style: TextButton.styleFrom( + foregroundColor: _buttonTextColor, + disabledForegroundColor: _buttonDisabledTextColor, + ), onPressed: () { skipDone(); }, @@ -103,9 +109,11 @@ class _PveWelcomeState extends State<PveWelcome> with TickerProviderStateMixin { ), ); } else { - return FlatButton( - textColor: _buttonTextColor, - disabledTextColor: _buttonDisabledTextColor, + return TextButton( + style: TextButton.styleFrom( + foregroundColor: _buttonTextColor, + disabledForegroundColor: _buttonDisabledTextColor, + ), child: Text( "Prev", ), diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart index b766efb..e6aebde 100644 --- a/lib/widgets/pve_guest_backup_widget.dart +++ b/lib/widgets/pve_guest_backup_widget.dart @@ -302,14 +302,14 @@ class PveGuestBackupContent extends StatelessWidget { title: Text(title), content: Text(body), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(false), child: Text( 'Cancel', style: TextStyle(fontWeight: FontWeight.bold), ), ), - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(true), child: Text( 'Confirm', @@ -371,7 +371,7 @@ class _PveConfigurationDialogState extends State<PveConfigurationDialog> { child: CircularProgressIndicator(), ), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.of(context).pop(true), child: Text( 'Close', diff --git a/lib/widgets/pve_subscription_alert_dialog.dart b/lib/widgets/pve_subscription_alert_dialog.dart index df880f7..e5d85a4 100644 --- a/lib/widgets/pve_subscription_alert_dialog.dart +++ b/lib/widgets/pve_subscription_alert_dialog.dart @@ -11,7 +11,7 @@ class PveSubscriptionAlertDialog extends StatelessWidget { ' software and getting stable updates and security enhancements,' ' as well as quick enterprise support.\n\nPlease consider to buy a subscription.'), actions: [ - FlatButton( + TextButton( onPressed: () async { final url = 'https://www.proxmox.com/proxmox-ve/pricing'; if (await canLaunch(url)) { -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (7 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak ` (4 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel flutter 3.0 removed RaisedButton Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/widgets/firstWelcomeScreen/pve_welcome_last.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart index 3a6391e..f0fa0c2 100644 --- a/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart +++ b/lib/widgets/firstWelcomeScreen/pve_welcome_last.dart @@ -36,10 +36,12 @@ class PveWelcomePageLast extends StatelessWidget { ), Padding( padding: const EdgeInsets.all(8.0), - child: RaisedButton( + child: ElevatedButton( onPressed: () => {onDone!()}, - color: ProxmoxColors.orange, - textColor: Colors.white, + style: ElevatedButton.styleFrom( + backgroundColor: ProxmoxColors.orange, + foregroundColor: Colors.white, + ), child: Text("Start"), ), ), -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (8 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak ` (3 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel so that it fits better with our color schemes instead of using the flutter defaults (which are especially bad in dark mode for our scheme) Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/main.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index d467626..c9b862e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -114,6 +114,8 @@ class MyApp extends StatelessWidget { background: ProxmoxColors.supportGreyTint75, onBackground: Colors.black, ), + toggleableActiveColor: ProxmoxColors.supportBlue, + indicatorColor: ProxmoxColors.orange, textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(primary: ProxmoxColors.grey), ), @@ -145,6 +147,8 @@ class MyApp extends StatelessWidget { background: ProxmoxColors.grey, onBackground: ProxmoxColors.supportGreyTint75, ), + toggleableActiveColor: ProxmoxColors.blue500, + indicatorColor: ProxmoxColors.orange, // flutter has a weird logic where it pulls colors from different // scheme properties depending on light/dark mode, avoid that... appBarTheme: AppBarTheme( -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (9 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak ` (2 subsequent siblings) 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart index 470d118..f2be574 100644 --- a/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart +++ b/lib/widgets/firstWelcomeScreen/pve_welcome_faq.dart @@ -47,7 +47,7 @@ class PveWelcomePageFAQ extends StatelessWidget { launch( 'https://play.google.com/store/apps/details?id=com.undatech.opaque') }, - child: Text('Opague'), + child: Text('Opaque'), style: OutlinedButton.styleFrom( side: BorderSide(color: ProxmoxColors.supportGrey), foregroundColor: Colors.white, -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (10 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak 2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel when we changed from ScaffoldState to ScaffoldMessengerState, we missed that we have to wrap the scaffold in a ScaffoldMessenger, otherwise there is no current state and we never could show a snack we also have to do the null safety of the 'nodesVZDumpCreateBackup' differently, since we get a Future<String?>, which cannot be converted to FutureOr<String>, we got an exception (that we never saw because of the Missing ScaffoldMessenger) same is true for the 'remove' button despite that the backup always actually ran, but the user did not get any visual feedback Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/widgets/pve_guest_backup_widget.dart | 144 ++++++++++++----------- 1 file changed, 73 insertions(+), 71 deletions(-) diff --git a/lib/widgets/pve_guest_backup_widget.dart b/lib/widgets/pve_guest_backup_widget.dart index e6aebde..05cd725 100644 --- a/lib/widgets/pve_guest_backup_widget.dart +++ b/lib/widgets/pve_guest_backup_widget.dart @@ -265,11 +265,11 @@ class PveGuestBackupContent extends StatelessWidget { ), OutlinedButton.icon( onPressed: () async { - final guard = await (_showConfirmDialog( + final guard = (await _showConfirmDialog( context, 'Attention', 'Do you really want to delete this backup?') - as FutureOr<bool>); + )!; if (guard) { fBloc.events.add(DeleteFile(volid)); Navigator.of(context).pop(); @@ -417,77 +417,79 @@ class _PveBackupFormState extends State<PveBackupForm> { @override Widget build(BuildContext context) { - return Scaffold( + return ScaffoldMessenger( key: _scaffoldKey, - appBar: AppBar( - iconTheme: IconThemeData(color: Colors.black), - backgroundColor: Colors.transparent, - elevation: 0, - title: Text( - "Schedule backup", - style: TextStyle(color: Colors.black), + child: Scaffold( + appBar: AppBar( + iconTheme: IconThemeData(color: Colors.black), + backgroundColor: Colors.transparent, + elevation: 0, + title: Text( + "Schedule backup", + style: TextStyle(color: Colors.black), + ), ), - ), - body: SingleChildScrollView( - padding: EdgeInsets.all(8), - child: Form( - key: _formKey, - onChanged: () { - final isValid = _formKey.currentState!.validate(); - setState(() { - enableSubmitButton = isValid; - }); - }, - child: Column( - children: [ - PveStorageSelectorDropdown( - labelText: 'Storage', - sBloc: widget.sBloc, - allowBlank: false, - ), - _createModeDropdown(), - _createCompressionDropdown(), - TextFormField( - decoration: InputDecoration( - labelText: 'Email to', - helperText: ' ', + body: SingleChildScrollView( + padding: EdgeInsets.all(8), + child: Form( + key: _formKey, + onChanged: () { + final isValid = _formKey.currentState!.validate(); + setState(() { + enableSubmitButton = isValid; + }); + }, + child: Column( + children: [ + PveStorageSelectorDropdown( + labelText: 'Storage', + sBloc: widget.sBloc, + allowBlank: false, ), - controller: emailToController, - autovalidateMode: AutovalidateMode.onUserInteraction, - validator: (value) { - if (value!.isNotEmpty && !Validators.isValidEmail(value)) { - return 'Please enter valid email address'; - } - return null; - }, - ), - OutlinedButton.icon( - onPressed: enableSubmitButton - ? () { - //TODO remove when async validation is implemented - if (!_formKey.currentState!.validate()) { - setState(() { - enableSubmitButton = false; - }); - return; - } + _createModeDropdown(), + _createCompressionDropdown(), + TextFormField( + decoration: InputDecoration( + labelText: 'Email to', + helperText: ' ', + ), + controller: emailToController, + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: (value) { + if (value!.isNotEmpty && !Validators.isValidEmail(value)) { + return 'Please enter valid email address'; + } + return null; + }, + ), + OutlinedButton.icon( + onPressed: enableSubmitButton + ? () { + //TODO remove when async validation is implemented + if (!_formKey.currentState!.validate()) { + setState(() { + enableSubmitButton = false; + }); + return; + } - startBackup( - widget.sBloc.apiClient, - widget.sBloc.latestState.nodeID, - widget.sBloc.latestState.selected!.id, - widget.guestID, - compression, - mode!, - mailTo: emailToController!.text, - ); - } - : null, - icon: Icon(Icons.save), - label: Text('Start backup now')) - ], - ), - )), + startBackup( + widget.sBloc.apiClient, + widget.sBloc.latestState.nodeID, + widget.sBloc.latestState.selected!.id, + widget.guestID, + compression, + mode!, + mailTo: emailToController!.text, + ); + } + : null, + icon: Icon(Icons.save), + label: Text('Start backup now')) + ], + ), + )), + ) ); } @@ -501,11 +503,11 @@ class _PveBackupFormState extends State<PveBackupForm> { String? mailTo, }) async { try { - final jobId = await (apiClient.nodesVZDumpCreateBackup( + final jobId = (await apiClient.nodesVZDumpCreateBackup( node, storage, guestId, compressionType: compression, mode: mode, - mailTo: mailTo) as FutureOr<String>); + mailTo: mailTo))!; await showTaskLogBottomSheet(context, apiClient, node, jobId, icon: Icon(Icons.save), jobTitle: Text('Backup $guestId')); -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (11 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak @ 2022-09-08 9:55 ` Dominik Csapak 2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht 13 siblings, 0 replies; 15+ messages in thread From: Dominik Csapak @ 2022-09-08 9:55 UTC (permalink / raw) To: pve-devel can happen when no ostype is set in the config (defaults to 'other') Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- lib/widgets/pve_qemu_options_widget.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/widgets/pve_qemu_options_widget.dart b/lib/widgets/pve_qemu_options_widget.dart index 788923d..cd32cff 100644 --- a/lib/widgets/pve_qemu_options_widget.dart +++ b/lib/widgets/pve_qemu_options_widget.dart @@ -53,7 +53,10 @@ class PveQemuOptions extends StatelessWidget { ListTile( title: Text("OS Type"), subtitle: Text( - "${config.ostype!.type} ${config.ostype!.description}"), + config.ostype != null ? + "${config.ostype!.type} ${config.ostype!.description}" : + "Other" + ), ), //TODO add better ui component e.g. collapseable ListTile( -- 2.30.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak ` (12 preceding siblings ...) 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak @ 2022-09-08 15:31 ` Thomas Lamprecht 13 siblings, 0 replies; 15+ messages in thread From: Thomas Lamprecht @ 2022-09-08 15:31 UTC (permalink / raw) To: Proxmox VE development discussion, Dominik Csapak Am 08/09/2022 um 11:55 schrieb Dominik Csapak: > updates to the code for flutter 3.3 and includes some fixes & improvements > > i included aarons patches from december to make it easier to apply > > the changes necesseary for flutter 3.3 are > proxmox-login-manager: 2/3 > pve-flutter-frontend: 2/10 - 6/10 > > patches after that are only fixes & improvements > (so stricly not necessary for flutter 3.3) > > i noticed some other things too, but for now this should be ok: > e.g. we have quite some widgets/code that are not in use currently > (from tims desktop variant AFAIR), maybe we should remove them > for now (or move it to another repo if we want to use them) > since then we could better use 'flutter analyze' > (now these widgets/files make much noise to the point where it's hard > to see which warnings/infos are even relevant for the app) > I'd like to have a layout for desktop/tablets with a always visible, resoure-tree like panel at the side, but no high priority for such things and some widgets may be deleted nonetheless. > proxmox-login-manager: > > Aaron Lauterer (1): > login_form: keep Continue button above Android softnav > > Dominik Csapak (2): > migrate from FlatButton to TextButton > improve colors of login screen > > lib/proxmox_login_form.dart | 288 +++++++++++++++++++----------------- > lib/proxmox_tfa_form.dart | 11 +- > 2 files changed, 156 insertions(+), 143 deletions(-) > > pve-flutter-frontend: > > Aaron Lauterer (1): > avoid elements hiding behind Android softnav buttons > > Dominik Csapak (9): > increase compileSdkVersion to 32 > fix null handling in MainActivity.kt > move to OutlinedButton from OutlineButton > move to TextButton from FlatButton > move to ElevatedButton from RaisedButton > improve colors for indicator/toggles > fix typo Opague -> Opaque > fix guest backup widget start display > fix options view when ostype is null > > android/app/build.gradle | 2 +- > .../app/pve_flutter_frontend/MainActivity.kt | 2 +- > lib/main.dart | 14 + > lib/pages/main_layout_slim.dart | 2 +- > .../firstWelcomeScreen/pve_welcome_faq.dart | 10 +- > .../firstWelcomeScreen/pve_welcome_last.dart | 26 +- > lib/widgets/pve_cd_selector_widget.dart | 7 +- > lib/widgets/pve_console_menu_widget.dart | 4 +- > lib/widgets/pve_first_welcome_screen.dart | 32 +- > lib/widgets/pve_guest_backup_widget.dart | 157 ++++----- > lib/widgets/pve_lxc_options_widget.dart | 140 ++++---- > lib/widgets/pve_main_navigation_drawer.dart | 4 +- > lib/widgets/pve_qemu_options_widget.dart | 259 +++++++------- > lib/widgets/pve_qemu_overview.dart | 319 +++++++++--------- > .../pve_qemu_power_settings_widget.dart | 178 +++++----- > .../pve_subscription_alert_dialog.dart | 2 +- > .../pve_task_log_expansiontile_widget.dart | 4 +- > 17 files changed, 602 insertions(+), 560 deletions(-) > applied, thanks! ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2022-09-08 15:31 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-09-08 9:55 [pve-devel] [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 1/3] login_form: keep Continue button above Android softnav Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 2/3] migrate from FlatButton to TextButton Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH proxmox-login-manager 3/3] improve colors of login screen Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 01/10] avoid elements hiding behind Android softnav buttons Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 02/10] increase compileSdkVersion to 32 Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 03/10] fix null handling in MainActivity.kt Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 04/10] move to OutlinedButton from OutlineButton Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 05/10] move to TextButton from FlatButton Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 06/10] move to ElevatedButton from RaisedButton Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 07/10] improve colors for indicator/toggles Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 08/10] fix typo Opague -> Opaque Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 09/10] fix guest backup widget start display Dominik Csapak 2022-09-08 9:55 ` [pve-devel] [PATCH pve-flutter-frontend 10/10] fix options view when ostype is null Dominik Csapak 2022-09-08 15:31 ` [pve-devel] applied-series: [PATCH proxmox-login-manager/pve-flutter-frontend] fixes & update to flutter 3.3 Thomas Lamprecht
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox