Skip to content

Commit 3abe340

Browse files
committed
feat: added text_input_formatters
1 parent f9ac90b commit 3abe340

File tree

11 files changed

+348
-3
lines changed

11 files changed

+348
-3
lines changed

.dart_tool/package_config.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,12 @@
355355
"packageUri": "lib/",
356356
"languageVersion": "2.19"
357357
},
358+
{
359+
"name": "mask_text_input_formatter",
360+
"rootUri": "file:///Users/kishor/.pub-cache/hosted/pub.dev/mask_text_input_formatter-2.5.0",
361+
"packageUri": "lib/",
362+
"languageVersion": "2.12"
363+
},
358364
{
359365
"name": "matcher",
360366
"rootUri": "file:///Users/kishor/.pub-cache/hosted/pub.dev/matcher-0.12.16",
@@ -572,7 +578,7 @@
572578
"languageVersion": "3.0"
573579
}
574580
],
575-
"generated": "2023-10-16T10:49:55.061202Z",
581+
"generated": "2023-10-17T14:31:32.514003Z",
576582
"generator": "pub",
577583
"generatorVersion": "3.1.3"
578584
}

.dart_tool/package_config_subset

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ logging
226226
2.19
227227
file:///Users/kishor/.pub-cache/hosted/pub.dev/logging-1.2.0/
228228
file:///Users/kishor/.pub-cache/hosted/pub.dev/logging-1.2.0/lib/
229+
mask_text_input_formatter
230+
2.12
231+
file:///Users/kishor/.pub-cache/hosted/pub.dev/mask_text_input_formatter-2.5.0/
232+
file:///Users/kishor/.pub-cache/hosted/pub.dev/mask_text_input_formatter-2.5.0/lib/
229233
matcher
230234
2.18
231235
file:///Users/kishor/.pub-cache/hosted/pub.dev/matcher-0.12.16/

.flutter-plugins-dependencies

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.8/","native_build":true,"dependencies":[]}],"android":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kishor/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_android-0.8.7+4/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]}],"macos":[{"name":"file_selector_macos","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.3+1/","native_build":true,"dependencies":[]},{"name":"image_picker_macos","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1/","native_build":false,"dependencies":["file_selector_macos"]}],"linux":[{"name":"file_selector_linux","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.2/","native_build":true,"dependencies":[]},{"name":"image_picker_linux","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1/","native_build":false,"dependencies":["file_selector_linux"]}],"windows":[{"name":"file_selector_windows","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3/","native_build":true,"dependencies":[]},{"name":"image_picker_windows","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1/","native_build":false,"dependencies":["file_selector_windows"]}],"web":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","dependencies":[]},{"name":"image_picker_for_web","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.0/","dependencies":[]}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_selector_linux","dependencies":[]},{"name":"file_selector_macos","dependencies":[]},{"name":"file_selector_windows","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios","image_picker_linux","image_picker_macos","image_picker_windows"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"image_picker_linux","dependencies":["file_selector_linux"]},{"name":"image_picker_macos","dependencies":["file_selector_macos"]},{"name":"image_picker_windows","dependencies":["file_selector_windows"]}],"date_created":"2023-10-16 16:34:55.130765","version":"3.13.7"}
1+
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.8/","native_build":true,"dependencies":[]}],"android":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/kishor/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.15/","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_android-0.8.7+4/","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]}],"macos":[{"name":"file_selector_macos","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.3+1/","native_build":true,"dependencies":[]},{"name":"image_picker_macos","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1/","native_build":false,"dependencies":["file_selector_macos"]}],"linux":[{"name":"file_selector_linux","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.2/","native_build":true,"dependencies":[]},{"name":"image_picker_linux","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1/","native_build":false,"dependencies":["file_selector_linux"]}],"windows":[{"name":"file_selector_windows","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_selector_windows-0.9.3/","native_build":true,"dependencies":[]},{"name":"image_picker_windows","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1/","native_build":false,"dependencies":["file_selector_windows"]}],"web":[{"name":"file_picker","path":"/Users/kishor/.pub-cache/hosted/pub.dev/file_picker-6.0.0/","dependencies":[]},{"name":"image_picker_for_web","path":"/Users/kishor/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.0/","dependencies":[]}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_selector_linux","dependencies":[]},{"name":"file_selector_macos","dependencies":[]},{"name":"file_selector_windows","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios","image_picker_linux","image_picker_macos","image_picker_windows"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"image_picker_linux","dependencies":["file_selector_linux"]},{"name":"image_picker_macos","dependencies":["file_selector_macos"]},{"name":"image_picker_windows","dependencies":["file_selector_windows"]}],"date_created":"2023-10-17 20:16:32.581345","version":"3.13.7"}

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 1.2.17
2+
- added text_input_formatters
3+
14
# 1.2.16
25
- BREAKING CHANGES
36
- renamed `removeNextLine` to `replaceEscaped`

