diff --git a/lib/ui/app/forms/decorated_form_field.dart b/lib/ui/app/forms/decorated_form_field.dart index 575fc7131..eb3dec8b7 100644 --- a/lib/ui/app/forms/decorated_form_field.dart +++ b/lib/ui/app/forms/decorated_form_field.dart @@ -1,6 +1,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; +import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class DecoratedFormField extends StatelessWidget { const DecoratedFormField({ @@ -28,6 +32,8 @@ class DecoratedFormField extends StatelessWidget { this.textAlign = TextAlign.start, this.decoration, this.focusNode, + this.isMoney = false, + this.isPercent = false, }) : super(key: key); final TextEditingController controller; @@ -53,6 +59,8 @@ class DecoratedFormField extends StatelessWidget { final TextAlign textAlign; final InputDecoration decoration; final FocusNode focusNode; + final bool isMoney; + final bool isPercent; @override Widget build(BuildContext context) { @@ -75,10 +83,25 @@ class DecoratedFormField extends StatelessWidget { } else if (label == null) { inputDecoration = null; } else { + var icon = suffixIcon ?? suffixIconButton; + if (icon == null) { + if (isMoney) { + final state = StoreProvider.of(context).state; + icon = Icon(state.company.currencyId == kCurrencyEuro + ? Icons.euro + : Icons.attach_money); + } else if (isPercent) { + icon = Icon( + MdiIcons.percent, + size: 16, + ); + } + } + inputDecoration = InputDecoration( labelText: label, hintText: hint, - suffixIcon: suffixIcon ?? suffixIconButton, + suffixIcon: icon, ); } @@ -89,14 +112,16 @@ class DecoratedFormField extends StatelessWidget { autofocus: autofocus, decoration: inputDecoration, validator: validator, - keyboardType: keyboardType ?? TextInputType.text, + keyboardType: isMoney || isPercent + ? TextInputType.numberWithOptions(decimal: true, signed: true) + : keyboardType ?? TextInputType.text, maxLines: expands ? null : maxLines ?? 1, minLines: expands ? null : minLines, expands: expands, autovalidateMode: autovalidate ? AutovalidateMode.onUserInteraction : AutovalidateMode.disabled, - autocorrect: autocorrect, + autocorrect: isMoney || isPercent ? false : autocorrect, obscureText: obscureText, initialValue: initialValue, textInputAction: textInputAction ?? diff --git a/lib/ui/client/edit/client_edit_settings.dart b/lib/ui/client/edit/client_edit_settings.dart index 6eefca2c4..2b159cf28 100644 --- a/lib/ui/client/edit/client_edit_settings.dart +++ b/lib/ui/client/edit/client_edit_settings.dart @@ -130,7 +130,7 @@ class ClientEditSettingsState extends State { ), DecoratedFormField( controller: _taskRateController, - keyboardType: TextInputType.numberWithOptions(decimal: true), + isMoney: true, label: localization.taskRate, onSavePressed: viewModel.onSavePressed, ), diff --git a/lib/ui/company_gateway/edit/company_gateway_edit.dart b/lib/ui/company_gateway/edit/company_gateway_edit.dart index 5821b146f..2bda74a11 100644 --- a/lib/ui/company_gateway/edit/company_gateway_edit.dart +++ b/lib/ui/company_gateway/edit/company_gateway_edit.dart @@ -626,7 +626,9 @@ class _LimitEditorState extends State { label: localization.minLimit, enabled: _enableMin, controller: _minController, - keyboardType: TextInputType.numberWithOptions(), + keyboardType: TextInputType.numberWithOptions( + decimal: true, signed: true), + autocorrect: false, ), SizedBox(height: 10), CheckboxListTile( @@ -656,7 +658,9 @@ class _LimitEditorState extends State { label: localization.maxLimit, enabled: _enableMax, controller: _maxController, - keyboardType: TextInputType.numberWithOptions(), + keyboardType: TextInputType.numberWithOptions( + decimal: true, signed: true), + autocorrect: false, ), SizedBox(height: 10), CheckboxListTile( @@ -778,23 +782,20 @@ class _FeesEditorState extends State { return FormCard( children: [ - DecoratedFormField( - label: localization.feeAmount, - controller: _amountController, - autocorrect: false, - keyboardType: TextInputType.numberWithOptions(decimal: true), - ), DecoratedFormField( label: localization.feePercent, controller: _percentController, - autocorrect: false, - keyboardType: TextInputType.numberWithOptions(decimal: true), + isPercent: true, + ), + DecoratedFormField( + label: localization.feeAmount, + controller: _amountController, + isMoney: true, ), DecoratedFormField( label: localization.feeCap, controller: _capController, - autocorrect: false, - keyboardType: TextInputType.numberWithOptions(decimal: true), + isMoney: true, ), if (company.enableFirstItemTaxRate) TaxRateDropdown( diff --git a/lib/ui/settings/online_payments.dart b/lib/ui/settings/online_payments.dart index 0b0af0c8a..c15ec2a16 100644 --- a/lib/ui/settings/online_payments.dart +++ b/lib/ui/settings/online_payments.dart @@ -144,6 +144,7 @@ class _OnlinePaymentsState extends State { child: DecoratedFormField( label: localization.minimumUnderPaymentAmount, controller: _minimumAmountController, + isMoney: true, ), ), ]), diff --git a/lib/ui/settings/task_settings.dart b/lib/ui/settings/task_settings.dart index 93f9f5512..9f2de7360 100644 --- a/lib/ui/settings/task_settings.dart +++ b/lib/ui/settings/task_settings.dart @@ -91,9 +91,9 @@ class _TaskSettingsState extends State { children: [ DecoratedFormField( controller: _taskRateController, - keyboardType: TextInputType.numberWithOptions(decimal: true), label: localization.defaultTaskRate, onSavePressed: viewModel.onSavePressed, + isMoney: true, ), if (!viewModel.state.settingsUIState.isFiltered) ...[ SizedBox(height: 32), diff --git a/lib/ui/settings/templates_and_reminders.dart b/lib/ui/settings/templates_and_reminders.dart index 3427ae5cc..d053bbcd6 100644 --- a/lib/ui/settings/templates_and_reminders.dart +++ b/lib/ui/settings/templates_and_reminders.dart @@ -530,12 +530,12 @@ class _ReminderSettingsState extends State { DecoratedFormField( label: localization.lateFeeAmount, controller: _feeAmountController, - keyboardType: TextInputType.numberWithOptions(decimal: true), + isMoney: true, ), DecoratedFormField( label: localization.lateFeePercent, controller: _feePercentController, - keyboardType: TextInputType.numberWithOptions(decimal: true), + isPercent: true, ), ], ), diff --git a/lib/ui/task/edit/task_edit_desktop.dart b/lib/ui/task/edit/task_edit_desktop.dart index cf0eac4cb..4131a6a8b 100644 --- a/lib/ui/task/edit/task_edit_desktop.dart +++ b/lib/ui/task/edit/task_edit_desktop.dart @@ -216,13 +216,15 @@ class _TaskEditDesktopState extends State { DecoratedFormField( controller: _numberController, label: localization.taskNumber, - autocorrect: false, + isMoney: false, ), DecoratedFormField( key: ValueKey('__rate__'), controller: _rateController, label: rateLabel, - keyboardType: TextInputType.number, + keyboardType: TextInputType.numberWithOptions( + decimal: true, signed: true), + autocorrect: false, ), DynamicSelector( key: ValueKey('__task_status_${task.statusId}__'), diff --git a/lib/ui/task/edit/task_edit_details.dart b/lib/ui/task/edit/task_edit_details.dart index a5c52c1a7..b2d54196a 100644 --- a/lib/ui/task/edit/task_edit_details.dart +++ b/lib/ui/task/edit/task_edit_details.dart @@ -173,7 +173,9 @@ class _TaskEditDetailsState extends State { key: ValueKey('__rate__'), controller: _rateController, label: rateLabel, - keyboardType: TextInputType.number, + keyboardType: + TextInputType.numberWithOptions(decimal: true, signed: true), + autocorrect: false, ), DynamicSelector( key: ValueKey('__task_status_${task.statusId}__'), diff --git a/lib/ui/tax_rate/edit/tax_rate_edit.dart b/lib/ui/tax_rate/edit/tax_rate_edit.dart index 2746c99e7..1063e47b1 100644 --- a/lib/ui/tax_rate/edit/tax_rate_edit.dart +++ b/lib/ui/tax_rate/edit/tax_rate_edit.dart @@ -104,11 +104,7 @@ class _TaxRateEditState extends State { DecoratedFormField( label: localization.rate, controller: _rateController, - keyboardType: TextInputType.numberWithOptions(decimal: true), - suffixIcon: Icon( - MdiIcons.percent, - size: 16, - ), + isPercent: true, ), ], )