From adae8737a44f8dfde2f28a8c14dc0c5499645546 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 15 Jul 2020 06:15:59 +0300 Subject: [PATCH] Reworked filters --- lib/ui/app/main_screen.dart | 577 ++++++++++--------- lib/ui/app/menu_drawer.dart | 45 +- lib/ui/app/view_scaffold.dart | 4 + lib/ui/settings/device_settings_list.dart | 8 - lib/ui/settings/device_settings_list_vm.dart | 10 - lib/utils/i18n.dart | 8 - 6 files changed, 298 insertions(+), 354 deletions(-) diff --git a/lib/ui/app/main_screen.dart b/lib/ui/app/main_screen.dart index cf6a866b4..0ff17d415 100644 --- a/lib/ui/app/main_screen.dart +++ b/lib/ui/app/main_screen.dart @@ -47,275 +47,274 @@ class MainScreen extends StatelessWidget { return StoreBuilder( //onInit: (Store store) => store.dispatch(RefreshData()), builder: (BuildContext context, Store store) { - final state = store.state; - final uiState = state.uiState; - final prefState = state.prefState; - final subRoute = '/' + uiState.subRoute; - String mainRoute = '/' + uiState.mainRoute; - Widget screen = BlankScreen(); + final state = store.state; + final uiState = state.uiState; + final prefState = state.prefState; + final subRoute = '/' + uiState.subRoute; + String mainRoute = '/' + uiState.mainRoute; + Widget screen = BlankScreen(); - bool isFullScreen = false; - if (prefState.isDesktop) { - if ([ - InvoiceScreen.route, - QuoteScreen.route, - CreditScreen.route, - ].contains(mainRoute) && - subRoute == '/edit') { - isFullScreen = true; + bool isFullScreen = false; + if (prefState.isDesktop) { + if ([ + InvoiceScreen.route, + QuoteScreen.route, + CreditScreen.route, + ].contains(mainRoute) && + subRoute == '/edit') { + isFullScreen = true; + } + } + if (prefState.isNotMobile && + DesignEditScreen.route == uiState.currentRoute) { + isFullScreen = true; + } + + if (isFullScreen) { + switch (mainRoute) { + case InvoiceScreen.route: + screen = InvoiceEditScreen(); + break; + case QuoteScreen.route: + screen = QuoteEditScreen(); + break; + case CreditScreen.route: + screen = CreditEditScreen(); + break; + default: + switch (uiState.currentRoute) { + case DesignEditScreen.route: + screen = DesignEditScreen(); + break; } + } + } else { + bool editingFilterEntity = false; + if (prefState.fullHeightFilter && + uiState.filterEntityId != null && + subRoute == '/edit') { + if (mainRoute == '/${uiState.filterEntityType}') { + mainRoute = '/' + uiState.previousMainRoute; + editingFilterEntity = true; } - if (prefState.isNotMobile && - DesignEditScreen.route == uiState.currentRoute) { - isFullScreen = true; - } + } - if (isFullScreen) { - switch (mainRoute) { - case InvoiceScreen.route: - screen = InvoiceEditScreen(); - break; - case QuoteScreen.route: - screen = QuoteEditScreen(); - break; - case CreditScreen.route: - screen = CreditEditScreen(); - break; - default: - switch (uiState.currentRoute) { - case DesignEditScreen.route: - screen = DesignEditScreen(); - break; - } - } - } else { - bool editingFilterEntity = false; - if (prefState.fullHeightFilter && - uiState.filterEntityId != null && - subRoute == '/edit') { - if (mainRoute == '/${uiState.filterEntityType}') { - mainRoute = '/' + uiState.previousMainRoute; - editingFilterEntity = true; - } - } - - switch (mainRoute) { - case DashboardScreenBuilder.route: - screen = Row( - children: [ - Expanded( - child: DashboardScreenBuilder(), - flex: 5, - ), - if (prefState.showHistory) ...[ - _CustomDivider(), - HistoryDrawerBuilder(), - ], - ], - ); - break; - case ClientScreen.route: - screen = EntityScreens( - entityType: EntityType.client, - listWidget: ClientScreenBuilder(), - viewWidget: ClientViewScreen(), - editWidget: ClientEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case ProductScreen.route: - screen = EntityScreens( - entityType: EntityType.product, - listWidget: ProductScreenBuilder(), - viewWidget: ProductViewScreen(), - editWidget: ProductEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case InvoiceScreen.route: - screen = EntityScreens( - entityType: EntityType.invoice, - listWidget: InvoiceScreenBuilder(), - viewWidget: InvoiceViewScreen(), - editWidget: InvoiceEditScreen(), - emailWidget: InvoiceEmailScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case PaymentScreen.route: - screen = EntityScreens( - entityType: EntityType.payment, - listWidget: PaymentScreenBuilder(), - viewWidget: PaymentViewScreen(), - editWidget: PaymentEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case QuoteScreen.route: - screen = EntityScreens( - entityType: EntityType.quote, - listWidget: QuoteScreenBuilder(), - viewWidget: QuoteViewScreen(), - editWidget: QuoteEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case CreditScreen.route: - screen = EntityScreens( - entityType: EntityType.credit, - listWidget: CreditScreenBuilder(), - viewWidget: CreditViewScreen(), - editWidget: CreditEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case ProjectScreen.route: - screen = EntityScreens( - entityType: EntityType.project, - listWidget: ProjectScreenBuilder(), - viewWidget: ProjectViewScreen(), - editWidget: ProjectEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case TaskScreen.route: - screen = EntityScreens( - entityType: EntityType.task, - listWidget: TaskScreenBuilder(), - viewWidget: TaskViewScreen(), - editWidget: TaskEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case VendorScreen.route: - screen = EntityScreens( - entityType: EntityType.vendor, - listWidget: VendorScreenBuilder(), - viewWidget: VendorViewScreen(), - editWidget: VendorEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - case ExpenseScreen.route: - screen = EntityScreens( - entityType: EntityType.expense, - listWidget: ExpenseScreenBuilder(), - viewWidget: ExpenseViewScreen(), - editWidget: ExpenseEditScreen(), - editingFIlterEntity: editingFilterEntity, - ); - break; - - case SettingsScreen.route: - screen = SettingsScreens(); - break; - case ReportsScreen.route: - screen = Row( - children: [ - Expanded( - child: ReportsScreenBuilder(), - flex: 5, - ), - if (prefState.showHistory) ...[ - _CustomDivider(), - HistoryDrawerBuilder(), - ], - ], - ); - break; - } - } - - return WillPopScope( - onWillPop: () async { - final state = store.state; - final historyList = state.historyList; - - if (historyList.length <= 1) { - return true; - } - - final isEditing = state.uiState.isEditing; - final index = isEditing ? 0 : 1; - HistoryRecord history; - - for (int i = index; i < historyList.length; i++) { - final item = historyList[i]; - if ([ - EntityType.dashboard, - EntityType.reports, - EntityType.settings, - ].contains(item.entityType)) { - history = item; - break; - } else { - if (item.id == null) { - continue; - } - - final entity = state.getEntityMap(item.entityType)[item.id] - as BaseEntity; - if (entity == null || !entity.isActive) { - continue; - } - - history = item; - break; - } - } - - if (!isEditing) { - store.dispatch(PopLastHistory()); - } - - if (history == null) { - return false; - } - - switch (history.entityType) { - case EntityType.dashboard: - store.dispatch( - ViewDashboard(navigator: Navigator.of(context))); - break; - case EntityType.reports: - store.dispatch(ViewReports(navigator: Navigator.of(context))); - break; - case EntityType.settings: - store.dispatch(ViewSettings( - navigator: Navigator.of(context), section: history.id)); - break; - default: - viewEntityById( - context: context, - entityId: history.id, - entityType: history.entityType, - ); - } - - return false; - }, - child: SafeArea( - child: FocusTraversalGroup( - policy: WidgetOrderTraversalPolicy(), - child: ChangeLayoutBanner( - appLayout: prefState.appLayout, - suggestedLayout: AppLayout.desktop, - child: Row(children: [ - if (prefState.showMenu) ...[ - MenuDrawerBuilder(), - _CustomDivider(), - ], - Expanded( - child: AppBorder( - child: screen, - isLeft: prefState.showMenu, - )), - ]), + switch (mainRoute) { + case DashboardScreenBuilder.route: + screen = Row( + children: [ + Expanded( + child: DashboardScreenBuilder(), + flex: 5, ), - ), + if (prefState.showHistory) ...[ + _CustomDivider(), + HistoryDrawerBuilder(), + ], + ], + ); + break; + case ClientScreen.route: + screen = EntityScreens( + entityType: EntityType.client, + listWidget: ClientScreenBuilder(), + viewWidget: ClientViewScreen(), + editWidget: ClientEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case ProductScreen.route: + screen = EntityScreens( + entityType: EntityType.product, + listWidget: ProductScreenBuilder(), + viewWidget: ProductViewScreen(), + editWidget: ProductEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case InvoiceScreen.route: + screen = EntityScreens( + entityType: EntityType.invoice, + listWidget: InvoiceScreenBuilder(), + viewWidget: InvoiceViewScreen(), + editWidget: InvoiceEditScreen(), + emailWidget: InvoiceEmailScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case PaymentScreen.route: + screen = EntityScreens( + entityType: EntityType.payment, + listWidget: PaymentScreenBuilder(), + viewWidget: PaymentViewScreen(), + editWidget: PaymentEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case QuoteScreen.route: + screen = EntityScreens( + entityType: EntityType.quote, + listWidget: QuoteScreenBuilder(), + viewWidget: QuoteViewScreen(), + editWidget: QuoteEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case CreditScreen.route: + screen = EntityScreens( + entityType: EntityType.credit, + listWidget: CreditScreenBuilder(), + viewWidget: CreditViewScreen(), + editWidget: CreditEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case ProjectScreen.route: + screen = EntityScreens( + entityType: EntityType.project, + listWidget: ProjectScreenBuilder(), + viewWidget: ProjectViewScreen(), + editWidget: ProjectEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case TaskScreen.route: + screen = EntityScreens( + entityType: EntityType.task, + listWidget: TaskScreenBuilder(), + viewWidget: TaskViewScreen(), + editWidget: TaskEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case VendorScreen.route: + screen = EntityScreens( + entityType: EntityType.vendor, + listWidget: VendorScreenBuilder(), + viewWidget: VendorViewScreen(), + editWidget: VendorEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + case ExpenseScreen.route: + screen = EntityScreens( + entityType: EntityType.expense, + listWidget: ExpenseScreenBuilder(), + viewWidget: ExpenseViewScreen(), + editWidget: ExpenseEditScreen(), + editingFIlterEntity: editingFilterEntity, + ); + break; + + case SettingsScreen.route: + screen = SettingsScreens(); + break; + case ReportsScreen.route: + screen = Row( + children: [ + Expanded( + child: ReportsScreenBuilder(), + flex: 5, + ), + if (prefState.showHistory) ...[ + _CustomDivider(), + HistoryDrawerBuilder(), + ], + ], + ); + break; + } + } + + return WillPopScope( + onWillPop: () async { + final state = store.state; + final historyList = state.historyList; + + if (historyList.length <= 1) { + return true; + } + + final isEditing = state.uiState.isEditing; + final index = isEditing ? 0 : 1; + HistoryRecord history; + + for (int i = index; i < historyList.length; i++) { + final item = historyList[i]; + if ([ + EntityType.dashboard, + EntityType.reports, + EntityType.settings, + ].contains(item.entityType)) { + history = item; + break; + } else { + if (item.id == null) { + continue; + } + + final entity = + state.getEntityMap(item.entityType)[item.id] as BaseEntity; + if (entity == null || !entity.isActive) { + continue; + } + + history = item; + break; + } + } + + if (!isEditing) { + store.dispatch(PopLastHistory()); + } + + if (history == null) { + return false; + } + + switch (history.entityType) { + case EntityType.dashboard: + store.dispatch(ViewDashboard(navigator: Navigator.of(context))); + break; + case EntityType.reports: + store.dispatch(ViewReports(navigator: Navigator.of(context))); + break; + case EntityType.settings: + store.dispatch(ViewSettings( + navigator: Navigator.of(context), section: history.id)); + break; + default: + viewEntityById( + context: context, + entityId: history.id, + entityType: history.entityType, + ); + } + + return false; + }, + child: SafeArea( + child: FocusTraversalGroup( + policy: WidgetOrderTraversalPolicy(), + child: ChangeLayoutBanner( + appLayout: prefState.appLayout, + suggestedLayout: AppLayout.desktop, + child: Row(children: [ + if (prefState.showMenu) ...[ + MenuDrawerBuilder(), + _CustomDivider(), + ], + Expanded( + child: AppBorder( + child: screen, + isLeft: prefState.showMenu, + )), + ]), ), - ); - }); + ), + ), + ); + }); } } @@ -683,29 +682,35 @@ class _EntityFilter extends StatelessWidget { opacity: show ? 1 : 0, duration: Duration(milliseconds: kDefaultAnimationDuration), curve: Curves.easeInOutCubic, - child: Row( - children: filterEntity == null - ? [] - : [ - SizedBox(width: 4), - Expanded( - child: Align( - alignment: Alignment.centerLeft, - child: FlatButton( - child: Text( - '${localization.lookup('$filterEntityType')} › ${filterEntity.listDisplayName}', - style: TextStyle(fontSize: 17), - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.start, - maxLines: 1, - ), - onPressed: () => viewEntity( - entity: filterEntity, - context: context, - ), - ), + child: filterEntity == null + ? Container( + color: Theme.of(context).cardColor, + ) + : AppBar( + leading: IconButton( + tooltip: localization.preview, + icon: Icon(Icons.chrome_reader_mode), + onPressed: () => store.dispatch( + UserPreferencesChanged(fullHeightFilter: true)), + ), + title: Align( + alignment: Alignment.centerLeft, + child: FlatButton( + padding: const EdgeInsets.only(left: 0), + child: Text( + '${localization.lookup('$filterEntityType')} › ${filterEntity.listDisplayName}', + style: TextStyle(fontSize: 17), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.start, + maxLines: 1, + ), + onPressed: () => viewEntity( + entity: filterEntity, + context: context, ), ), + ), + actions: [ PopupMenuButton( child: Row( children: [ @@ -760,9 +765,9 @@ class _EntityFilter extends StatelessWidget { entityId: uiState.filterEntityId, entityType: uiState.filterEntityType, )), - ), + ) ], - ), + ), ), ), ); diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index dfb06ebcf..1b082cbe5 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -156,51 +156,12 @@ class MenuDrawer extends StatelessWidget { }, ); - /* - final _expandedCompanySelector = viewModel.companies.isEmpty - ? SizedBox() - : DropdownButtonHideUnderline( - child: DropdownButton( - isExpanded: true, - icon: Icon(Icons.arrow_drop_down), - value: viewModel.selectedCompanyIndex, - items: [ - ...viewModel.companies - .map((CompanyEntity company) => DropdownMenuItem( - value: - (viewModel.companies.indexOf(company)).toString(), - child: _companyListItem(company), - )) - .toList(), - if (viewModel.state.userCompany.isAdmin) - DropdownMenuItem( - value: null, - child: Row( - children: [ - SizedBox(width: 2), - Icon(Icons.add_circle, size: 32), - SizedBox(width: 28), - Text(localization.addCompany), - ], - ), - ), - ], - onChanged: (value) { - if (value == null) { - viewModel.onAddCompany(context); - } else { - viewModel.onCompanyChanged( - context, value, viewModel.companies[int.parse(value)]); - } - }, - )); - */ - return AnimatedContainer( width: state.isMenuCollapsed ? 65 : kDrawerWidth, duration: Duration( - milliseconds: - state.prefState.fullHeightFilter ? 0 : kDefaultAnimationDuration), + milliseconds: state.uiState.filterEntityType != null + ? 0 + : kDefaultAnimationDuration), curve: Curves.easeInOutCubic, child: Drawer( child: SafeArea( diff --git a/lib/ui/app/view_scaffold.dart b/lib/ui/app/view_scaffold.dart index 10d33bfd5..ea53e5ff1 100644 --- a/lib/ui/app/view_scaffold.dart +++ b/lib/ui/app/view_scaffold.dart @@ -51,10 +51,14 @@ class ViewScaffold extends StatelessWidget { entity.entityType == state.uiState.filterEntityType) { leading = IconButton( icon: Icon(Icons.clear), + onPressed: () => store + .dispatch(UserPreferencesChanged(fullHeightFilter: false)), + /* onPressed: () => store.dispatch(FilterByEntity( entityType: state.uiState.filterEntityType, entityId: state.uiState.filterEntityId, )), + */ ); } else if (isSettings) { leading = IconButton( diff --git a/lib/ui/settings/device_settings_list.dart b/lib/ui/settings/device_settings_list.dart index 99f55dff0..73074b022 100644 --- a/lib/ui/settings/device_settings_list.dart +++ b/lib/ui/settings/device_settings_list.dart @@ -158,14 +158,6 @@ class _DeviceSettingsState extends State { activeColor: Theme.of(context).accentColor, ), */ - SwitchListTile( - title: Text(localization.fullHeightFilter), - value: prefState.fullHeightFilter, - onChanged: (value) => - viewModel.onFullHeightFilterChanged(context, value), - secondary: Icon(Icons.filter_list), - activeColor: Theme.of(context).accentColor, - ), viewModel.state.company.isModuleEnabled(EntityType.task) ? SwitchListTile( title: diff --git a/lib/ui/settings/device_settings_list_vm.dart b/lib/ui/settings/device_settings_list_vm.dart index 38eb25bcb..83e4c8215 100644 --- a/lib/ui/settings/device_settings_list_vm.dart +++ b/lib/ui/settings/device_settings_list_vm.dart @@ -47,8 +47,6 @@ class DeviceSettingsVM { @required this.authenticationSupported, @required this.onMenuModeChanged, @required this.onHistoryModeChanged, - @required this.onFullHeightFilterChanged, - @required this.onFullWidthEditorChanged, }); static DeviceSettingsVM fromStore(Store store) { @@ -103,12 +101,6 @@ class DeviceSettingsVM { onHistoryModeChanged: (context, value) async { store.dispatch(UserPreferencesChanged(historyMode: value)); }, - onFullHeightFilterChanged: (context, value) async { - store.dispatch(UserPreferencesChanged(fullHeightFilter: value)); - }, - onFullWidthEditorChanged: (context, value) async { - store.dispatch(UserPreferencesChanged(fullWidthEditor: value)); - }, onLayoutChanged: (BuildContext context, AppLayout value) async { if (store.state.prefState.appLayout == value) { return; @@ -158,8 +150,6 @@ class DeviceSettingsVM { final AppState state; final Function(BuildContext) onLogoutTap; final Function(BuildContext) onRefreshTap; - final Function(BuildContext, bool) onFullHeightFilterChanged; - final Function(BuildContext, bool) onFullWidthEditorChanged; final Function(BuildContext, bool) onDarkModeChanged; final Function(BuildContext, AppLayout) onLayoutChanged; final Function(BuildContext, AppSidebarMode) onMenuModeChanged; diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 7b3107676..07128a920 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -73,8 +73,6 @@ mixin LocalizationsProvider on LocaleCodeAware { 'deleted_payment_term': 'Successfully deleted payment term', 'removed_payment_term': 'Successfully removed payment term', 'restored_payment_term': 'Successfully restored payment term', - 'full_width_editor': 'Full Width Editor', - 'full_height_filter': 'Full Height Filter', 'email_sign_in': 'Sign in with email', 'change': 'Change', 'change_to_mobile_layout': 'Change to the mobile layout?', @@ -38695,12 +38693,6 @@ mixin LocalizationsProvider on LocaleCodeAware { String get emailSignIn => _localizedValues[localeCode]['email_sign_in'] ?? ''; - String get fullWidthEditor => - _localizedValues[localeCode]['full_width_editor'] ?? ''; - - String get fullHeightFilter => - _localizedValues[localeCode]['full_height_filter'] ?? ''; - String get configurePaymentTerms => _localizedValues[localeCode]['configure_payment_terms'] ?? '';