lib/fp_util.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export 'src/dialogs/dialogs.dart';
55
export 'src/extensions/extensions.dart';
66
export 'src/form/form.dart';
77
export 'src/helpers/image_picker_helper.dart';
8+
export 'src/input_formatters/input_formatters.dart';
89
export 'src/logger/logger.dart';
910
export 'src/responsive/responsive.dart';
1011
export 'src/snackbars/snackbars.dart';
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import 'package:flutter/services.dart';
2+
import 'package:fp_util/fp_util.dart';
3+
4+
/// {@template upper_case_text_formatter}
5+
/// A [TextInputFormatter] that formats text to upper case.
6+
/// {@endtemplate}
7+
class UpperCaseTextFormatter extends TextInputFormatter {
8+
/// {@macro upper_case_text_formatter}
9+
const UpperCaseTextFormatter();
10+
11+
@override
12+
TextEditingValue formatEditUpdate(
13+
TextEditingValue oldValue, TextEditingValue newValue) {
14+
return TextEditingValue(
15+
text: newValue.text.toUpperCase(),
16+
selection: newValue.selection,
17+
);
18+
}
19+
}
20+
21+
/// {@template lower_case_text_formatter}
22+
/// A [TextInputFormatter] that formats text to lower case.
23+
/// {@endtemplate}
24+
class LowerCaseTextFormatter extends TextInputFormatter {
25+
/// {@macro lower_case_text_formatter}
26+
const LowerCaseTextFormatter();
27+
28+
@override
29+
TextEditingValue formatEditUpdate(
30+
TextEditingValue oldValue, TextEditingValue newValue) {
31+
return TextEditingValue(
32+
text: newValue.text.toLowerCase(),
33+
selection: newValue.selection,
34+
);
35+
}
36+
}
37+
38+
/// {@template sentence_case_text_formatter}
39+
/// A [TextInputFormatter] that formats text to sentence case.
40+
/// {@endtemplate}
41+
class SentenceCaseTextFormatter extends TextInputFormatter {
42+
/// {@macro sentence_case_text_formatter}
43+
const SentenceCaseTextFormatter();
44+
45+
@override
46+
TextEditingValue formatEditUpdate(
47+
TextEditingValue oldValue, TextEditingValue newValue) {
48+
return TextEditingValue(
49+
text: newValue.text.sentenceCase,
50+
selection: newValue.selection,
51+
);
52+
}
53+
}
54+
55+
/// {@template title_case_text_formatter}
56+
/// A [TextInputFormatter] that formats text to title case.
57+
/// {@endtemplate}
58+
class TitleCaseTextFormatter extends TextInputFormatter {
59+
/// {@macro title_case_text_formatter}
60+
const TitleCaseTextFormatter();
61+
62+
@override
63+
TextEditingValue formatEditUpdate(
64+
TextEditingValue oldValue, TextEditingValue newValue) {
65+
return TextEditingValue(
66+
text: newValue.text.titleCase,
67+
selection: newValue.selection,
68+
);
69+
}
70+
}
71+
72+
/// {@template capitalize_case_text_formatter}
73+
/// A [TextInputFormatter] that formats text to capitalize case.
74+
/// {@endtemplate}
75+
class CapitalizeCaseTextFormatter extends TextInputFormatter {
76+
/// {@macro capitalize_case_text_formatter}
77+
const CapitalizeCaseTextFormatter();
78+
79+
@override
80+
TextEditingValue formatEditUpdate(
81+
TextEditingValue oldValue, TextEditingValue newValue) {
82+
return TextEditingValue(
83+
text: newValue.text.capitalize,
84+
selection: newValue.selection,
85+
);
86+
}
87+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export 'case_text_formatters.dart';
2+
export 'masked_text_formatter.dart';
3+
export 'no_space_text_formatter.dart';
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
2+
3+
/// {@template masked_text_formatter}
4+
/// A [TextInputFormatter] that formats text using [MaskTextInputFormatter].
5+
/// {@endtemplate}
6+
class MaskedTextFormatter extends MaskTextInputFormatter {
7+
MaskedTextFormatter._(
8+
String mask, {
9+
Map<String, RegExp>? filter,
10+
String? initialText,
11+
MaskAutoCompletionType maskType = MaskAutoCompletionType.lazy,
12+
}) : super(
13+
mask: mask,
14+
filter: filter,
15+
initialText: initialText,
16+
type: maskType,
17+
);
18+
19+
/// Creates a formatter that formats text using [MaskTextInputFormatter].
20+
/// if [filter] is null then it uses default filter of [MaskTextInputFormatter].
21+
factory MaskedTextFormatter.custom({
22+
required String mask,
23+
Map<String, RegExp>? filter,
24+
String? initialText,
25+
bool lazy = true,
26+
}) =>
27+
MaskedTextFormatter._(
28+
mask,
29+
filter: filter,
30+
initialText: initialText,
31+
maskType:
32+
lazy ? MaskAutoCompletionType.lazy : MaskAutoCompletionType.eager,
33+
);
34+
35+
/// Creates a formatter that formats phone numbers.
36+
factory MaskedTextFormatter.phone(
37+
{String mask = '+# (###) ### ####', String? initialText}) =>
38+
MaskedTextFormatter._(
39+
mask,
40+
filter: {'#': RegExp(r'[0-9]')},
41+
initialText: initialText,
42+
);
43+
44+
/// Creates a formatter that formats central provident fund numbers.
45+
factory MaskedTextFormatter.cpf({String? initialText}) =>
46+
MaskedTextFormatter._(
47+
'###.###.###-##',
48+
filter: {'#': RegExp(r'[0-9]')},
49+
initialText: initialText,
50+
);
51+
52+
/// Creates a formatter that formats date.
53+
factory MaskedTextFormatter.date({String? initialText}) =>
54+
MaskedTextFormatter._(
55+
'##/##/####',
56+
filter: {'#': RegExp(r'[0-9]')},
57+
initialText: initialText,
58+
);
59+
60+
/// Creates a formatter that formats time.
61+
factory MaskedTextFormatter.time({String? initialText}) =>
62+
MaskedTextFormatter._(
63+
'##:##',
64+
filter: {'#': RegExp(r'[0-9]')},
65+
initialText: initialText,
66+
);
67+
68+
/// Creates a formatter that formats date and time.
69+
factory MaskedTextFormatter.dateTime({String? initialText}) =>
70+
MaskedTextFormatter._(
71+
'##/##/#### ##:##',
72+
filter: {'#': RegExp(r'[0-9]')},
73+
initialText: initialText,
74+
);
75+
76+
/// Creates a formatter that formats credit/debit card numbers.
77+
factory MaskedTextFormatter.card({String? initialText}) =>
78+
MaskedTextFormatter._(
79+
'#### #### #### ####',
80+
filter: {'#': RegExp(r'[0-9]')},
81+
initialText: initialText,
82+
);
83+
84+
/// Creates a formatter that formats credit/debit card expiry dates.
85+
factory MaskedTextFormatter.cardExpirationDate({String? initialText}) =>
86+
MaskedTextFormatter._(
87+
'##/##',
88+
filter: {'#': RegExp(r'[0-9]')},
89+
initialText: initialText,
90+
);
91+
92+
/// Creates a formatter that formats credit/debit card cvv number.
93+
factory MaskedTextFormatter.cardCVV({String? initialText}) =>
94+
MaskedTextFormatter._(
95+
'###',
96+
filter: {'#': RegExp(r'[0-9]')},
97+
initialText: initialText,
98+
);
99+
100+
/// Creates a formatter that formats money.
101+
factory MaskedTextFormatter.money({
102+
String mask = 'R\$ #.##0,00',
103+
String? initialText,
104+
}) =>
105+
MaskedTextFormatter._(
106+
mask,
107+
filter: {'#': RegExp(r'[0-9]')},
108+
initialText: initialText,
109+
);
110+
111+
/// Creates a formatter that formats australian business number.
112+
factory MaskedTextFormatter.abn({String? initialText}) =>
113+
MaskedTextFormatter._(
114+
'## ### ### ###',
115+
filter: {'#': RegExp(r'[0-9]')},
116+
initialText: initialText,
117+
);
118+
119+
/// Creates a formatter that formats australian company number.
120+
factory MaskedTextFormatter.acn({String? initialText}) =>
121+
MaskedTextFormatter._(
122+
'### ### ###',
123+
filter: {'#': RegExp(r'[0-9]')},
124+
initialText: initialText,
125+
);
126+
127+
/// Creates a formatter that formats social security number.
128+
factory MaskedTextFormatter.ssn({String? initialText}) =>
129+
MaskedTextFormatter._(
130+
'###-##-####',
131+
filter: {'#': RegExp(r'[0-9]')},
132+
initialText: initialText,
133+
);
134+
135+
/// Creates a formatter that formats social insurance numbers.
136+
factory MaskedTextFormatter.sin({String? initialText}) =>
137+
MaskedTextFormatter._(
138+
'###-###-###',
139+
filter: {'#': RegExp(r'[0-9]')},
140+
initialText: initialText,
141+
);
142+
143+
/// Creates a formatter that formats bank state branch numbers.
144+
factory MaskedTextFormatter.bsb({String? initialText}) =>
145+
MaskedTextFormatter._(
146+
'###-###',
147+
filter: {'#': RegExp(r'[0-9]')},
148+
initialText: initialText,
149+
);
150+
151+
/// Creates a formatter that formats sort codes.
152+
factory MaskedTextFormatter.sortCode({String? initialText}) =>
153+
MaskedTextFormatter._(
154+
'##-##-##',
155+
filter: {'#': RegExp(r'[0-9]')},
156+
initialText: initialText,
157+
);
158+
159+
/// Creates a formatter that formats swift codes.
160+
factory MaskedTextFormatter.swiftCode(
161+
{String mask = '######## ###', String? initialText}) =>
162+
MaskedTextFormatter._(
163+
mask,
164+
filter: {'#': RegExp(r'[A-Z0-9]')},
165+
initialText: initialText,
166+
);
167+
168+
/// Creates a formatter that formats imei numbers.
169+
factory MaskedTextFormatter.imei({String? initialText}) =>
170+
MaskedTextFormatter._(
171+
'##-####-#######-#',
172+
filter: {'#': RegExp(r'[0-9]')},
173+
initialText: initialText,
174+
);
175+
176+
/// Creates a formatter that formats isbn numbers.
177+
factory MaskedTextFormatter.isbn({String? initialText}) =>
178+
MaskedTextFormatter._(
179+
'###-##-#####-##-#',
180+
filter: {'#': RegExp(r'[0-9]')},
181+
initialText: initialText,
182+
);
183+
184+
/// Creates a formatter that formats mac addresses.
185+
factory MaskedTextFormatter.macAddress({String? initialText}) =>
186+
MaskedTextFormatter._(
187+
'##:##:##:##:##:##',
188+
filter: {'#': RegExp(r'[0-9a-fA-F]')},
189+
initialText: initialText,
190+
);
191+
192+
/// Creates a formatter that formats ipv4 addresses.
193+
factory MaskedTextFormatter.ipv4({String? initialText}) =>
194+
MaskedTextFormatter._(
195+
'###.###.###.###',
196+
filter: {'#': RegExp(r'[0-9]')},
197+
initialText: initialText,
198+
);
199+
200+
/// Creates a formatter that formats ipv6 addresses.
201+
factory MaskedTextFormatter.ipv6({String? initialText}) =>
202+
MaskedTextFormatter._(
203+
'####:####:####:####:####:####:####:####',
204+
filter: {'#': RegExp(r'[0-9a-fA-F]')},
205+
initialText: initialText,
206+
);
207+
208+
/// Creates a formatter that formats color hex code.
209+
factory MaskedTextFormatter.colorHex({String? initialText}) =>
210+
MaskedTextFormatter._(
211+
'#******',
212+
filter: {'*': RegExp(r'[0-9a-fA-F]')},
213+
initialText: initialText,
214+
);
215+
216+
/// Creates a formatter that formats hexadecimal numbers.
217+
factory MaskedTextFormatter.hex({String? initialText}) =>
218+
MaskedTextFormatter._(
219+
'########',
220+
filter: {'#': RegExp(r'[0-9a-fA-F]')},
221+
initialText: initialText,
222+
);
223+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:flutter/services.dart';
2+
3+
/// {@template no_space_text_formatter}
4+
/// A [TextInputFormatter] that filters out spaces.
5+
/// {@endtemplate}
6+
class NoSpaceTextFormatter extends FilteringTextInputFormatter {
7+
NoSpaceTextFormatter() : super.allow(RegExp(r'[^\s]+'));
8+
}

pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,14 @@ packages:
467467
url: "https://pub.dev"
468468
source: hosted
469469
version: "1.2.0"
470+
mask_text_input_formatter:
471+
dependency: "direct main"
472+
description:
473+
name: mask_text_input_formatter
474+
sha256: "2056a9b8303f71003b9c06c6f71443504f3ca9f4b79b1aa40c9f0f62f9d312cf"
475+
url: "https://pub.dev"
476+
source: hosted
477+
version: "2.5.0"
470478
matcher:
471479
dependency: transitive
472480
description:

0 commit comments

Comments
 (0)