custom_functions.dart 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import 'dart:convert';
  2. import 'dart:math' as math;
  3. import 'package:flutter/material.dart';
  4. import 'package:google_fonts/google_fonts.dart';
  5. import 'package:intl/intl.dart';
  6. import 'package:timeago/timeago.dart' as timeago;
  7. import 'lat_lng.dart';
  8. import 'place.dart';
  9. import 'uploaded_file.dart';
  10. import '/backend/schema/structs/index.dart';
  11. import '/auth/custom_auth/auth_util.dart';
  12. String? kortDatum(String? rawDatum) {
  13. if (rawDatum == null || rawDatum.trim().isEmpty) {
  14. return rawDatum;
  15. }
  16. const weekdagen = {
  17. 'maandag': 'ma',
  18. 'dinsdag': 'di',
  19. 'woensdag': 'wo',
  20. 'donderdag': 'do',
  21. 'vrijdag': 'vr',
  22. 'zaterdag': 'za',
  23. 'zondag': 'zo',
  24. };
  25. const maandVolledig = {
  26. 'januari': 'jan',
  27. 'februari': 'feb',
  28. 'maart': 'mrt',
  29. 'april': 'apr',
  30. 'mei': 'mei',
  31. 'juni': 'jun',
  32. 'juli': 'jul',
  33. 'augustus': 'aug',
  34. 'september': 'sep',
  35. 'oktober': 'okt',
  36. 'november': 'nov',
  37. 'december': 'dec',
  38. };
  39. const maandKort = {
  40. 'jan',
  41. 'feb',
  42. 'mrt',
  43. 'apr',
  44. 'mei',
  45. 'jun',
  46. 'jul',
  47. 'aug',
  48. 'sep',
  49. 'okt',
  50. 'nov',
  51. 'dec',
  52. };
  53. // Alles vanaf de komma (bv. ", 15:00") negeren.
  54. final zonderTijd = rawDatum.split(',').first.trim().toLowerCase();
  55. final delen = zonderTijd.split(RegExp(r'\s+'));
  56. if (delen.length < 3) {
  57. return rawDatum;
  58. }
  59. final weekdag = weekdagen[delen[0]];
  60. final dag = delen[1];
  61. final maandRuw = delen[2].replaceAll('.', '');
  62. final maand = maandVolledig[maandRuw] ??
  63. (maandKort.contains(maandRuw) ? maandRuw : null);
  64. if (weekdag == null || maand == null) {
  65. return rawDatum;
  66. }
  67. final tijdDelen = rawDatum.split(',');
  68. final tijd =
  69. tijdDelen.length > 1 ? tijdDelen.sublist(1).join(',').trim() : '';
  70. return tijd.isNotEmpty
  71. ? '$weekdag $dag $maand $tijd'
  72. : '$weekdag $dag $maand';
  73. }
  74. String? provincieNaamById(
  75. List<ProvincieModelStruct>? lijst,
  76. String? id,
  77. ) {
  78. return lijst
  79. ?.firstWhere((e) => e.provincieid == id,
  80. orElse: () => ProvincieModelStruct())
  81. .provinciename;
  82. }
  83. /// id
  84. String? gemeenteNaamById(
  85. List<GemeenteModelStruct>? lijst,
  86. String? id,
  87. ) {
  88. return lijst
  89. ?.firstWhere((e) => e.gemeenteid == id,
  90. orElse: () => GemeenteModelStruct())
  91. .gemeentename;
  92. }
  93. String? favorietenBodyNode(String nid) {
  94. return '{"entity_id": ' + nid + ', "entity_type": "node"}';
  95. }
  96. String googleMapsUrl(
  97. String adres,
  98. String plaats,
  99. ) {
  100. return 'https://www.google.com/maps/search/?api=1&query=' +
  101. Uri.encodeComponent('$adres, $plaats');
  102. }
  103. List<dynamic> filterHorecagelegenheden(
  104. List<dynamic> items,
  105. String zoekterm,
  106. String? categorieFilter,
  107. String titelPad,
  108. String categoriePad,
  109. ) {
  110. final titelKey =
  111. titelPad.startsWith(r'$.') ? titelPad.substring(2) : titelPad;
  112. final categorieKey =
  113. categoriePad.startsWith(r'$.') ? categoriePad.substring(2) : categoriePad;
  114. final term = zoekterm
  115. .trim()
  116. .toLowerCase()
  117. .replaceAll('à', 'a')
  118. .replaceAll('á', 'a')
  119. .replaceAll('ä', 'a')
  120. .replaceAll('â', 'a')
  121. .replaceAll('è', 'e')
  122. .replaceAll('é', 'e')
  123. .replaceAll('ë', 'e')
  124. .replaceAll('ê', 'e')
  125. .replaceAll('ì', 'i')
  126. .replaceAll('í', 'i')
  127. .replaceAll('ï', 'i')
  128. .replaceAll('î', 'i')
  129. .replaceAll('ò', 'o')
  130. .replaceAll('ó', 'o')
  131. .replaceAll('ö', 'o')
  132. .replaceAll('ô', 'o')
  133. .replaceAll('ù', 'u')
  134. .replaceAll('ú', 'u')
  135. .replaceAll('ü', 'u')
  136. .replaceAll('û', 'u')
  137. .replaceAll('ñ', 'n')
  138. .replaceAll('ç', 'c');
  139. final catFilter = categorieFilter?.trim();
  140. return items.where((item) {
  141. final map = item is Map ? item : null;
  142. if (term.isNotEmpty) {
  143. final titelRaw = map?[titelKey]?.toString() ?? '';
  144. final titel = titelRaw
  145. .toLowerCase()
  146. .replaceAll('à', 'a')
  147. .replaceAll('á', 'a')
  148. .replaceAll('ä', 'a')
  149. .replaceAll('â', 'a')
  150. .replaceAll('è', 'e')
  151. .replaceAll('é', 'e')
  152. .replaceAll('ë', 'e')
  153. .replaceAll('ê', 'e')
  154. .replaceAll('ì', 'i')
  155. .replaceAll('í', 'i')
  156. .replaceAll('ï', 'i')
  157. .replaceAll('î', 'i')
  158. .replaceAll('ò', 'o')
  159. .replaceAll('ó', 'o')
  160. .replaceAll('ö', 'o')
  161. .replaceAll('ô', 'o')
  162. .replaceAll('ù', 'u')
  163. .replaceAll('ú', 'u')
  164. .replaceAll('ü', 'u')
  165. .replaceAll('û', 'u')
  166. .replaceAll('ñ', 'n')
  167. .replaceAll('ç', 'c');
  168. if (!titel.contains(term)) {
  169. return false;
  170. }
  171. }
  172. if (catFilter != null && catFilter.isNotEmpty) {
  173. final categorie = map?[categorieKey];
  174. final lijst = (categorie is List) ? categorie : <dynamic>[];
  175. final match = lijst
  176. .any((c) => c.toString().toLowerCase() == catFilter.toLowerCase());
  177. if (!match) {
  178. return false;
  179. }
  180. }
  181. return true;
  182. }).toList();
  183. }
  184. String? datumVoorApi(String? datum) {
  185. if (datum == null) return '';
  186. final s = datum.trim();
  187. if (s.isEmpty) return '';
  188. final punt = s.indexOf('.');
  189. return punt == -1 ? s : s.substring(0, punt);
  190. }
  191. String? buildStempel() {
  192. return const String.fromEnvironment('BUILD_TS', defaultValue: 'onbekend');
  193. }
  194. List<String>? categorieSubTids(dynamic respons) {
  195. final lijst = respons;
  196. final uit = <String>[];
  197. if (lijst is! List) return uit;
  198. for (final item in lijst) {
  199. if (item is! Map) continue;
  200. final d = int.tryParse('${item['diepte']}');
  201. if (d != 1) continue;
  202. uit.add('${item['tid']}');
  203. }
  204. return uit;
  205. }
  206. List<String>? categorieSubLabels(dynamic respons) {
  207. final lijst = respons;
  208. final uit = <String>[];
  209. if (lijst is! List) return uit;
  210. final namen = <String, String>{};
  211. for (final item in lijst) {
  212. if (item is Map) namen['${item['tid']}'] = '${item['naam']}';
  213. }
  214. for (final item in lijst) {
  215. if (item is! Map) continue;
  216. final d = int.tryParse('${item['diepte']}');
  217. if (d != 1) continue;
  218. final ouder = namen['${item['parent_tid']}'] ?? '';
  219. uit.add(ouder.isEmpty ? '${item['naam']}' : '$ouder › ${item['naam']}');
  220. }
  221. return uit;
  222. }
  223. String? horecaVoorselectie(
  224. dynamic mijnHoreca,
  225. String? paramNid,
  226. ) {
  227. if (paramNid != null && paramNid.trim().isNotEmpty) {
  228. return paramNid.trim();
  229. }
  230. if (mijnHoreca is List && mijnHoreca.length == 1) {
  231. final eerste = mijnHoreca[0];
  232. if (eerste is Map && eerste['nid'] != null) {
  233. return eerste['nid'].toString();
  234. }
  235. }
  236. return null;
  237. }
  238. String? lijstAlsTekst(dynamic items) {
  239. if (items == null) {
  240. return '';
  241. }
  242. if (items is List) {
  243. return items.join(', ');
  244. }
  245. return items.toString();
  246. }
  247. List<dynamic>? categorieAlsLijst(dynamic categorie) {
  248. final uit = <String>[];
  249. if (categorie == null) return uit;
  250. final ruw = categorie is List ? categorie : categorie.toString().split(',');
  251. for (final deel in ruw)
  252. if (deel != null && deel.toString().trim().isNotEmpty)
  253. uit.add(deel.toString().trim());
  254. return uit;
  255. }
  256. String? filterDatumVan(String? keuze) {
  257. if (keuze == null) {
  258. return '';
  259. }
  260. final nu = DateTime.now();
  261. int extra = 0;
  262. if (keuze == 'weekend') {
  263. if (nu.weekday < 6) {
  264. extra = 6 - nu.weekday;
  265. }
  266. } else if (keuze != 'vandaag' && keuze != 'week') {
  267. return '';
  268. }
  269. final start = DateTime(nu.year, nu.month, nu.day + extra);
  270. final maand = start.month.toString().padLeft(2, '0');
  271. final dag = start.day.toString().padLeft(2, '0');
  272. return '${start.year}-$maand-$dag 00:00:00';
  273. }
  274. String? filterDatumTot(String? keuze) {
  275. if (keuze == null) {
  276. return '';
  277. }
  278. final nu = DateTime.now();
  279. int extra = 0;
  280. if (keuze == 'weekend' || keuze == 'week') {
  281. if (nu.weekday < 7) {
  282. extra = 7 - nu.weekday;
  283. }
  284. } else if (keuze != 'vandaag') {
  285. return '';
  286. }
  287. final eind = DateTime(nu.year, nu.month, nu.day + extra);
  288. final maand = eind.month.toString().padLeft(2, '0');
  289. final dag = eind.day.toString().padLeft(2, '0');
  290. return '${eind.year}-$maand-$dag 23:59:59';
  291. }