diff --git a/lib/ui/app/invoice/invoice_email_view.dart b/lib/ui/app/invoice/invoice_email_view.dart index 881141a54..d5ba456e3 100644 --- a/lib/ui/app/invoice/invoice_email_view.dart +++ b/lib/ui/app/invoice/invoice_email_view.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/settings/templates_and_reminders.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/templates.dart'; class InvoiceEmailView extends StatefulWidget { @@ -118,76 +119,66 @@ class _InvoiceEmailViewState extends State }); } - Widget _buildPreview(BuildContext context) { + Widget _buildTemplateDropdown(BuildContext context) { final localization = AppLocalization.of(context); - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - color: Theme.of(context).backgroundColor, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - children: [ - DropdownButtonHideUnderline( - child: DropdownButton( - value: selectedTemplate, - onChanged: (template) { - setState(() { - _subjectController.text = ''; - _bodyController.text = ''; - selectedTemplate = template; - _loadTemplate(); - }); - }, - items: [ - DropdownMenuItem( - child: Text(localization.initialEmail), - value: widget.viewModel.invoice.emailTemplate, - ), - DropdownMenuItem( - child: Text(localization.firstReminder), - value: EmailTemplate.reminder1, - ), - DropdownMenuItem( - child: Text(localization.secondReminder), - value: EmailTemplate.reminder2, - ), - DropdownMenuItem( - child: Text(localization.thirdReminder), - value: EmailTemplate.reminder3, - ), - DropdownMenuItem( - child: Text(localization.firstCustom), - value: EmailTemplate.custom1, - ), - DropdownMenuItem( - child: Text(localization.secondCustom), - value: EmailTemplate.custom2, - ), - DropdownMenuItem( - child: Text(localization.thirdCustom), - value: EmailTemplate.custom3, - ), - ], - ), - ), - Expanded( - child: Container(), - ), - ], + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: selectedTemplate, + onChanged: (template) { + setState(() { + _subjectController.text = ''; + _bodyController.text = ''; + selectedTemplate = template; + _loadTemplate(); + }); + }, + items: [ + DropdownMenuItem( + child: Text(localization.initialEmail), + value: widget.viewModel.invoice.emailTemplate, ), - ), + DropdownMenuItem( + child: Text(localization.firstReminder), + value: EmailTemplate.reminder1, + ), + DropdownMenuItem( + child: Text(localization.secondReminder), + value: EmailTemplate.reminder2, + ), + DropdownMenuItem( + child: Text(localization.thirdReminder), + value: EmailTemplate.reminder3, + ), + DropdownMenuItem( + child: Text(localization.firstCustom), + value: EmailTemplate.custom1, + ), + DropdownMenuItem( + child: Text(localization.secondCustom), + value: EmailTemplate.custom2, + ), + DropdownMenuItem( + child: Text(localization.thirdCustom), + value: EmailTemplate.custom3, + ), + ], ), - Expanded( - child: EmailPreview( - isLoading: _isLoading, - subject: _subjectPreview, - body: _bodyPreview, - ), - ), - ], + ), + ); + } + + Widget _buildPreview(BuildContext context) { + if (widget.viewModel.isLoading) { + return LoadingIndicator(); + } + + return EmailPreview( + isLoading: _isLoading, + subject: _subjectPreview, + body: _bodyPreview, ); } @@ -247,25 +238,49 @@ class _InvoiceEmailViewState extends State title: localization.sendEmail, onCancelPressed: (context) => viewEntity(context: context, entity: invoice), - appBarBottom: TabBar( - controller: _controller, - tabs: [ - Tab(text: localization.preview), - Tab(text: localization.customize), - //Tab(text: localization.history), - ], - ), + appBarBottom: isDesktop(context) + ? null + : TabBar( + controller: _controller, + tabs: [ + Tab(text: localization.preview), + Tab(text: localization.customize), + //Tab(text: localization.history), + ], + ), saveLabel: localization.send, onSavePressed: (context) { viewModel.onSendPressed(context, selectedTemplate, _subjectController.text, _bodyController.text); }, - body: viewModel.isLoading - ? LoadingIndicator() + body: isDesktop(context) + ? Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTemplateDropdown(context), + _buildEdit(context), + ], + ), + ), + Expanded( + child: _buildPreview(context), + ), + ], + ) : TabBarView( controller: _controller, children: [ - _buildPreview(context), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildTemplateDropdown(context), + Expanded(child: _buildPreview(context)), + ], + ), _buildEdit(context), //_buildHistory(context), ], diff --git a/lib/ui/app/main_screen.dart b/lib/ui/app/main_screen.dart index cc6e752e6..e482d0a56 100644 --- a/lib/ui/app/main_screen.dart +++ b/lib/ui/app/main_screen.dart @@ -55,13 +55,18 @@ class MainScreen extends StatelessWidget { Widget screen = BlankScreen(); bool isFullScreen = false; + bool isEdit = false; + bool isEmail = false; + if (prefState.isDesktop) { + isEdit = subRoute == '/edit'; + isEmail = subRoute == '/email'; if ([ InvoiceScreen.route, QuoteScreen.route, CreditScreen.route, ].contains(mainRoute) && - subRoute == '/edit') { + (isEdit || isEmail)) { isFullScreen = true; } } @@ -73,13 +78,13 @@ class MainScreen extends StatelessWidget { if (isFullScreen) { switch (mainRoute) { case InvoiceScreen.route: - screen = InvoiceEditScreen(); + screen = isEmail ? InvoiceEmailScreen() : InvoiceEditScreen(); break; case QuoteScreen.route: - screen = QuoteEditScreen(); + screen = isEmail ? QuoteEmailScreen() : QuoteEditScreen(); break; case CreditScreen.route: - screen = CreditEditScreen(); + screen = isEmail ? CreditEmailScreen() : CreditEditScreen(); break; default: switch (uiState.currentRoute) { diff --git a/lib/ui/invoice/invoice_email_vm.dart b/lib/ui/invoice/invoice_email_vm.dart index 563f91cc6..7496e634e 100644 --- a/lib/ui/invoice/invoice_email_vm.dart +++ b/lib/ui/invoice/invoice_email_vm.dart @@ -23,7 +23,7 @@ class InvoiceEmailScreen extends StatelessWidget { onInit: (Store store) { final state = store.state; final invoiceId = state.uiState.invoiceUIState.selectedId; - final invoice = state.invoiceState.map[invoiceId]; + final invoice = state.invoiceState.get(invoiceId); final client = state.clientState.get(invoice.clientId); if (client.areActivitiesStale) { store.dispatch(LoadClient(clientId: client.id)); @@ -32,7 +32,7 @@ class InvoiceEmailScreen extends StatelessWidget { converter: (Store store) { final state = store.state; final invoiceId = state.uiState.invoiceUIState.selectedId; - final invoice = state.invoiceState.map[invoiceId]; + final invoice = state.invoiceState.get(invoiceId); return EmailInvoiceVM.fromStore(store, invoice); }, builder: (context, vm) {