diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index 6df06c72a..778037254 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -2,31 +2,31 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; -export 'package:invoiceninja_flutter/data/models/entities.dart'; -export 'package:invoiceninja_flutter/data/models/product_model.dart'; export 'package:invoiceninja_flutter/data/models/client_model.dart'; export 'package:invoiceninja_flutter/data/models/company_model.dart'; export 'package:invoiceninja_flutter/data/models/credit_model.dart'; -export 'package:invoiceninja_flutter/data/models/project_model.dart'; -export 'package:invoiceninja_flutter/data/models/payment_model.dart'; -export 'package:invoiceninja_flutter/data/models/invoice_model.dart'; -export 'package:invoiceninja_flutter/data/models/task_model.dart'; -export 'package:invoiceninja_flutter/data/models/expense_model.dart'; -export 'package:invoiceninja_flutter/data/models/vendor_model.dart'; export 'package:invoiceninja_flutter/data/models/document_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/static_data_model.dart'; +export 'package:invoiceninja_flutter/data/models/entities.dart'; +export 'package:invoiceninja_flutter/data/models/expense_model.dart'; +export 'package:invoiceninja_flutter/data/models/invoice_model.dart'; +export 'package:invoiceninja_flutter/data/models/payment_model.dart'; +export 'package:invoiceninja_flutter/data/models/product_model.dart'; +export 'package:invoiceninja_flutter/data/models/project_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/country_model.dart'; export 'package:invoiceninja_flutter/data/models/static/currency_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/size_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/industry_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/timezone_model.dart'; export 'package:invoiceninja_flutter/data/models/static/date_format_model.dart'; export 'package:invoiceninja_flutter/data/models/static/datetime_format_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/language_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/payment_type_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/country_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/frequency_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/industry_model.dart'; export 'package:invoiceninja_flutter/data/models/static/invoice_design_model.dart'; export 'package:invoiceninja_flutter/data/models/static/invoice_status_model.dart'; -export 'package:invoiceninja_flutter/data/models/static/frequency_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/language_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/payment_type_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/size_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/static_data_model.dart'; +export 'package:invoiceninja_flutter/data/models/static/timezone_model.dart'; +export 'package:invoiceninja_flutter/data/models/task_model.dart'; +export 'package:invoiceninja_flutter/data/models/vendor_model.dart'; part 'models.g.dart'; @@ -59,6 +59,7 @@ class EntityAction extends EnumClass { static const EntityAction start = _$start; static const EntityAction resume = _$resume; static const EntityAction stop = _$stop; + static const EntityAction toggleMultiselect = _$toggleMultiselect; static BuiltSet get values => _$values; static EntityAction valueOf(String name) => _$valueOf(name); diff --git a/lib/data/models/models.g.dart b/lib/data/models/models.g.dart index 1cc5e7cc2..792895e99 100644 --- a/lib/data/models/models.g.dart +++ b/lib/data/models/models.g.dart @@ -30,6 +30,8 @@ const EntityAction _$more = const EntityAction._('more'); const EntityAction _$start = const EntityAction._('start'); const EntityAction _$resume = const EntityAction._('resume'); const EntityAction _$stop = const EntityAction._('stop'); +const EntityAction _$toggleMultiselect = + const EntityAction._('toggleMultiselect'); EntityAction _$valueOf(String name) { switch (name) { @@ -81,6 +83,8 @@ EntityAction _$valueOf(String name) { return _$resume; case 'stop': return _$stop; + case 'toggleMultiselect': + return _$toggleMultiselect; default: throw new ArgumentError(name); } @@ -112,6 +116,7 @@ final BuiltSet _$values = _$start, _$resume, _$stop, + _$toggleMultiselect, ]); Serializer _$entityActionSerializer = diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 30fdb7a48..79ba66637 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -14,13 +14,12 @@ class S implements WidgetsLocalizations { static S current; static const GeneratedLocalizationsDelegate delegate = - GeneratedLocalizationsDelegate(); + GeneratedLocalizationsDelegate(); static S of(BuildContext context) => Localizations.of(context, S); @override TextDirection get textDirection => TextDirection.ltr; - } class $en extends S { @@ -36,7 +35,8 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { ]; } - LocaleListResolutionCallback listResolution({Locale fallback, bool withCountry = true}) { + LocaleListResolutionCallback listResolution( + {Locale fallback, bool withCountry = true}) { return (List locales, Iterable supported) { if (locales == null || locales.isEmpty) { return fallback ?? supported.first; @@ -46,7 +46,8 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { }; } - LocaleResolutionCallback resolution({Locale fallback, bool withCountry = true}) { + LocaleResolutionCallback resolution( + {Locale fallback, bool withCountry = true}) { return (Locale locale, Iterable supported) { return _resolve(locale, fallback, supported, withCountry); }; @@ -61,7 +62,7 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { S.current = const $en(); return SynchronousFuture(S.current); default: - // NO-OP. + // NO-OP. } } S.current = const S(); @@ -77,7 +78,8 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { /// /// Internal method to resolve a locale from a list of locales. /// - Locale _resolve(Locale locale, Locale fallback, Iterable supported, bool withCountry) { + Locale _resolve(Locale locale, Locale fallback, Iterable supported, + bool withCountry) { if (locale == null || !_isSupported(locale, withCountry)) { return fallback ?? supported.first; } @@ -110,7 +112,9 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { } // If no country requirement is requested, check if this locale has no country. - if (true != withCountry && (supportedLocale.countryCode == null || supportedLocale.countryCode.isEmpty)) { + if (true != withCountry && + (supportedLocale.countryCode == null || + supportedLocale.countryCode.isEmpty)) { return true; } } @@ -120,7 +124,7 @@ class GeneratedLocalizationsDelegate extends LocalizationsDelegate { } String getLang(Locale l) => l == null - ? null - : l.countryCode != null && l.countryCode.isEmpty - ? l.languageCode - : l.toString(); + ? null + : l.countryCode != null && l.countryCode.isEmpty + ? l.languageCode + : l.toString(); diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index da8f2de7d..b131ea91d 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -324,6 +324,16 @@ void handleClientAction( snackBarCompleter(context, localization.deletedClient), client.id)); } break; + case EntityAction.toggleMultiselect: + if (!store.state.clientListState.isInMultiselect()) { + store.dispatch(StartMultiselect(context: context)); + } + if (!store.state.clientListState.isSelected(client)) { + store.dispatch(AddToMultiselect(context: context, entity: client)); + } else { + store.dispatch(RemoveFromMultiselect(context: context, entity: client)); + } + break; } } diff --git a/lib/ui/app/dismissible_entity.dart b/lib/ui/app/dismissible_entity.dart index 5a3ee9d45..1109c9671 100644 --- a/lib/ui/app/dismissible_entity.dart +++ b/lib/ui/app/dismissible_entity.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/lists/selected_indicator.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -36,6 +36,22 @@ class DismissibleEntity extends StatelessWidget { actionPane: SlidableDrawerActionPane(), key: Key(entity.entityKey + Random().nextInt(100000).toString()), actions: [ + IconSlideAction( + caption: localization.select, + color: Colors.teal, + foregroundColor: Colors.white, + icon: Icons.check_box, + onTap: () => onEntityAction(EntityAction.toggleMultiselect), + ), + IconSlideAction( + caption: localization.more, + color: Colors.black45, + foregroundColor: Colors.white, + icon: Icons.more_vert, + onTap: () => onEntityAction(EntityAction.more), + ), + ], + secondaryActions: [ entity.isActive ? IconSlideAction( caption: localization.archive, @@ -51,15 +67,6 @@ class DismissibleEntity extends StatelessWidget { icon: Icons.restore, onTap: () => onEntityAction(EntityAction.restore), ), - IconSlideAction( - caption: localization.more, - color: Colors.black45, - foregroundColor: Colors.white, - icon: Icons.more_vert, - onTap: () => onEntityAction(EntityAction.more), - ), - ], - secondaryActions: [ entity.isDeleted ?? false ? IconSlideAction( caption: localization.restore, diff --git a/lib/ui/client/client_list.dart b/lib/ui/client/client_list.dart index 1a433a422..f19a59dd9 100644 --- a/lib/ui/client/client_list.dart +++ b/lib/ui/client/client_list.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; -import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; @@ -12,7 +11,6 @@ import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/client/client_list_vm.dart'; import 'package:invoiceninja_flutter/ui/client/client_list_item.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; -import 'package:redux/src/store.dart'; import 'client_list_vm.dart'; @@ -79,7 +77,8 @@ class ClientList extends StatelessWidget { context, client, action); } }, - onLongPress: () => _onLongPress(context, store), + onLongPress: () => viewModel.onEntityAction( + context, client, EntityAction.toggleMultiselect), ); }, ), @@ -88,12 +87,4 @@ class ClientList extends StatelessWidget { ], ); } - - void _onLongPress( - BuildContext context, Store store, BaseEntity entity) { - if (!store.state.clientListState.isInMultiselect()) { - store.dispatch(StartMultiselect(context: context)); - store.dispatch(AddToMultiselect(context: context, entity: entity)); - } - } } diff --git a/lib/ui/client/client_list_item.dart b/lib/ui/client/client_list_item.dart index ff53e9f69..dd864d568 100644 --- a/lib/ui/client/client_list_item.dart +++ b/lib/ui/client/client_list_item.dart @@ -54,15 +54,20 @@ class ClientListItem extends StatelessWidget { //entityKey: clientItemKey, child: ListTile( onTap: isInMultiselect - ? () => _toggleSelection(context, store, client) + ? () => onEntityAction(EntityAction.toggleMultiselect) : onTap, onLongPress: onLongPress, title: Row( children: [ if (isInMultiselect) IgnorePointer( - child: Checkbox( - value: listUIState.isSelected(client), onChanged: null)), + child: Padding( + padding: const EdgeInsets.only(right: 12.0), + child: Checkbox( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + value: listUIState.isSelected(client), + onChanged: null), + )), Expanded( child: Text( client.displayName, @@ -91,13 +96,4 @@ class ClientListItem extends StatelessWidget { ), ); } - - void _toggleSelection( - BuildContext context, Store store, BaseEntity entity) { - if (store.state.clientListState.isSelected(entity)) { - store.dispatch(RemoveFromMultiselect(context: context, entity: entity)); - } else { - store.dispatch(AddToMultiselect(context: context, entity: entity)); - } - } } diff --git a/lib/ui/client/client_screen.dart b/lib/ui/client/client_screen.dart index 893b8b5c7..318d084fc 100644 --- a/lib/ui/client/client_screen.dart +++ b/lib/ui/client/client_screen.dart @@ -103,13 +103,6 @@ class ClientScreen extends StatelessWidget { ); } - void _onSelectPressed( - String value, Store store, BuildContext context) { - if (value == 'select' && !store.state.clientListState.isInMultiselect()) { - store.dispatch(StartMultiselect(context: context)); - } - } - void _finishMultiselect(BuildContext context, ListMultiselectButtonMode mode, Store store) async { if (mode == ListMultiselectButtonMode.DONE) { diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index c96f81688..f3aed2341 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -497,7 +497,7 @@ mixin LocalizationsProvider on LocaleCodeAware { 'marked_quote_as_sent': 'Successfully marked quote as sent', 'expired': 'Expired', 'all': 'All', - 'select': 'Select...' + 'select': 'Select' }, 'sq': { 'thank_you_for_your_purchase': 'Thank you for your purchase!',