This patch splits the `_MobileResourceFilterSheet` into multiple widgets and since the `main_layout_slim.dart` file is large, the widget has been moved to it's own file under the widgets folder.
Signed-off-by: Shan Shaji <s.sh...@proxmox.com> --- changes since v1: * Removed all formatting changes * Only includes the refactoring of `_MobileResourceFilterSheet` widget * Removed "paused guest not showing in resources tab" bug related changes. lib/pages/main_layout_slim.dart | 175 +--------------- .../pve_mobile_resource_filter_sheet.dart | 188 ++++++++++++++++++ 2 files changed, 190 insertions(+), 173 deletions(-) create mode 100644 lib/widgets/pve_mobile_resource_filter_sheet.dart diff --git a/lib/pages/main_layout_slim.dart b/lib/pages/main_layout_slim.dart index 3bcd83b..8d6e5ed 100644 --- a/lib/pages/main_layout_slim.dart +++ b/lib/pages/main_layout_slim.dart @@ -11,6 +11,7 @@ import 'package:pve_flutter_frontend/bloc/pve_cluster_status_bloc.dart'; import 'package:pve_flutter_frontend/bloc/pve_file_selector_bloc.dart'; import 'package:pve_flutter_frontend/bloc/pve_resource_bloc.dart'; import 'package:pve_flutter_frontend/bloc/pve_storage_selector_bloc.dart'; +import 'package:pve_flutter_frontend/widgets/pve_mobile_resource_filter_sheet.dart'; import 'package:pve_flutter_frontend/states/pve_access_management_state.dart'; import 'package:pve_flutter_frontend/states/pve_cluster_status_state.dart'; import 'package:pve_flutter_frontend/states/pve_file_selector_state.dart'; @@ -606,7 +607,7 @@ class MobileResourceOverview extends StatelessWidget { }, child: ColoredSafeArea( child: Scaffold( - endDrawer: _MobileResourceFilterSheet(), + endDrawer: PveMobileResourceFilterSheet(), appBar: AppBar( automaticallyImplyLeading: false, elevation: 0, @@ -844,178 +845,6 @@ class _AppbarSearchTextFieldState extends State<AppbarSearchTextField> { } } -class _MobileResourceFilterSheet extends StatelessWidget { - @override - Widget build(BuildContext context) { - final rBloc = Provider.of<PveResourceBloc>(context); - - return ProxmoxStreamBuilder<PveResourceBloc, PveResourceState>( - bloc: rBloc, - builder: (context, state) => Drawer( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: <Widget>[ - Padding( - padding: const EdgeInsets.fromLTRB(8.0, 20.0, 8.0, 0), - child: ListTile( - title: const Text( - 'Filter Results', - ), - trailing: rBloc.isFiltered - ? TextButton( - onPressed: () => rBloc.events.add(ResetFilter()), - child: Text( - 'Reset', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), - ), - ) - : null, - ), - ), - const Divider( - indent: 0, - endIndent: 0, - ), - Padding( - padding: const EdgeInsets.fromLTRB(8.0, 0, 8.0, 0), - child: Column( - children: [ - const ListTile( - title: Text( - 'Type', - style: TextStyle(fontWeight: FontWeight.bold), - ), - ), - CheckboxListTile( - dense: true, - title: Text( - 'Nodes', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.typeFilter.contains('node'), - onChanged: (v) => rBloc.events.add(FilterResources( - typeFilter: addOrRemove(v!, 'node', state.typeFilter), - )), - ), - CheckboxListTile( - dense: true, - title: Text( - 'Qemu', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.typeFilter.contains('qemu'), - onChanged: (v) => rBloc.events.add(FilterResources( - typeFilter: addOrRemove(v!, 'qemu', state.typeFilter), - )), - ), - CheckboxListTile( - dense: true, - title: Text( - 'LXC', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.typeFilter.contains('lxc'), - onChanged: (v) => rBloc.events.add(FilterResources( - typeFilter: addOrRemove(v!, 'lxc', state.typeFilter), - )), - ), - CheckboxListTile( - dense: true, - title: Text( - 'Storage', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.typeFilter.contains('storage'), - onChanged: (v) => rBloc.events.add(FilterResources( - typeFilter: - addOrRemove(v!, 'storage', state.typeFilter), - )), - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(8.0, 0, 8.0, 0), - child: Column( - children: [ - const ListTile( - title: Text( - 'Status', - style: TextStyle(fontWeight: FontWeight.bold), - ), - ), - CheckboxListTile( - dense: true, - title: Text( - 'Online', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.statusFilter - .contains(PveResourceStatusType.running), - onChanged: (v) => rBloc.events.add(FilterResources( - statusFilter: addOrRemove(v!, - PveResourceStatusType.running, state.statusFilter), - )), - ), - CheckboxListTile( - dense: true, - title: Text( - 'Offline', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurface - .withValues(alpha: 0.75)), - ), - value: state.statusFilter - .contains(PveResourceStatusType.stopped), - onChanged: (v) => rBloc.events.add(FilterResources( - statusFilter: addOrRemove(v!, - PveResourceStatusType.stopped, state.statusFilter), - )), - ), - ], - ), - ) - ], - ), - ), - ), - ); - } - - BuiltSet<S> addOrRemove<S>(bool value, S element, BuiltSet<S> filter) { - if (value) { - return filter.rebuild((b) => b..add(element)); - } else { - return filter.rebuild((b) => b..remove(element)); - } - } -} - class AppBarFilterIconButton extends StatelessWidget { const AppBarFilterIconButton({super.key}); diff --git a/lib/widgets/pve_mobile_resource_filter_sheet.dart b/lib/widgets/pve_mobile_resource_filter_sheet.dart new file mode 100644 index 0000000..cee3a49 --- /dev/null +++ b/lib/widgets/pve_mobile_resource_filter_sheet.dart @@ -0,0 +1,188 @@ +import 'package:built_collection/built_collection.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart'; +import 'package:pve_flutter_frontend/bloc/pve_resource_bloc.dart'; +import 'package:pve_flutter_frontend/states/pve_resource_state.dart'; +import 'package:pve_flutter_frontend/widgets/proxmox_stream_builder_widget.dart'; + +class PveMobileResourceFilterSheet extends StatelessWidget { + const PveMobileResourceFilterSheet({super.key}); + + @override + Widget build(BuildContext context) { + final rBloc = Provider.of<PveResourceBloc>(context); + return ProxmoxStreamBuilder<PveResourceBloc, PveResourceState>( + bloc: rBloc, + builder: (context, state) => Drawer( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(8.0, 20.0, 8.0, 0), + child: ListTile( + title: const Text( + 'Filter Results', + ), + trailing: rBloc.isFiltered + ? TextButton( + onPressed: () => rBloc.events.add(ResetFilter()), + child: Text( + 'Reset', + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + ), + ), + ) + : null, + ), + ), + const Divider(indent: 0, endIndent: 0), + _PveFilterSheetSection( + sectionTitle: 'Type', + items: [ + _ProxmoxResourceFilterListTile( + title: 'Nodes', + value: state.typeFilter.contains('node'), + onChanged: (v) => rBloc.events.add( + FilterResources( + typeFilter: _addOrRemove(v!, 'node', state.typeFilter), + ), + ), + ), + _ProxmoxResourceFilterListTile( + title: 'Qemu', + value: state.typeFilter.contains('qemu'), + onChanged: (v) => rBloc.events.add( + FilterResources( + typeFilter: _addOrRemove(v!, 'qemu', state.typeFilter), + ), + ), + ), + _ProxmoxResourceFilterListTile( + title: 'LXC', + value: state.typeFilter.contains('lxc'), + onChanged: (v) => rBloc.events.add( + FilterResources( + typeFilter: _addOrRemove(v!, 'lxc', state.typeFilter), + ), + ), + ), + _ProxmoxResourceFilterListTile( + title: 'Storage', + value: state.typeFilter.contains('storage'), + onChanged: (v) => rBloc.events.add( + FilterResources( + typeFilter: + _addOrRemove(v!, 'storage', state.typeFilter), + ), + ), + ), + ], + ), + _PveFilterSheetSection( + sectionTitle: 'Status', + items: [ + _ProxmoxResourceFilterListTile( + title: 'Online', + value: state.statusFilter + .contains(PveResourceStatusType.running), + onChanged: (v) => rBloc.events.add( + FilterResources( + statusFilter: _addOrRemove( + v!, + PveResourceStatusType.running, + state.statusFilter, + ), + ), + ), + ), + _ProxmoxResourceFilterListTile( + title: 'Offline', + value: state.statusFilter + .contains(PveResourceStatusType.stopped), + onChanged: (v) => rBloc.events.add( + FilterResources( + statusFilter: _addOrRemove( + v!, + PveResourceStatusType.stopped, + state.statusFilter, + ), + ), + ), + ), + ], + ) + ], + ), + ), + ), + ); + } + + BuiltSet<S> _addOrRemove<S>(bool value, S element, BuiltSet<S> filter) { + if (value) { + return filter.rebuild((b) => b..add(element)); + } else { + return filter.rebuild((b) => b..remove(element)); + } + } +} + +class _PveFilterSheetSection extends StatelessWidget { + const _PveFilterSheetSection({ + required this.items, + required this.sectionTitle, + }); + + final List<Widget> items; + final String sectionTitle; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column( + children: [ + ListTile( + title: Text( + sectionTitle, + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ...items, + ], + ), + ); + } +} + +class _ProxmoxResourceFilterListTile extends StatelessWidget { + const _ProxmoxResourceFilterListTile({ + required this.title, + this.onChanged, + this.value, + }); + + final String title; + final ValueChanged<bool?>? onChanged; + final bool? value; + + @override + Widget build(BuildContext context) { + return CheckboxListTile( + dense: true, + title: Text( + title, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface.withValues( + alpha: 0.75, + ), + ), + ), + value: value, + onChanged: onChanged, + ); + } +} -- 2.39.5 (Apple Git-154) _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel