Line data Source code
1 : import 'package:flutter/services.dart'; 2 : import 'package:folly_fields/util/folly_utils.dart'; 3 : import 'package:folly_fields/util/mask_text_input_formatter.dart'; 4 : import 'package:folly_fields/validators/abstract_validator.dart'; 5 : import 'package:intl/intl.dart'; 6 : 7 : /// 8 : /// 9 : /// 10 : class DateTimeValidator extends AbstractParserValidator<DateTime> { 11 : final String locale; 12 : final String dateFormat; 13 : 14 : /// 15 : /// 16 : /// 17 1 : DateTimeValidator({ 18 : this.locale = 'pt_br', 19 : this.dateFormat = 'dd/MM/yyyy HH:mm', 20 : String mask = 'B#/D#/#### A#:C#', 21 1 : }) : super( 22 1 : <TextInputFormatter>[ 23 1 : MaskTextInputFormatter( 24 : mask: mask, 25 1 : filter: <String, RegExp>{ 26 1 : 'A': RegExp('[0-2]'), 27 1 : 'B': RegExp('[0-3]'), 28 1 : 'C': RegExp('[0-5]'), 29 1 : 'D': RegExp('[0-1]'), 30 1 : '#': RegExp('[0-9]'), 31 : }, 32 : ), 33 : ], 34 : ); 35 : 36 : /// 37 : /// 38 : /// 39 0 : @override 40 0 : String format(DateTime value) => DateFormat(dateFormat, locale).format(value); 41 : 42 : /// 43 : /// 44 : /// 45 0 : @override 46 : String strip(String value) => value; 47 : 48 : /// 49 : /// 50 : /// 51 1 : @override 52 1 : bool isValid(String value) => valid(value) == null; 53 : 54 : /// 55 : /// 56 : /// 57 0 : @override 58 : TextInputType get keyboard => TextInputType.datetime; 59 : 60 : /// 61 : /// 62 : /// 63 0 : @override 64 : DateTime? parse(String? text) { 65 0 : if (text == null || text.isEmpty) { 66 : return null; 67 : } else { 68 : try { 69 0 : return DateFormat(dateFormat, locale).parse(text); 70 0 : } on Exception catch (_) { 71 : return null; 72 : } 73 : } 74 : } 75 : 76 : /// 77 : /// 78 : /// 79 0 : @override 80 : String? valid(String value) { 81 0 : if (value.isEmpty) { 82 : return 'Data e Hora inválidas.'; 83 : } 84 : 85 0 : List<String> parts = value.split(' '); 86 : 87 0 : if (parts.length != 2) { 88 : return 'Partes da Data e Hora inválidas.'; 89 : } 90 : 91 0 : return FollyUtils.validDate(parts.first) ?? 92 0 : FollyUtils.validTime(parts.last); 93 : } 94 : }