Kanban
This commit is contained in:
parent
56e83ac6d4
commit
4dfaba4d15
|
|
@ -171,6 +171,7 @@ part 'serializers.g.dart';
|
|||
ImportRequest,
|
||||
ImportRequestMapping,
|
||||
UserTwoFactorResponse,
|
||||
KanbanResponse,
|
||||
])
|
||||
final Serializers serializers =
|
||||
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ abstract class KanbanResponse
|
|||
@memoized
|
||||
int get hashCode;
|
||||
|
||||
BuiltList<KanbanResponseData> get data;
|
||||
KanbanResponseData get data;
|
||||
|
||||
static Serializer<KanbanResponse> get serializer =>
|
||||
_$kanbanResponseSerializer;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,19 @@ class TaskRepository {
|
|||
return taskResponse.data.toList();
|
||||
}
|
||||
|
||||
Future<KanbanResponseData> sortTasks(Credentials credentials,
|
||||
List<String> statusIds, Map<String, List<String>> 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<TaskEntity> saveData(Credentials credentials, TaskEntity task) async {
|
||||
final data = serializers.serializeWith(TaskEntity.serializer, task);
|
||||
|
||||
|
|
|
|||
|
|
@ -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<String> taskStatusIds;
|
||||
|
|
|
|||
|
|
@ -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<Middleware<AppState>> createStoreTasksMiddleware([
|
|||
final deleteTask = _deleteTask(repository);
|
||||
final restoreTask = _restoreTask(repository);
|
||||
final saveDocument = _saveDocument(repository);
|
||||
final sortTasks = _sortTasks(repository);
|
||||
|
||||
return [
|
||||
TypedMiddleware<AppState, ViewTaskList>(viewTaskList),
|
||||
|
|
@ -40,6 +40,7 @@ List<Middleware<AppState>> createStoreTasksMiddleware([
|
|||
TypedMiddleware<AppState, DeleteTaskRequest>(deleteTask),
|
||||
TypedMiddleware<AppState, RestoreTaskRequest>(restoreTask),
|
||||
TypedMiddleware<AppState, SaveTaskDocumentRequest>(saveDocument),
|
||||
TypedMiddleware<AppState, SortTasksRequest>(sortTasks),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -263,3 +264,26 @@ Middleware<AppState> _saveDocument(TaskRepository repository) {
|
|||
next(action);
|
||||
};
|
||||
}
|
||||
|
||||
Middleware<AppState> _sortTasks(TaskRepository repository) {
|
||||
return (Store<AppState> 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);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<TaskStatusEntity>(
|
||||
context, localization.updatedTaskStatus);
|
||||
store.dispatch(SortTasksRequest(
|
||||
completer: completer,
|
||||
taskIds: taskIds,
|
||||
taskStatusIds: statusIds,
|
||||
));
|
||||
},
|
||||
onStatusOrderChanged: (context, statusId, index) {
|
||||
final localization = AppLocalization.of(context);
|
||||
|
|
|
|||
Loading…
Reference in New Issue