fixed uri escaping [] characters when loading tasks

This commit is contained in:
Benimautner 2023-11-28 17:06:07 +01:00
parent 347bd6cd66
commit 0eb941bfb1
4 changed files with 46 additions and 19 deletions

View File

@ -81,13 +81,16 @@ class Client {
[Map<String, List<String>>? queryParameters]) { [Map<String, List<String>>? queryParameters]) {
Uri uri = Uri.tryParse('${this.base}$url')!; Uri uri = Uri.tryParse('${this.base}$url')!;
// why are we doing it like this? because Uri doesnt have setters. wtf. // why are we doing it like this? because Uri doesnt have setters. wtf.
print(uri.toString());
uri = Uri( uri = Uri(
scheme: uri.scheme, scheme: uri.scheme,
userInfo: uri.userInfo, userInfo: uri.userInfo,
host: uri.host, host: uri.host,
port: uri.port, port: uri.port,
path: uri.path, path: uri.path,
queryParameters: {...uri.queryParameters, ...?queryParameters}, //queryParameters: {...uri.queryParameters, ...?queryParameters},
queryParameters: queryParameters,
fragment: uri.fragment fragment: uri.fragment
); );

View File

@ -90,11 +90,23 @@ class TaskAPIService extends APIService implements TaskService {
@override @override
Future<List<Task>?> getByOptions(TaskServiceOptions options) { Future<List<Task>?> getByOptions(TaskServiceOptions options) {
String optionString = options.getOptions(); Map<String, List<String>> 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<String, List<String>> queryparams = {
"sort_by[]":["due_date", "id"],
"order_by[]":["asc", "desc"],
"filter_by[]": ["done"],
"filter_value[]":["false"],
"filter_comparator[]":["equals"],
"filter_concat[]":["and"],
};
return client return client
.get('/tasks/all$optionString') .get('/tasks/all', optionsMap)
.then((response) { .then((response) {
if (response == null) return null; if (response == null) return null;
print(response.body);
print(response.headers);
return convertList(response.body, (result) => Task.fromJson(result)); return convertList(response.body, (result) => Task.fromJson(result));
}); });
} }

View File

@ -229,20 +229,24 @@ class LandingPageState extends State<LandingPage>
.taskService .taskService
.getByOptions(TaskServiceOptions( .getByOptions(TaskServiceOptions(
newOptions: [ newOptions: [
TaskServiceOption<TaskServiceOptionSortBy>("sort_by", ["due_date", "id"]),
TaskServiceOption<TaskServiceOptionSortBy>("order_by", ["asc", "desc"]),
TaskServiceOption<TaskServiceOptionFilterBy>("filter_by", "done"), TaskServiceOption<TaskServiceOptionFilterBy>("filter_by", "done"),
TaskServiceOption<TaskServiceOptionFilterValue>("filter_value", "false"), TaskServiceOption<TaskServiceOptionFilterValue>("filter_value", "false"),
TaskServiceOption<TaskServiceOptionFilterComparator>("filter_comparator", "equals"),
TaskServiceOption<TaskServiceOptionFilterConcat>("filter_concat", "and"),
], ],
clearOther: true clearOther: true
)) ))
.then<Future<void>?>((taskList) => _handleTaskList(taskList, showOnlyDueDateTasks)); .then<Future<void>?>((taskList) => _handleTaskList(taskList, showOnlyDueDateTasks));
}).onError((error, stackTrace) {print("error");}); });//.onError((error, stackTrace) {print("error");});
} }
Future<void> _handleTaskList(List<Task>? taskList, bool showOnlyDueDateTasks) { Future<void> _handleTaskList(List<Task>? taskList, bool showOnlyDueDateTasks) {
if(showOnlyDueDateTasks) if(showOnlyDueDateTasks)
taskList?.removeWhere((element) => element.dueDate == null || element.dueDate!.year == 0001); 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) { if (taskList != null && taskList.isEmpty) {
setState(() { setState(() {

View File

@ -55,10 +55,17 @@ enum TaskServiceOptionFilterConcat { and, or }
class TaskServiceOption<T> { class TaskServiceOption<T> {
String name; String name;
dynamic value; String? value;
List<String>? valueList;
dynamic defValue; dynamic defValue;
TaskServiceOption(this.name, this.value); TaskServiceOption(this.name, dynamic input_values) {
if(input_values is List<String>) {
valueList = input_values;
} else if(input_values is String) {
value = input_values;
}
}
String handleValue(dynamic input) { String handleValue(dynamic input) {
if (input is String) return input; if (input is String) return input;
@ -66,8 +73,8 @@ class TaskServiceOption<T> {
} }
dynamic getValue() { dynamic getValue() {
if (value is List) if (valueList != null)
return value.map((elem) => handleValue(elem)).toList(); return valueList!.map((elem) => handleValue(elem)).toList();
else else
return handleValue(value); return handleValue(value);
} }
@ -116,23 +123,24 @@ class TaskServiceOptions {
} }
String getOptions() { Map<String, List<String>> getOptions() {
String result = ''; Map<String, List<String>> queryparams = {};
if (options.length == 0) return '';
for (TaskServiceOption option in options) { for (TaskServiceOption option in options) {
dynamic value = option.getValue(); dynamic value = option.getValue();
if (value is List) { if (value is List) {
for (dynamic valueEntry in value) { queryparams[option.name+"[]"] = value as List<String>;
result += '&' + option.name + '[]=' + valueEntry; //for (dynamic valueEntry in value) {
} // result += '&' + option.name + '[]=' + valueEntry;
//}
} else { } else {
result += '&' + option.name + '=' + value; queryparams[option.name] = [value as String];
//result += '&' + option.name + '[]=' + value;
} }
} }
if (result.startsWith('&')) result = result.substring(1); //if (result.startsWith('&')) result = result.substring(1);
result = "?" + result; //result = "?" + result;
return result; return queryparams;
} }
} }