From 0eb941bfb1cbf2e75f6a828ec1e842eb0411a107 Mon Sep 17 00:00:00 2001 From: Benimautner Date: Tue, 28 Nov 2023 17:06:07 +0100 Subject: [PATCH] fixed uri escaping [] characters when loading tasks --- lib/api/client.dart | 5 ++++- lib/api/task_implementation.dart | 16 ++++++++++++-- lib/pages/landing_page.dart | 8 +++++-- lib/service/services.dart | 36 +++++++++++++++++++------------- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/lib/api/client.dart b/lib/api/client.dart index 27939fb..506a43a 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -81,13 +81,16 @@ class Client { [Map>? queryParameters]) { Uri uri = Uri.tryParse('${this.base}$url')!; // why are we doing it like this? because Uri doesnt have setters. wtf. + print(uri.toString()); + uri = Uri( scheme: uri.scheme, userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, - queryParameters: {...uri.queryParameters, ...?queryParameters}, + //queryParameters: {...uri.queryParameters, ...?queryParameters}, + queryParameters: queryParameters, fragment: uri.fragment ); diff --git a/lib/api/task_implementation.dart b/lib/api/task_implementation.dart index 786364d..7221edf 100644 --- a/lib/api/task_implementation.dart +++ b/lib/api/task_implementation.dart @@ -90,11 +90,23 @@ class TaskAPIService extends APIService implements TaskService { @override Future?> getByOptions(TaskServiceOptions options) { - String optionString = options.getOptions(); + Map> optionsMap = options.getOptions(); + //optionString = "?sort_by[]=due_date&sort_by[]=id&order_by[]=asc&order_by[]=desc&filter_by[]=done&filter_value[]=false&filter_comparator[]=equals&filter_concat=and&filter_include_nulls=false&page=1"; + //print(optionString); + Map> queryparams = { + "sort_by[]":["due_date", "id"], + "order_by[]":["asc", "desc"], + "filter_by[]": ["done"], + "filter_value[]":["false"], + "filter_comparator[]":["equals"], + "filter_concat[]":["and"], + }; return client - .get('/tasks/all$optionString') + .get('/tasks/all', optionsMap) .then((response) { if (response == null) return null; + print(response.body); + print(response.headers); return convertList(response.body, (result) => Task.fromJson(result)); }); } diff --git a/lib/pages/landing_page.dart b/lib/pages/landing_page.dart index ba33f99..838dfb9 100644 --- a/lib/pages/landing_page.dart +++ b/lib/pages/landing_page.dart @@ -229,20 +229,24 @@ class LandingPageState extends State .taskService .getByOptions(TaskServiceOptions( newOptions: [ + TaskServiceOption("sort_by", ["due_date", "id"]), + TaskServiceOption("order_by", ["asc", "desc"]), TaskServiceOption("filter_by", "done"), TaskServiceOption("filter_value", "false"), + TaskServiceOption("filter_comparator", "equals"), + TaskServiceOption("filter_concat", "and"), ], clearOther: true )) .then?>((taskList) => _handleTaskList(taskList, showOnlyDueDateTasks)); - }).onError((error, stackTrace) {print("error");}); + });//.onError((error, stackTrace) {print("error");}); } Future _handleTaskList(List? taskList, bool showOnlyDueDateTasks) { if(showOnlyDueDateTasks) taskList?.removeWhere((element) => element.dueDate == null || element.dueDate!.year == 0001); - taskList?.forEach((element) {print(element.dueDate);}); + taskList?.forEach((element) {print(element.title);}); if (taskList != null && taskList.isEmpty) { setState(() { diff --git a/lib/service/services.dart b/lib/service/services.dart index 6c9f81c..9eb2d41 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -55,10 +55,17 @@ enum TaskServiceOptionFilterConcat { and, or } class TaskServiceOption { String name; - dynamic value; + String? value; + List? valueList; dynamic defValue; - TaskServiceOption(this.name, this.value); + 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; @@ -66,8 +73,8 @@ class TaskServiceOption { } dynamic getValue() { - if (value is List) - return value.map((elem) => handleValue(elem)).toList(); + if (valueList != null) + return valueList!.map((elem) => handleValue(elem)).toList(); else return handleValue(value); } @@ -116,23 +123,24 @@ class TaskServiceOptions { } - String getOptions() { - String result = ''; - if (options.length == 0) return ''; + Map> getOptions() { + Map> queryparams = {}; for (TaskServiceOption option in options) { dynamic value = option.getValue(); if (value is List) { - for (dynamic valueEntry in value) { - result += '&' + option.name + '[]=' + valueEntry; - } + queryparams[option.name+"[]"] = value as List; + //for (dynamic valueEntry in value) { + // result += '&' + option.name + '[]=' + valueEntry; + //} } else { - result += '&' + option.name + '=' + value; + queryparams[option.name] = [value as String]; + //result += '&' + option.name + '[]=' + value; } } - if (result.startsWith('&')) result = result.substring(1); - result = "?" + result; - return result; + //if (result.startsWith('&')) result = result.substring(1); + //result = "?" + result; + return queryparams; } }