Kanban
This commit is contained in:
parent
56e83ac6d4
commit
4dfaba4d15
|
|
@ -171,6 +171,7 @@ part 'serializers.g.dart';
|
||||||
ImportRequest,
|
ImportRequest,
|
||||||
ImportRequestMapping,
|
ImportRequestMapping,
|
||||||
UserTwoFactorResponse,
|
UserTwoFactorResponse,
|
||||||
|
KanbanResponse,
|
||||||
])
|
])
|
||||||
final Serializers serializers =
|
final Serializers serializers =
|
||||||
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
|
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ abstract class KanbanResponse
|
||||||
@memoized
|
@memoized
|
||||||
int get hashCode;
|
int get hashCode;
|
||||||
|
|
||||||
BuiltList<KanbanResponseData> get data;
|
KanbanResponseData get data;
|
||||||
|
|
||||||
static Serializer<KanbanResponse> get serializer =>
|
static Serializer<KanbanResponse> get serializer =>
|
||||||
_$kanbanResponseSerializer;
|
_$kanbanResponseSerializer;
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,19 @@ class TaskRepository {
|
||||||
return taskResponse.data.toList();
|
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 {
|
Future<TaskEntity> saveData(Credentials credentials, TaskEntity task) async {
|
||||||
final data = serializers.serializeWith(TaskEntity.serializer, task);
|
final data = serializers.serializeWith(TaskEntity.serializer, task);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -229,7 +229,7 @@ class RestoreTaskFailure implements StopSaving {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SortTasksRequest implements StartSaving {
|
class SortTasksRequest implements StartSaving {
|
||||||
SortTasksRequest(this.completer, this.taskStatusIds, this.taskIds);
|
SortTasksRequest({this.completer, this.taskStatusIds, this.taskIds});
|
||||||
|
|
||||||
final Completer completer;
|
final Completer completer;
|
||||||
final List<String> taskStatusIds;
|
final List<String> taskStatusIds;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/vendor/vendor_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:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
|
|
@ -28,6 +27,7 @@ List<Middleware<AppState>> createStoreTasksMiddleware([
|
||||||
final deleteTask = _deleteTask(repository);
|
final deleteTask = _deleteTask(repository);
|
||||||
final restoreTask = _restoreTask(repository);
|
final restoreTask = _restoreTask(repository);
|
||||||
final saveDocument = _saveDocument(repository);
|
final saveDocument = _saveDocument(repository);
|
||||||
|
final sortTasks = _sortTasks(repository);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
TypedMiddleware<AppState, ViewTaskList>(viewTaskList),
|
TypedMiddleware<AppState, ViewTaskList>(viewTaskList),
|
||||||
|
|
@ -40,6 +40,7 @@ List<Middleware<AppState>> createStoreTasksMiddleware([
|
||||||
TypedMiddleware<AppState, DeleteTaskRequest>(deleteTask),
|
TypedMiddleware<AppState, DeleteTaskRequest>(deleteTask),
|
||||||
TypedMiddleware<AppState, RestoreTaskRequest>(restoreTask),
|
TypedMiddleware<AppState, RestoreTaskRequest>(restoreTask),
|
||||||
TypedMiddleware<AppState, SaveTaskDocumentRequest>(saveDocument),
|
TypedMiddleware<AppState, SaveTaskDocumentRequest>(saveDocument),
|
||||||
|
TypedMiddleware<AppState, SortTasksRequest>(sortTasks),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -263,3 +264,26 @@ Middleware<AppState> _saveDocument(TaskRepository repository) {
|
||||||
next(action);
|
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),
|
state.taskListState),
|
||||||
onBoardChanged: (context, statusIds, taskIds) {
|
onBoardChanged: (context, statusIds, taskIds) {
|
||||||
print('## onBoardChanged...\nstatusIds: $statusIds\ntaskIds: $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) {
|
onStatusOrderChanged: (context, statusId, index) {
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue