Settings
This commit is contained in:
parent
6a065b01ee
commit
11e8fa59fe
|
|
@ -243,3 +243,29 @@ const List<String> kLanguages = [
|
|||
'tr_TR',
|
||||
'bg',
|
||||
];
|
||||
|
||||
const kDaysOfTheWeek = {
|
||||
0: 'sunday',
|
||||
1: 'monday',
|
||||
2: 'tuesday',
|
||||
3: 'wednesday',
|
||||
4: 'thursday',
|
||||
5: 'friday',
|
||||
6: 'saturday',
|
||||
};
|
||||
|
||||
const kMonthsOfTheYear = {
|
||||
0: 'january',
|
||||
1: 'february',
|
||||
2: 'march',
|
||||
3: 'april',
|
||||
4: 'may',
|
||||
5: 'june',
|
||||
6: 'july',
|
||||
7: 'august',
|
||||
8: 'september',
|
||||
9: 'october',
|
||||
10: 'november',
|
||||
11: 'december',
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -536,17 +536,14 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'show_tasks_in_portal')
|
||||
bool get showTasksInPortal;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'invoice_terms')
|
||||
String get defaultInvoiceTerms;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'invoice_taxes')
|
||||
bool get enableInvoiceTaxes;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'invoice_item_taxes')
|
||||
bool get enableInvoiceItemTaxes;
|
||||
|
|
@ -559,37 +556,30 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'quote_design_id')
|
||||
String get defaultQuoteDesignId;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'invoice_footer')
|
||||
String get defaultInvoiceFooter;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'show_item_taxes')
|
||||
bool get showInvoiceItemTaxes;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'tax_name1')
|
||||
String get defaultTaxName1;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'tax_rate1_HIDDEN')
|
||||
double get defaultTaxRate1;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'tax_name2')
|
||||
String get defaultTaxName2;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'tax_rate2_HIDDEN')
|
||||
double get defaultTaxRate2;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'quote_terms')
|
||||
String get defaultQuoteTerms;
|
||||
|
|
@ -598,17 +588,14 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'show_currency_code')
|
||||
bool get showCurrencyCode;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'enable_second_tax_rate')
|
||||
bool get enableSecondTaxRate;
|
||||
|
||||
// TODO change to int/remove nullable
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'payment_terms_HIDDEN')
|
||||
int get defaultPaymentTerms;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'payment_type_id')
|
||||
String get defaultPaymentTypeId;
|
||||
|
|
@ -621,7 +608,6 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'inclusive_taxes')
|
||||
bool get enableInclusiveTaxes;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'convert_products')
|
||||
bool get convertProductExchangeRate;
|
||||
|
|
@ -634,37 +620,30 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'custom_invoice_taxes2')
|
||||
bool get enableCustomInvoiceTaxes2;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'custom_payment_terms')
|
||||
BuiltList<PaymentTermEntity> get customPaymentTerms;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'invoice_fields')
|
||||
String get invoiceFields;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_footer')
|
||||
String get emailFooter;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_invoice')
|
||||
String get emailSubjectInvoice;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_quote')
|
||||
String get emailSubjectQuote;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_payment')
|
||||
String get emailSubjectPayment;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_template_invoice')
|
||||
String get emailBodyInvoice;
|
||||
|
|
@ -674,37 +653,30 @@ abstract class SettingsEntity
|
|||
@BuiltValueField(wireName: 'email_template_quote')
|
||||
String get emailBodyQuote;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_template_payment')
|
||||
String get emailBodyPayment;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_reminder1')
|
||||
String get emailSubjectReminder1;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_reminder2')
|
||||
String get emailSubjectReminder2;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_subject_reminder3')
|
||||
String get emailSubjectReminder3;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_template_reminder1')
|
||||
String get emailBodyReminder1;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_template_reminder2')
|
||||
String get emailBodyReminder2;
|
||||
|
||||
// TODO remove this
|
||||
@nullable
|
||||
@BuiltValueField(wireName: 'email_template_reminder3')
|
||||
String get emailBodyReminder3;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:invoiceninja_flutter/data/models/entities.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:invoiceninja_flutter/constants.dart';
|
||||
import 'package:invoiceninja_flutter/data/models/entities.dart';
|
||||
import 'package:invoiceninja_flutter/redux/static/static_selectors.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart';
|
||||
|
|
@ -73,6 +74,7 @@ class _LocalizationSettingsState extends State<LocalizationSettings> {
|
|||
final viewModel = widget.viewModel;
|
||||
final state = viewModel.state;
|
||||
final settings = viewModel.settings;
|
||||
final company = viewModel.company;
|
||||
|
||||
return SettingsScaffold(
|
||||
title: localization.localization,
|
||||
|
|
@ -89,46 +91,48 @@ class _LocalizationSettingsState extends State<LocalizationSettings> {
|
|||
labelText: localization.currency,
|
||||
initialValue:
|
||||
state.staticState.currencyMap[settings.currencyId]?.name,
|
||||
onSelected: (SelectableEntity currency) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..currencyId = currency.id)),
|
||||
onSelected: (SelectableEntity currency) =>
|
||||
viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..currencyId = currency.id)),
|
||||
),
|
||||
SizedBox(height: 12),
|
||||
Row(
|
||||
children: <Widget>[
|
||||
Radio(
|
||||
value: false,
|
||||
groupValue: settings.showCurrencyCode,
|
||||
activeColor: Theme.of(context).accentColor,
|
||||
onChanged: (bool value) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = false)),
|
||||
),
|
||||
GestureDetector(
|
||||
child: Text('${localization.symbol}: ' +
|
||||
formatNumber(1000, context,
|
||||
showCurrencyCode: false,
|
||||
currencyId: settings.currencyId)),
|
||||
onTap: () => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = false)),
|
||||
),
|
||||
SizedBox(width: 10),
|
||||
Radio(
|
||||
value: true,
|
||||
groupValue: settings.showCurrencyCode,
|
||||
activeColor: Theme.of(context).accentColor,
|
||||
onChanged: (bool value) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = true)),
|
||||
),
|
||||
GestureDetector(
|
||||
child: Text('${localization.code}: ' +
|
||||
formatNumber(1000, context,
|
||||
showCurrencyCode: true,
|
||||
currencyId: settings.currencyId)),
|
||||
onTap: () => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = true)),
|
||||
),
|
||||
],
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 10, bottom: 20),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Radio(
|
||||
value: false,
|
||||
groupValue: settings.showCurrencyCode,
|
||||
activeColor: Theme.of(context).accentColor,
|
||||
onChanged: (bool value) => viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = false)),
|
||||
),
|
||||
GestureDetector(
|
||||
child: Text('${localization.symbol}: ' +
|
||||
formatNumber(1000, context,
|
||||
showCurrencyCode: false,
|
||||
currencyId: settings.currencyId)),
|
||||
onTap: () => viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = false)),
|
||||
),
|
||||
SizedBox(width: 10),
|
||||
Radio(
|
||||
value: true,
|
||||
groupValue: settings.showCurrencyCode,
|
||||
activeColor: Theme.of(context).accentColor,
|
||||
onChanged: (bool value) => viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = true)),
|
||||
),
|
||||
GestureDetector(
|
||||
child: Text('${localization.code}: ' +
|
||||
formatNumber(1000, context,
|
||||
showCurrencyCode: true,
|
||||
currencyId: settings.currencyId)),
|
||||
onTap: () => viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..showCurrencyCode = true)),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
EntityDropdown(
|
||||
key: ValueKey('__language_${settings.languageId}'),
|
||||
entityType: EntityType.language,
|
||||
|
|
@ -137,8 +141,9 @@ class _LocalizationSettingsState extends State<LocalizationSettings> {
|
|||
labelText: localization.language,
|
||||
initialValue:
|
||||
state.staticState.languageMap[settings.languageId]?.name,
|
||||
onSelected: (SelectableEntity language) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..languageId = language.id)),
|
||||
onSelected: (SelectableEntity language) =>
|
||||
viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..languageId = language.id)),
|
||||
),
|
||||
EntityDropdown(
|
||||
key: ValueKey('__timezone_${settings.timezoneId}'),
|
||||
|
|
@ -147,9 +152,10 @@ class _LocalizationSettingsState extends State<LocalizationSettings> {
|
|||
entityList: memoizedTimezoneList(state.staticState.timezoneMap),
|
||||
labelText: localization.timezone,
|
||||
initialValue:
|
||||
state.staticState.timezoneMap[settings.timezoneId]?.name,
|
||||
onSelected: (SelectableEntity timezone) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..timezoneId = timezone.id)),
|
||||
state.staticState.timezoneMap[settings.timezoneId]?.name,
|
||||
onSelected: (SelectableEntity timezone) =>
|
||||
viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..timezoneId = timezone.id)),
|
||||
),
|
||||
EntityDropdown(
|
||||
key: ValueKey('__date_format_${settings.dateFormatId}'),
|
||||
|
|
@ -158,9 +164,69 @@ class _LocalizationSettingsState extends State<LocalizationSettings> {
|
|||
entityList: memoizedDateFormatList(state.staticState.dateFormatMap),
|
||||
labelText: localization.dateFormat,
|
||||
initialValue:
|
||||
state.staticState.dateFormatMap[settings.dateFormatId]?.preview,
|
||||
onSelected: (SelectableEntity dateFormat) => viewModel.onChanged(
|
||||
settings.rebuild((b) => b..dateFormatId = dateFormat.id)),
|
||||
state.staticState.dateFormatMap[settings.dateFormatId]?.preview,
|
||||
onSelected: (SelectableEntity dateFormat) =>
|
||||
viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..dateFormatId = dateFormat.id)),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 10, bottom: 20),
|
||||
child: CheckboxListTile(
|
||||
title: Text(localization.militaryTime),
|
||||
value: settings.enableMilitaryTime,
|
||||
activeColor: Theme.of(context).accentColor,
|
||||
controlAffinity: ListTileControlAffinity.leading,
|
||||
onChanged: (value) => viewModel.onSettingsChanged(
|
||||
settings.rebuild((b) => b..enableMilitaryTime = value)),
|
||||
),
|
||||
),
|
||||
InputDecorator(
|
||||
decoration: InputDecoration(
|
||||
labelText: localization.firstDayOfTheWeek,
|
||||
),
|
||||
isEmpty: company.startOfWeek == null,
|
||||
child: DropdownButtonHideUnderline(
|
||||
child: DropdownButton<int>(
|
||||
value: company.startOfWeek,
|
||||
isExpanded: true,
|
||||
isDense: true,
|
||||
onChanged: (value) => viewModel.onCompanyChanged(
|
||||
company.rebuild((b) => b..startOfWeek = value)),
|
||||
items: kDaysOfTheWeek
|
||||
.map(
|
||||
(id, day) => MapEntry<int, DropdownMenuItem<int>>(
|
||||
id,
|
||||
DropdownMenuItem<int>(
|
||||
child: Text(localization.lookup(day)),
|
||||
value: id,
|
||||
)))
|
||||
.values
|
||||
.toList()),
|
||||
),
|
||||
),
|
||||
InputDecorator(
|
||||
decoration: InputDecoration(
|
||||
labelText: localization.firstMonthOfTheYear,
|
||||
),
|
||||
isEmpty: company.financialYearStart == null,
|
||||
child: DropdownButtonHideUnderline(
|
||||
child: DropdownButton<int>(
|
||||
value: company.financialYearStart,
|
||||
isExpanded: true,
|
||||
isDense: true,
|
||||
onChanged: (value) => viewModel.onCompanyChanged(
|
||||
company.rebuild((b) => b..financialYearStart = value)),
|
||||
items: kMonthsOfTheYear
|
||||
.map(
|
||||
(id, month) => MapEntry<int, DropdownMenuItem<int>>(
|
||||
id,
|
||||
DropdownMenuItem<int>(
|
||||
child: Text(localization.lookup(month)),
|
||||
value: id,
|
||||
)))
|
||||
.values
|
||||
.toList()),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -34,8 +34,10 @@ class LocalizationScreen extends StatelessWidget {
|
|||
class LocalizationSettingsVM {
|
||||
LocalizationSettingsVM({
|
||||
@required this.state,
|
||||
@required this.company,
|
||||
@required this.settings,
|
||||
@required this.onChanged,
|
||||
@required this.onSettingsChanged,
|
||||
@required this.onCompanyChanged,
|
||||
@required this.onSavePressed,
|
||||
@required this.onCancelPressed,
|
||||
});
|
||||
|
|
@ -46,9 +48,12 @@ class LocalizationSettingsVM {
|
|||
return LocalizationSettingsVM(
|
||||
state: state,
|
||||
settings: state.uiState.settingsUIState.settings,
|
||||
onChanged: (settings) {
|
||||
company: state.uiState.settingsUIState.userCompany.company,
|
||||
onSettingsChanged: (settings) {
|
||||
store.dispatch(UpdateSettings(settings: settings));
|
||||
},
|
||||
onCompanyChanged: (company) =>
|
||||
store.dispatch(UpdateCompany(company: company)),
|
||||
onCancelPressed: (context) => store.dispatch(ResetSettings()),
|
||||
onSavePressed: (context) {
|
||||
final settingsUIState = state.uiState.settingsUIState;
|
||||
|
|
@ -73,8 +78,10 @@ class LocalizationSettingsVM {
|
|||
}
|
||||
|
||||
final AppState state;
|
||||
final CompanyEntity company;
|
||||
final SettingsEntity settings;
|
||||
final Function(SettingsEntity) onChanged;
|
||||
final Function(CompanyEntity) onCompanyChanged;
|
||||
final Function(SettingsEntity) onSettingsChanged;
|
||||
final Function(BuildContext) onSavePressed;
|
||||
final Function(BuildContext) onCancelPressed;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:invoiceninja_flutter/data/models/entities.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
|
||||
|
|
|
|||
|
|
@ -14,6 +14,27 @@ abstract class LocaleCodeAware {
|
|||
mixin LocalizationsProvider on LocaleCodeAware {
|
||||
static final Map<String, Map<String, String>> _localizedValues = {
|
||||
'en': {
|
||||
'first_day_of_the_week': 'First day of the week',
|
||||
'first_month_of_the_year': 'First month of the year',
|
||||
'sunday': 'Sunday',
|
||||
'monday': 'Monday',
|
||||
'tuesday': 'Tuesday',
|
||||
'wednesday': 'Wednesday',
|
||||
'thursday': 'Thursday',
|
||||
'friday': 'Friday',
|
||||
'saturday': 'Saturday',
|
||||
'january': 'January',
|
||||
'february': 'February',
|
||||
'march': 'March',
|
||||
'april': 'April',
|
||||
'may': 'May',
|
||||
'june': 'June',
|
||||
'july': 'July',
|
||||
'august': 'August',
|
||||
'september': 'September',
|
||||
'october': 'October',
|
||||
'november': 'November',
|
||||
'december': 'December',
|
||||
'symbol': 'Symbol',
|
||||
'ocde': 'Code',
|
||||
'date_format': 'Date Format',
|
||||
|
|
@ -14655,6 +14676,7 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
|||
_localizedValues[localeCode]['long_press_multiselect'];
|
||||
|
||||
String get all => _localizedValues[localeCode]['all'];
|
||||
|
||||
String get emailSignUp => _localizedValues[localeCode]['email_sign_up'];
|
||||
|
||||
String get googleSignUp => _localizedValues[localeCode]['google_sign_up'];
|
||||
|
|
@ -14762,6 +14784,49 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
|||
|
||||
String get code => _localizedValues[localeCode]['ocde'];
|
||||
|
||||
String get sunday => _localizedValues[localeCode]['sunday'];
|
||||
|
||||
String get monday => _localizedValues[localeCode]['monday'];
|
||||
|
||||
String get tuesday => _localizedValues[localeCode]['tuesday'];
|
||||
|
||||
String get wednesday => _localizedValues[localeCode]['wednesday'];
|
||||
|
||||
String get thursday => _localizedValues[localeCode]['thursday'];
|
||||
|
||||
String get friday => _localizedValues[localeCode]['friday'];
|
||||
|
||||
String get saturday => _localizedValues[localeCode]['saturday'];
|
||||
|
||||
String get january => _localizedValues[localeCode]['january'];
|
||||
|
||||
String get february => _localizedValues[localeCode]['february'];
|
||||
|
||||
String get march => _localizedValues[localeCode]['march'];
|
||||
|
||||
String get april => _localizedValues[localeCode]['april'];
|
||||
|
||||
String get may => _localizedValues[localeCode]['may'];
|
||||
|
||||
String get june => _localizedValues[localeCode]['june'];
|
||||
|
||||
String get july => _localizedValues[localeCode]['july'];
|
||||
|
||||
String get august => _localizedValues[localeCode]['august'];
|
||||
|
||||
String get september => _localizedValues[localeCode]['september'];
|
||||
|
||||
String get october => _localizedValues[localeCode]['october'];
|
||||
|
||||
String get november => _localizedValues[localeCode]['november'];
|
||||
|
||||
String get december => _localizedValues[localeCode]['december'];
|
||||
|
||||
String get firstDayOfTheWeek => _localizedValues[localeCode]['first_day_of_the_week'];
|
||||
|
||||
String get firstMonthOfTheYear => _localizedValues[localeCode]['first_month_of_the_year'];
|
||||
|
||||
|
||||
String lookup(String key) {
|
||||
final lookupKey = toSnakeCase(key);
|
||||
return _localizedValues[localeCode][lookupKey] ??
|
||||
|
|
|
|||
Loading…
Reference in New Issue