invoice/lib/redux/group/group_actions.dart

343 lines
8.2 KiB
Dart

// Dart imports:
import 'dart:async';
// Flutter imports:
import 'package:flutter/widgets.dart';
// Package imports:
import 'package:built_collection/built_collection.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:http/http.dart';
// Project imports:
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/group_model.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class ViewGroupList implements PersistUI {
ViewGroupList({this.force = false});
final bool force;
}
class ViewGroup implements PersistUI, PersistPrefs {
ViewGroup({
required this.groupId,
this.force = false,
});
final String? groupId;
final bool force;
}
class EditGroup implements PersistUI, PersistPrefs {
EditGroup({required this.group, this.completer, this.force = false});
final GroupEntity group;
final Completer? completer;
final bool force;
}
class UpdateGroup implements PersistUI {
UpdateGroup(this.group);
final GroupEntity group;
}
class LoadGroup {
LoadGroup({this.completer, this.groupId});
final Completer? completer;
final String? groupId;
}
class LoadGroupActivity {
LoadGroupActivity({this.completer, this.groupId});
final Completer? completer;
final String? groupId;
}
class LoadGroups {
LoadGroups({this.completer});
final Completer? completer;
}
class LoadGroupRequest implements StartLoading {}
class LoadGroupFailure implements StopLoading {
LoadGroupFailure(this.error);
final dynamic error;
@override
String toString() {
return 'LoadGroupFailure{error: $error}';
}
}
class LoadGroupSuccess implements StopLoading, PersistData {
LoadGroupSuccess(this.group);
final GroupEntity group;
@override
String toString() {
return 'LoadGroupSuccess{group: $group}';
}
}
class LoadGroupsRequest implements StartLoading {}
class LoadGroupsFailure implements StopLoading {
LoadGroupsFailure(this.error);
final dynamic error;
@override
String toString() {
return 'LoadGroupsFailure{error: $error}';
}
}
class LoadGroupsSuccess implements StopLoading {
LoadGroupsSuccess(this.groups);
final BuiltList<GroupEntity> groups;
@override
String toString() {
return 'LoadGroupsSuccess{groups: $groups}';
}
}
class SaveGroupRequest implements StartSaving {
SaveGroupRequest({this.completer, this.group});
final Completer? completer;
final GroupEntity? group;
}
class SaveGroupSuccess implements StopSaving, PersistData, PersistUI {
SaveGroupSuccess(this.group);
final GroupEntity group;
}
class AddGroupSuccess implements StopSaving, PersistData, PersistUI {
AddGroupSuccess(this.group);
final GroupEntity group;
}
class SaveGroupFailure implements StopSaving {
SaveGroupFailure(this.error);
final Object error;
}
class ArchiveGroupRequest implements StartSaving {
ArchiveGroupRequest(this.completer, this.groupIds);
final Completer completer;
final List<String> groupIds;
}
class ArchiveGroupSuccess implements StopSaving, PersistData {
ArchiveGroupSuccess(this.groups);
final List<GroupEntity> groups;
}
class ArchiveGroupFailure implements StopSaving {
ArchiveGroupFailure(this.groups);
final List<GroupEntity?> groups;
}
class DeleteGroupRequest implements StartSaving {
DeleteGroupRequest(this.completer, this.groupIds);
final Completer completer;
final List<String> groupIds;
}
class DeleteGroupSuccess implements StopSaving, PersistData {
DeleteGroupSuccess(this.groups);
final List<GroupEntity> groups;
}
class DeleteGroupFailure implements StopSaving {
DeleteGroupFailure(this.groups);
final List<GroupEntity?> groups;
}
class RestoreGroupRequest implements StartSaving {
RestoreGroupRequest(this.completer, this.groupIds);
final Completer completer;
final List<String> groupIds;
}
class RestoreGroupSuccess implements StopSaving, PersistData {
RestoreGroupSuccess(this.groups);
final List<GroupEntity> groups;
}
class RestoreGroupFailure implements StopSaving {
RestoreGroupFailure(this.groups);
final List<GroupEntity?> groups;
}
class FilterGroups implements PersistUI {
FilterGroups(this.filter);
final String? filter;
}
class SortGroups implements PersistUI, PersistPrefs {
SortGroups(this.field);
final String field;
}
class FilterGroupsByState implements PersistUI {
FilterGroupsByState(this.state);
final EntityState state;
}
void handleGroupAction(
BuildContext? context, List<BaseEntity> groups, EntityAction? action) {
if (groups.isEmpty) {
return;
}
final store = StoreProvider.of<AppState>(context!);
final state = store.state;
final localization = AppLocalization.of(context);
final group = groups.first;
final groupIds = groups.map((group) => group.id).toList();
switch (action) {
case EntityAction.edit:
editEntity(entity: group);
break;
case EntityAction.settings:
store.dispatch(ViewSettings(
company: store.state.company,
user: store.state.user,
group: group as GroupEntity?,
section: state.prefState.isDesktop ? kSettingsLocalization : null,
clearFilter: true,
));
break;
case EntityAction.newClient:
createEntity(
entity: ClientEntity().rebuild((b) => b..groupId = group.id));
break;
case EntityAction.restore:
final message = groupIds.length > 1
? localization!.restoredGroups
.replaceFirst(':value', ':count')
.replaceFirst(':count', groupIds.length.toString())
: localization!.restoredGroup;
store.dispatch(
RestoreGroupRequest(snackBarCompleter<Null>(message), groupIds));
break;
case EntityAction.archive:
final message = groupIds.length > 1
? localization!.archivedGroups
.replaceFirst(':value', ':count')
.replaceFirst(':count', groupIds.length.toString())
: localization!.archivedGroup;
store.dispatch(
ArchiveGroupRequest(snackBarCompleter<Null>(message), groupIds));
break;
case EntityAction.delete:
final message = groupIds.length > 1
? localization!.deletedGroups
.replaceFirst(':value', ':count')
.replaceFirst(':count', groupIds.length.toString())
: localization!.deletedGroup;
store.dispatch(
DeleteGroupRequest(snackBarCompleter<Null>(message), groupIds));
break;
case EntityAction.toggleMultiselect:
if (!store.state.groupListState.isInMultiselect()) {
store.dispatch(StartGroupMultiselect());
}
if (groups.isEmpty) {
break;
}
for (final group in groups) {
if (!store.state.groupListState.isSelected(group.id)) {
store.dispatch(AddToGroupMultiselect(entity: group));
} else {
store.dispatch(RemoveFromGroupMultiselect(entity: group));
}
}
break;
case EntityAction.more:
showEntityActionsDialog(
entities: [group],
);
break;
}
}
class StartGroupMultiselect {}
class AddToGroupMultiselect {
AddToGroupMultiselect({required this.entity});
final BaseEntity? entity;
}
class RemoveFromGroupMultiselect {
RemoveFromGroupMultiselect({required this.entity});
final BaseEntity? entity;
}
class ClearGroupMultiselect {}
class SaveGroupDocumentRequest implements StartSaving {
SaveGroupDocumentRequest({
required this.isPrivate,
required this.completer,
required this.multipartFiles,
required this.group,
});
final bool isPrivate;
final Completer completer;
final List<MultipartFile> multipartFiles;
final GroupEntity group;
}
class SaveGroupDocumentSuccess implements StopSaving, PersistData, PersistUI {
SaveGroupDocumentSuccess(this.document);
final DocumentEntity document;
}
class SaveGroupDocumentFailure implements StopSaving {
SaveGroupDocumentFailure(this.error);
final Object error;
}