Reworked filters

This commit is contained in:
Hillel Coren 2020-07-15 06:15:59 +03:00
parent 4e9f2f9b31
commit adae8737a4
6 changed files with 298 additions and 354 deletions

View File

@ -47,275 +47,274 @@ class MainScreen extends StatelessWidget {
return StoreBuilder( return StoreBuilder(
//onInit: (Store<AppState> store) => store.dispatch(RefreshData()), //onInit: (Store<AppState> store) => store.dispatch(RefreshData()),
builder: (BuildContext context, Store<AppState> store) { builder: (BuildContext context, Store<AppState> store) {
final state = store.state; final state = store.state;
final uiState = state.uiState; final uiState = state.uiState;
final prefState = state.prefState; final prefState = state.prefState;
final subRoute = '/' + uiState.subRoute; final subRoute = '/' + uiState.subRoute;
String mainRoute = '/' + uiState.mainRoute; String mainRoute = '/' + uiState.mainRoute;
Widget screen = BlankScreen(); Widget screen = BlankScreen();
bool isFullScreen = false; bool isFullScreen = false;
if (prefState.isDesktop) { if (prefState.isDesktop) {
if ([ if ([
InvoiceScreen.route, InvoiceScreen.route,
QuoteScreen.route, QuoteScreen.route,
CreditScreen.route, CreditScreen.route,
].contains(mainRoute) && ].contains(mainRoute) &&
subRoute == '/edit') { subRoute == '/edit') {
isFullScreen = true; 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) {
switch (mainRoute) { case DashboardScreenBuilder.route:
case InvoiceScreen.route: screen = Row(
screen = InvoiceEditScreen(); children: <Widget>[
break; Expanded(
case QuoteScreen.route: child: DashboardScreenBuilder(),
screen = QuoteEditScreen(); flex: 5,
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: <Widget>[
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: <Widget>[
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: <Widget>[
if (prefState.showMenu) ...[
MenuDrawerBuilder(),
_CustomDivider(),
],
Expanded(
child: AppBorder(
child: screen,
isLeft: prefState.showMenu,
)),
]),
), ),
), 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: <Widget>[
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: <Widget>[
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, opacity: show ? 1 : 0,
duration: Duration(milliseconds: kDefaultAnimationDuration), duration: Duration(milliseconds: kDefaultAnimationDuration),
curve: Curves.easeInOutCubic, curve: Curves.easeInOutCubic,
child: Row( child: filterEntity == null
children: filterEntity == null ? Container(
? [] color: Theme.of(context).cardColor,
: [ )
SizedBox(width: 4), : AppBar(
Expanded( leading: IconButton(
child: Align( tooltip: localization.preview,
alignment: Alignment.centerLeft, icon: Icon(Icons.chrome_reader_mode),
child: FlatButton( onPressed: () => store.dispatch(
child: Text( UserPreferencesChanged(fullHeightFilter: true)),
'${localization.lookup('$filterEntityType')} ${filterEntity.listDisplayName}', ),
style: TextStyle(fontSize: 17), title: Align(
overflow: TextOverflow.ellipsis, alignment: Alignment.centerLeft,
textAlign: TextAlign.start, child: FlatButton(
maxLines: 1, padding: const EdgeInsets.only(left: 0),
), child: Text(
onPressed: () => viewEntity( '${localization.lookup('$filterEntityType')} ${filterEntity.listDisplayName}',
entity: filterEntity, style: TextStyle(fontSize: 17),
context: context, overflow: TextOverflow.ellipsis,
), textAlign: TextAlign.start,
), maxLines: 1,
),
onPressed: () => viewEntity(
entity: filterEntity,
context: context,
), ),
), ),
),
actions: [
PopupMenuButton<EntityType>( PopupMenuButton<EntityType>(
child: Row( child: Row(
children: [ children: [
@ -760,9 +765,9 @@ class _EntityFilter extends StatelessWidget {
entityId: uiState.filterEntityId, entityId: uiState.filterEntityId,
entityType: uiState.filterEntityType, entityType: uiState.filterEntityType,
)), )),
), )
], ],
), ),
), ),
), ),
); );

View File

@ -156,51 +156,12 @@ class MenuDrawer extends StatelessWidget {
}, },
); );
/*
final _expandedCompanySelector = viewModel.companies.isEmpty
? SizedBox()
: DropdownButtonHideUnderline(
child: DropdownButton<String>(
isExpanded: true,
icon: Icon(Icons.arrow_drop_down),
value: viewModel.selectedCompanyIndex,
items: [
...viewModel.companies
.map((CompanyEntity company) => DropdownMenuItem<String>(
value:
(viewModel.companies.indexOf(company)).toString(),
child: _companyListItem(company),
))
.toList(),
if (viewModel.state.userCompany.isAdmin)
DropdownMenuItem<String>(
value: null,
child: Row(
children: <Widget>[
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( return AnimatedContainer(
width: state.isMenuCollapsed ? 65 : kDrawerWidth, width: state.isMenuCollapsed ? 65 : kDrawerWidth,
duration: Duration( duration: Duration(
milliseconds: milliseconds: state.uiState.filterEntityType != null
state.prefState.fullHeightFilter ? 0 : kDefaultAnimationDuration), ? 0
: kDefaultAnimationDuration),
curve: Curves.easeInOutCubic, curve: Curves.easeInOutCubic,
child: Drawer( child: Drawer(
child: SafeArea( child: SafeArea(

View File

@ -51,10 +51,14 @@ class ViewScaffold extends StatelessWidget {
entity.entityType == state.uiState.filterEntityType) { entity.entityType == state.uiState.filterEntityType) {
leading = IconButton( leading = IconButton(
icon: Icon(Icons.clear), icon: Icon(Icons.clear),
onPressed: () => store
.dispatch(UserPreferencesChanged(fullHeightFilter: false)),
/*
onPressed: () => store.dispatch(FilterByEntity( onPressed: () => store.dispatch(FilterByEntity(
entityType: state.uiState.filterEntityType, entityType: state.uiState.filterEntityType,
entityId: state.uiState.filterEntityId, entityId: state.uiState.filterEntityId,
)), )),
*/
); );
} else if (isSettings) { } else if (isSettings) {
leading = IconButton( leading = IconButton(

View File

@ -158,14 +158,6 @@ class _DeviceSettingsState extends State<DeviceSettings> {
activeColor: Theme.of(context).accentColor, 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) viewModel.state.company.isModuleEnabled(EntityType.task)
? SwitchListTile( ? SwitchListTile(
title: title:

View File

@ -47,8 +47,6 @@ class DeviceSettingsVM {
@required this.authenticationSupported, @required this.authenticationSupported,
@required this.onMenuModeChanged, @required this.onMenuModeChanged,
@required this.onHistoryModeChanged, @required this.onHistoryModeChanged,
@required this.onFullHeightFilterChanged,
@required this.onFullWidthEditorChanged,
}); });
static DeviceSettingsVM fromStore(Store<AppState> store) { static DeviceSettingsVM fromStore(Store<AppState> store) {
@ -103,12 +101,6 @@ class DeviceSettingsVM {
onHistoryModeChanged: (context, value) async { onHistoryModeChanged: (context, value) async {
store.dispatch(UserPreferencesChanged(historyMode: value)); 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 { onLayoutChanged: (BuildContext context, AppLayout value) async {
if (store.state.prefState.appLayout == value) { if (store.state.prefState.appLayout == value) {
return; return;
@ -158,8 +150,6 @@ class DeviceSettingsVM {
final AppState state; final AppState state;
final Function(BuildContext) onLogoutTap; final Function(BuildContext) onLogoutTap;
final Function(BuildContext) onRefreshTap; final Function(BuildContext) onRefreshTap;
final Function(BuildContext, bool) onFullHeightFilterChanged;
final Function(BuildContext, bool) onFullWidthEditorChanged;
final Function(BuildContext, bool) onDarkModeChanged; final Function(BuildContext, bool) onDarkModeChanged;
final Function(BuildContext, AppLayout) onLayoutChanged; final Function(BuildContext, AppLayout) onLayoutChanged;
final Function(BuildContext, AppSidebarMode) onMenuModeChanged; final Function(BuildContext, AppSidebarMode) onMenuModeChanged;

View File

@ -73,8 +73,6 @@ mixin LocalizationsProvider on LocaleCodeAware {
'deleted_payment_term': 'Successfully deleted payment term', 'deleted_payment_term': 'Successfully deleted payment term',
'removed_payment_term': 'Successfully removed payment term', 'removed_payment_term': 'Successfully removed payment term',
'restored_payment_term': 'Successfully restored 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', 'email_sign_in': 'Sign in with email',
'change': 'Change', 'change': 'Change',
'change_to_mobile_layout': 'Change to the mobile layout?', '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 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 => String get configurePaymentTerms =>
_localizedValues[localeCode]['configure_payment_terms'] ?? ''; _localizedValues[localeCode]['configure_payment_terms'] ?? '';