diff --git a/lib/data/models/serializers.dart b/lib/data/models/serializers.dart index d560e7b7c..cb8c90a3a 100644 --- a/lib/data/models/serializers.dart +++ b/lib/data/models/serializers.dart @@ -171,6 +171,7 @@ part 'serializers.g.dart'; ImportRequest, ImportRequestMapping, UserTwoFactorResponse, + KanbanResponse, ]) final Serializers serializers = (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(); diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 79cccd461..3f4f96fa4 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -58,7 +58,7 @@ abstract class KanbanResponse @memoized int get hashCode; - BuiltList get data; + KanbanResponseData get data; static Serializer get serializer => _$kanbanResponseSerializer; diff --git a/lib/data/repositories/task_repository.dart b/lib/data/repositories/task_repository.dart index fba578f02..1f70fe478 100644 --- a/lib/data/repositories/task_repository.dart +++ b/lib/data/repositories/task_repository.dart @@ -52,6 +52,19 @@ class TaskRepository { return taskResponse.data.toList(); } + Future sortTasks(Credentials credentials, + List statusIds, Map> taskIds) async { + final url = credentials.url + '/tasks/sort'; + + final dynamic response = await webClient.post(url, credentials.token, + data: json.encode({'status_ids': statusIds, 'task_ids': taskIds})); + + final KanbanResponse taskResponse = + serializers.deserializeWith(KanbanResponse.serializer, response); + + return taskResponse.data; + } + Future saveData(Credentials credentials, TaskEntity task) async { final data = serializers.serializeWith(TaskEntity.serializer, task); diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index 184f3bb76..1a29420e2 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -229,7 +229,7 @@ class RestoreTaskFailure implements StopSaving { } class SortTasksRequest implements StartSaving { - SortTasksRequest(this.completer, this.taskStatusIds, this.taskIds); + SortTasksRequest({this.completer, this.taskStatusIds, this.taskIds}); final Completer completer; final List taskStatusIds; diff --git a/lib/redux/task/task_middleware.dart b/lib/redux/task/task_middleware.dart index 4200debbc..f44066004 100644 --- a/lib/redux/task/task_middleware.dart +++ b/lib/redux/task/task_middleware.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart'; -import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; @@ -28,6 +27,7 @@ List> createStoreTasksMiddleware([ final deleteTask = _deleteTask(repository); final restoreTask = _restoreTask(repository); final saveDocument = _saveDocument(repository); + final sortTasks = _sortTasks(repository); return [ TypedMiddleware(viewTaskList), @@ -40,6 +40,7 @@ List> createStoreTasksMiddleware([ TypedMiddleware(deleteTask), TypedMiddleware(restoreTask), TypedMiddleware(saveDocument), + TypedMiddleware(sortTasks), ]; } @@ -263,3 +264,26 @@ Middleware _saveDocument(TaskRepository repository) { next(action); }; } + +Middleware _sortTasks(TaskRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as SortTasksRequest; + + repository + .sortTasks(store.state.credentials, action.statusIds, action.taskIds) + .then((KanbanResponseData data) { + print('## DONE: $data'); + if (action.completer != null) { + action.completer.complete(null); + } + }).catchError((Object error) { + print(error); + store.dispatch(SortTasksFailure(error)); + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} diff --git a/lib/ui/task/kanban_view_vm.dart b/lib/ui/task/kanban_view_vm.dart index 1c9eab25d..9f8cabc89 100644 --- a/lib/ui/task/kanban_view_vm.dart +++ b/lib/ui/task/kanban_view_vm.dart @@ -72,6 +72,14 @@ class KanbanVM { state.taskListState), onBoardChanged: (context, statusIds, taskIds) { print('## onBoardChanged...\nstatusIds: $statusIds\ntaskIds: $taskIds'); + final localization = AppLocalization.of(context); + final completer = snackBarCompleter( + context, localization.updatedTaskStatus); + store.dispatch(SortTasksRequest( + completer: completer, + taskIds: taskIds, + taskStatusIds: statusIds, + )); }, onStatusOrderChanged: (context, statusId, index) { final localization = AppLocalization.of(context);