This commit is contained in:
Hillel Coren 2019-10-27 21:29:33 +02:00
parent e53db97f40
commit 008a146ace
3 changed files with 6 additions and 393 deletions

View File

@ -1,10 +1,8 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/static/static_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart';
import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart';
import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart';
import 'package:invoiceninja_flutter/ui/settings/custom_fields_vm.dart';
import 'package:invoiceninja_flutter/ui/settings/settings_scaffold.dart';
@ -84,7 +82,6 @@ class _CustomFieldsState extends State<CustomFields>
Widget build(BuildContext context) {
final localization = AppLocalization.of(context);
final viewModel = widget.viewModel;
final settings = viewModel.settings;
final state = viewModel.state;
return SettingsScaffold(
@ -96,7 +93,7 @@ class _CustomFieldsState extends State<CustomFields>
isScrollable: true,
tabs: [
Tab(
text: localization.general,
text: localization.company,
),
Tab(
text: localization.clients,
@ -119,64 +116,6 @@ class _CustomFieldsState extends State<CustomFields>
children: <Widget>[
ListView(
children: <Widget>[
FormCard(
children: <Widget>[
InputDecorator(
decoration: InputDecoration(
labelText: localization.numberPadding,
),
child: DropdownButtonHideUnderline(
child: DropdownButton<int>(
value: settings.counterPadding,
isExpanded: true,
isDense: true,
onChanged: (value) => viewModel.onSettingsChanged(
settings.rebuild((b) => b..counterPadding = value)),
items: List<int>.generate(10, (i) => i + 1)
.map((value) => DropdownMenuItem(
child: Text('${'0' * (value - 1)}1'),
value: value,
))
.toList(),
),
),
),
DecoratedFormField(
label: localization.recurringPrefix,
controller: _recurringPrefixController,
),
InputDecorator(
decoration: InputDecoration(
labelText: localization.resetCounter,
),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: settings.resetCounterFrequencyId,
isExpanded: true,
isDense: true,
onChanged: (value) => viewModel.onSettingsChanged(
settings.rebuild(
(b) => b..resetCounterFrequencyId = value)),
items: memoizedFrequencyList(
state.staticState.frequencyMap)
.map((frequencyId) => DropdownMenuItem(
child: Text(state.staticState
.frequencyMap[frequencyId].name),
value: frequencyId,
))
.toList(),
),
),
),
if ((settings.resetCounterFrequencyId ?? '').isNotEmpty)
DatePicker(
labelText: localization.nextReset,
selectedDate: settings.resetCounterDate,
onSelected: (value) => viewModel.onSettingsChanged(
settings.rebuild((b) => b..resetCounterDate = value)),
),
],
),
CustomFieldsSettings(
viewModel: viewModel,
fieldLabel: localization.customCompanyField,
@ -186,7 +125,6 @@ class _CustomFieldsState extends State<CustomFields>
],
),
ListView(children: <Widget>[
EntityNumberSettings(),
CustomFieldsSettings(
viewModel: viewModel,
fieldLabel: localization.customClientField,
@ -197,7 +135,6 @@ class _CustomFieldsState extends State<CustomFields>
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
CustomFieldsSettings(
viewModel: viewModel,
fieldLabel: localization.customInvoiceField,
@ -209,14 +146,12 @@ class _CustomFieldsState extends State<CustomFields>
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
CustomFieldsSettings(
viewModel: viewModel,
fieldLabel: localization.customCreditField,
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
CustomFieldsSettings(
viewModel: viewModel,
fieldLabel: localization.customPaymentField,
@ -228,76 +163,6 @@ class _CustomFieldsState extends State<CustomFields>
}
}
class EntityNumberSettings extends StatefulWidget {
@override
_EntityNumberSettingsState createState() => _EntityNumberSettingsState();
}
class _EntityNumberSettingsState extends State<EntityNumberSettings> {
final _counterController = TextEditingController();
final _patternController = TextEditingController();
List<TextEditingController> _controllers = [];
@override
void dispose() {
_controllers.forEach((dynamic controller) {
controller.removeListener(_onChanged);
controller.dispose();
});
super.dispose();
}
@override
void didChangeDependencies() {
_controllers = [
_counterController,
_patternController,
];
_controllers
.forEach((dynamic controller) => controller.removeListener(_onChanged));
/*
final product = widget.viewModel.product;
_productKeyController.text = product.productKey;
*/
_controllers
.forEach((dynamic controller) => controller.addListener(_onChanged));
super.didChangeDependencies();
}
void _onChanged() {
/*
final product = widget.viewModel.product.rebuild((b) => b
..customValue2 = _custom2Controller.text.trim());
if (product != widget.viewModel.product) {
widget.viewModel.onChanged(product);
}
*/
}
@override
Widget build(BuildContext context) {
final localization = AppLocalization.of(context);
return FormCard(
children: <Widget>[
DecoratedFormField(
label: localization.numberPattern,
controller: _patternController,
),
DecoratedFormField(
label: localization.numberCounter,
controller: _counterController,
),
],
);
}
}
class CustomFieldsSettings extends StatefulWidget {
const CustomFieldsSettings(
{@required this.fieldLabel,

View File

@ -1,6 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/static/static_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart';
@ -88,7 +87,7 @@ class _GeneratedNumbersState extends State<GeneratedNumbers>
final state = viewModel.state;
return SettingsScaffold(
title: localization.customFields,
title: localization.generatedNumbers,
onSavePressed: viewModel.onSavePressed,
appBarBottom: TabBar(
key: ValueKey(state.settingsUIState.updatedAt),
@ -96,7 +95,7 @@ class _GeneratedNumbersState extends State<GeneratedNumbers>
isScrollable: true,
tabs: [
Tab(
text: localization.general,
text: localization.settings,
),
Tab(
text: localization.clients,
@ -177,50 +176,19 @@ class _GeneratedNumbersState extends State<GeneratedNumbers>
),
],
),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customCompanyField,
valueLabel: localization.customCompanyValue,
showValues: true,
),
],
),
ListView(children: <Widget>[
EntityNumberSettings(),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customClientField,
),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customContactField,
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customInvoiceField,
),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customInvoiceSurcharge,
showChargeTaxes: true,
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customCreditField,
),
]),
ListView(children: <Widget>[
EntityNumberSettings(),
GeneratedNumbersSettings(
viewModel: viewModel,
fieldLabel: localization.customPaymentField,
),
]),
],
),
@ -298,226 +266,3 @@ class _EntityNumberSettingsState extends State<EntityNumberSettings> {
}
}
class GeneratedNumbersSettings extends StatefulWidget {
const GeneratedNumbersSettings(
{@required this.fieldLabel,
@required this.viewModel,
this.showChargeTaxes = false,
this.showValues = false,
this.valueLabel});
final GeneratedNumbersVM viewModel;
final String fieldLabel;
final String valueLabel;
final bool showChargeTaxes;
final bool showValues;
@override
_GeneratedNumbersSettingsState createState() => _GeneratedNumbersSettingsState();
}
class _GeneratedNumbersSettingsState extends State<GeneratedNumbersSettings> {
final _customField1Controller = TextEditingController();
final _customField2Controller = TextEditingController();
final _customField3Controller = TextEditingController();
final _customField4Controller = TextEditingController();
final _customValue1Controller = TextEditingController();
final _customValue2Controller = TextEditingController();
final _customValue3Controller = TextEditingController();
final _customValue4Controller = TextEditingController();
List<TextEditingController> _controllers = [];
@override
void dispose() {
_controllers.forEach((dynamic controller) {
controller.removeListener(_onChanged);
controller.dispose();
});
super.dispose();
}
@override
void didChangeDependencies() {
_controllers = [
_customField1Controller,
_customField2Controller,
_customField3Controller,
_customField4Controller,
_customValue1Controller,
_customValue2Controller,
_customValue3Controller,
_customValue4Controller,
];
_controllers
.forEach((dynamic controller) => controller.removeListener(_onChanged));
/*
final product = widget.viewModel.product;
_productKeyController.text = product.productKey;
*/
_controllers
.forEach((dynamic controller) => controller.addListener(_onChanged));
super.didChangeDependencies();
}
void _onChanged() {
/*
final product = widget.viewModel.product.rebuild((b) => b
..customValue2 = _custom2Controller.text.trim());
if (product != widget.viewModel.product) {
widget.viewModel.onChanged(product);
}
*/
}
@override
Widget build(BuildContext context) {
final viewModel = widget.viewModel;
final company = viewModel.company;
return FormCard(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: CustomFormField(
label: widget.fieldLabel,
controller: _customField1Controller,
showTaxes: widget.showChargeTaxes,
taxesEnabled: company.enableCustomSurchargeTaxes1,
onTaxesChanged: (value) => viewModel.onCompanyChanged(company
.rebuild((b) => b..enableCustomSurchargeTaxes1 = value)),
),
),
if (widget.showValues) ...[
SizedBox(width: kGutterWidth),
Expanded(
child: CustomFormField(
label: widget.valueLabel,
controller: _customValue1Controller,
),
),
]
],
),
Row(
children: <Widget>[
Expanded(
child: CustomFormField(
label: widget.fieldLabel,
controller: _customField2Controller,
showTaxes: widget.showChargeTaxes,
taxesEnabled: company.enableCustomSurchargeTaxes2,
onTaxesChanged: (value) => viewModel.onCompanyChanged(company
.rebuild((b) => b..enableCustomSurchargeTaxes2 = value)),
),
),
if (widget.showValues) ...[
SizedBox(width: kGutterWidth),
Expanded(
child: CustomFormField(
label: widget.valueLabel,
controller: _customValue2Controller,
),
),
]
],
),
Row(
children: <Widget>[
Expanded(
child: CustomFormField(
label: widget.fieldLabel,
controller: _customField3Controller,
showTaxes: widget.showChargeTaxes,
taxesEnabled: company.enableCustomSurchargeTaxes3,
onTaxesChanged: (value) => viewModel.onCompanyChanged(company
.rebuild((b) => b..enableCustomSurchargeTaxes3 = value)),
),
),
if (widget.showValues) ...[
SizedBox(width: kGutterWidth),
Expanded(
child: CustomFormField(
label: widget.valueLabel,
controller: _customValue3Controller,
),
),
]
],
),
Row(
children: <Widget>[
Expanded(
child: CustomFormField(
label: widget.fieldLabel,
controller: _customField4Controller,
showTaxes: widget.showChargeTaxes,
taxesEnabled: company.enableCustomSurchargeTaxes4,
onTaxesChanged: (value) => viewModel.onCompanyChanged(company
.rebuild((b) => b..enableCustomSurchargeTaxes4 = value)),
),
),
if (widget.showValues) ...[
SizedBox(width: kGutterWidth),
Expanded(
child: CustomFormField(
label: widget.valueLabel,
controller: _customValue4Controller,
),
),
]
],
),
],
);
}
}
class CustomFormField extends StatelessWidget {
const CustomFormField({
@required this.label,
@required this.controller,
this.showTaxes = false,
this.taxesEnabled,
this.onTaxesChanged,
});
final String label;
final TextEditingController controller;
final bool showTaxes;
final bool taxesEnabled;
final Function(bool) onTaxesChanged;
@override
Widget build(BuildContext context) {
final localization = AppLocalization.of(context);
return Row(
children: <Widget>[
Expanded(
child: DecoratedFormField(
label: label,
controller: controller,
),
),
if (showTaxes) ...[
Checkbox(
activeColor: Theme.of(context).accentColor,
value: taxesEnabled ?? false,
onChanged: onTaxesChanged,
),
GestureDetector(
child: Text(localization.chargeTaxes),
onTap: () => onTaxesChanged(!taxesEnabled),
),
]
],
);
}
}

View File

@ -14,6 +14,7 @@ abstract class LocaleCodeAware {
mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _localizedValues = {
'en': {
'company': 'Company',
'generated_numbers': 'Generated Numbers',
'charge_taxes': 'Charge Taxes',
'credit': 'Credit',
@ -15207,6 +15208,8 @@ mixin LocalizationsProvider on LocaleCodeAware {
String get generatedNumbers => _localizedValues[localeCode]['generated_numbers'];
String get company => _localizedValues[localeCode]['company'];
String lookup(String key) {
final lookupKey = toSnakeCase(key);
return _localizedValues[localeCode][lookupKey] ??