diff --git a/lib/ui/app/invoice/email_invoice_dialog.dart b/lib/ui/app/invoice/email_invoice_dialog.dart index a4e4b692a..22fdc07e7 100644 --- a/lib/ui/app/invoice/email_invoice_dialog.dart +++ b/lib/ui/app/invoice/email_invoice_dialog.dart @@ -1,6 +1,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/loading_dialog.dart'; +import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/email_invoice_dialog_vm.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -25,25 +26,61 @@ class _EmailInvoiceViewState extends State { String emailSubject; String emailBody; + final _subjectController = TextEditingController(); + final _bodyController = TextEditingController(); + + List _controllers = []; + @override void didChangeDependencies() { super.didChangeDependencies(); + final localization = AppLocalization.of(context); final company = widget.viewModel.company; selectedTemplate = EmailTemplate.initial; emailSubject = company.emailSubjectInvoice; emailBody = company.emailBodyInvoice; + updateTemplate(); + + _controllers = [ + _subjectController, + _bodyController, + ]; + + } + + @override + void dispose() { + _controllers.forEach((dynamic controller) { + controller.removeListener(_onChanged); + controller.dispose(); + }); + + super.dispose(); + } + + void _onChanged() { + setState(() { + updateTemplate(); + }); } void updateTemplate() { final viewModel = widget.viewModel; - emailSubject = processTemplate( - emailSubject, viewModel.invoice, context); - emailBody = processTemplate( - emailBody, viewModel.invoice, context); + _controllers + .forEach((dynamic controller) => controller.removeListener(_onChanged)); + + _subjectController.text = emailSubject; + _bodyController.text = emailBody; + + _controllers + .forEach((dynamic controller) => controller.addListener(_onChanged)); + + emailSubject = processTemplate(emailSubject, viewModel.invoice, context); + emailBody = processTemplate(emailBody, viewModel.invoice, context); } Widget _buildSend(BuildContext context) { @@ -132,7 +169,8 @@ class _EmailInvoiceViewState extends State { Container( color: Colors.white, child: Padding( - padding: const EdgeInsets.all(13.0), + padding: const EdgeInsets.only( + left: 13.0, top: 13.0, right: 13.0, bottom: 20.0), child: Text( emailSubject, style: TextStyle( @@ -157,6 +195,30 @@ class _EmailInvoiceViewState extends State { ); } + Widget _buildEdit(BuildContext context) { + final localization = AppLocalization.of(context); + + return FormCard( + children: [ + TextFormField( + controller: _subjectController, + decoration: InputDecoration( + labelText: localization.subject, + ), + keyboardType: TextInputType.text, + ), + TextFormField( + controller: _bodyController, + decoration: InputDecoration( + labelText: localization.body, + ), + maxLines: 6, + keyboardType: TextInputType.multiline, + ), + ], + ); + } + @override Widget build(BuildContext context) { final viewModel = widget.viewModel; @@ -190,7 +252,7 @@ class _EmailInvoiceViewState extends State { body: TabBarView( children: [ _buildSend(context), - Icon(Icons.directions_transit), + _buildEdit(context), Icon(Icons.directions_bike), ], ), diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 4229ddc90..bc9675db2 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -48,6 +48,7 @@ class InvoiceEditDetailsState extends State { _surcharge1Controller, _surcharge2Controller, ]; + _controllers .forEach((dynamic controller) => controller.removeListener(_onChanged)); diff --git a/lib/utils/localization.dart b/lib/utils/localization.dart index db457e043..ceaaadcdf 100644 --- a/lib/utils/localization.dart +++ b/lib/utils/localization.dart @@ -194,6 +194,8 @@ class AppLocalization { 'third_reminder': 'Third Reminder', 'template': 'Template', 'send': 'Send', + 'subject': 'Subject', + 'body': 'Body', 'payment': 'Payment', 'payments': 'Payments', @@ -443,6 +445,8 @@ class AppLocalization { String get thirdReminder => _localizedValues[locale.languageCode]['third_reminder']; String get template => _localizedValues[locale.languageCode]['template']; String get send => _localizedValues[locale.languageCode]['send']; + String get subject => _localizedValues[locale.languageCode]['subject']; + String get body => _localizedValues[locale.languageCode]['body']; String get payment => _localizedValues[locale.languageCode]['payment']; String get payments => _localizedValues[locale.languageCode]['payments'];