import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:vikunja_app/api/response.dart'; import 'package:vikunja_app/models/label.dart'; import 'package:vikunja_app/models/labelTask.dart'; import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/models/user.dart'; import 'package:vikunja_app/models/bucket.dart'; import '../models/project.dart'; import '../models/server.dart'; enum TaskServiceOptionSortBy { id, title, description, done, done_at, due_date, created_by_id, list_id, repeat_after, priority, start_date, end_date, hex_color, percent_done, uid, created, updated } enum TaskServiceOptionOrderBy { asc, desc } enum TaskServiceOptionFilterBy { done, due_date, reminder_dates } enum TaskServiceOptionFilterValue { enum_true, enum_false, enum_null } enum TaskServiceOptionFilterComparator { equals, greater, greater_equals, less, less_equals, like, enum_in } enum TaskServiceOptionFilterConcat { and, or } class TaskServiceOption { String name; String? value; List? valueList; dynamic defValue; TaskServiceOption(this.name, dynamic input_values) { if(input_values is List) { valueList = input_values; } else if(input_values is String) { value = input_values; } } String handleValue(dynamic input) { if (input is String) return input; return input.toString().split('.').last.replaceAll('enum_', ''); } dynamic getValue() { if (valueList != null) return valueList!.map((elem) => handleValue(elem)).toList(); else return handleValue(value); } } final List defaultOptions = [ TaskServiceOption("sort_by", [TaskServiceOptionSortBy.due_date, TaskServiceOptionSortBy.id]), TaskServiceOption( "order_by", TaskServiceOptionOrderBy.asc), TaskServiceOption("filter_by", [ TaskServiceOptionFilterBy.done, TaskServiceOptionFilterBy.due_date ]), TaskServiceOption("filter_value", [ TaskServiceOptionFilterValue.enum_false, '1970-01-01T00:00:00.000Z' ]), TaskServiceOption( "filter_comparator", [ TaskServiceOptionFilterComparator.equals, TaskServiceOptionFilterComparator.greater ]), TaskServiceOption( "filter_concat", TaskServiceOptionFilterConcat.and), ]; class TaskServiceOptions { List options = []; TaskServiceOptions({List? newOptions, bool clearOther = false}) { if(!clearOther) options = new List.from(defaultOptions); if (newOptions != null) { for (TaskServiceOption custom_option in newOptions) { int index = options.indexWhere((element) => element.name == custom_option.name); if(index > -1) { options.removeAt(index); } else { index = options.length; } options.insert(index, custom_option); } } } Map> getOptions() { Map> queryparams = {}; for (TaskServiceOption option in options) { dynamic value = option.getValue(); if (value is List) { queryparams[option.name+"[]"] = value as List; //for (dynamic valueEntry in value) { // result += '&' + option.name + '[]=' + valueEntry; //} } else { queryparams[option.name] = [value as String]; //result += '&' + option.name + '[]=' + value; } } //if (result.startsWith('&')) result = result.substring(1); //result = "?" + result; return queryparams; } } abstract class ProjectService { Future?> getAll(); Future get(int projectId); Future create(Project p); Future update(Project p); Future delete(int projectId); Future getDisplayDoneTasks(int listId); void setDisplayDoneTasks(int listId, String value); //Future getDefaultList(); //void setDefaultList(int? listId); } abstract class NamespaceService { Future?> getAll(); Future get(int namespaceId); Future create(Namespace ns); Future update(Namespace ns); Future delete(int namespaceId); } abstract class ListService { Future?> getAll(); Future get(int listId); Future?> getByNamespace(int namespaceId); Future create(int namespaceId, TaskList tl); Future update(TaskList tl); Future delete(int listId); Future getDisplayDoneTasks(int listId); void setDisplayDoneTasks(int listId, String value); Future getDefaultList(); //void setDefaultList(int? listId); } abstract class TaskService { Future get(int taskId); Future update(Task task); Future delete(int taskId); Future add(int listId, Task task); Future?> getAll(); Future getAllByProject(int projectId, [Map> queryParameters]); Future?> getByOptions(TaskServiceOptions options); int get maxPages; } abstract class BucketService { // Not implemented in the Vikunja API // Future get(int listId, int bucketId); Future update(Bucket bucket); Future delete(int listId, int bucketId); Future add(int listId, Bucket bucket); Future getAllByList(int listId, [Map> queryParameters]); int get maxPages; } abstract class UserService { Future login(String username, String password, {bool rememberMe = false, String totp}); Future register(String username, email, password); Future getCurrentUser(); Future setCurrentUserSettings(UserSettings userSettings); Future getToken(); } abstract class LabelService { Future?> getAll({String query}); Future get(int labelID); Future create(Label label); Future delete(Label label); Future update(Label label); } abstract class LabelTaskService { Future?> getAll(LabelTask lt, {String query}); Future create(LabelTask lt); Future delete(LabelTask lt); } abstract class LabelTaskBulkService { Future?> update(Task task, List