Email invoice layout

This commit is contained in:
Hillel Coren 2020-08-05 13:04:32 +03:00
parent d7ed8d7de8
commit 3b449c858d
3 changed files with 103 additions and 83 deletions

View File

@ -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/app/edit_scaffold.dart';
import 'package:invoiceninja_flutter/ui/settings/templates_and_reminders.dart'; import 'package:invoiceninja_flutter/ui/settings/templates_and_reminders.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:invoiceninja_flutter/utils/templates.dart'; import 'package:invoiceninja_flutter/utils/templates.dart';
class InvoiceEmailView extends StatefulWidget { class InvoiceEmailView extends StatefulWidget {
@ -118,19 +119,12 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
}); });
} }
Widget _buildPreview(BuildContext context) { Widget _buildTemplateDropdown(BuildContext context) {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
return Column( return Padding(
mainAxisSize: MainAxisSize.max, padding: const EdgeInsets.symmetric(horizontal: 16),
children: <Widget>[ child: DropdownButtonHideUnderline(
Container(
color: Theme.of(context).backgroundColor,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: <Widget>[
DropdownButtonHideUnderline(
child: DropdownButton<EmailTemplate>( child: DropdownButton<EmailTemplate>(
value: selectedTemplate, value: selectedTemplate,
onChanged: (template) { onChanged: (template) {
@ -173,21 +167,18 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
], ],
), ),
), ),
Expanded( );
child: Container(), }
),
], Widget _buildPreview(BuildContext context) {
), if (widget.viewModel.isLoading) {
), return LoadingIndicator();
), }
Expanded(
child: EmailPreview( return EmailPreview(
isLoading: _isLoading, isLoading: _isLoading,
subject: _subjectPreview, subject: _subjectPreview,
body: _bodyPreview, body: _bodyPreview,
),
),
],
); );
} }
@ -247,7 +238,9 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
title: localization.sendEmail, title: localization.sendEmail,
onCancelPressed: (context) => onCancelPressed: (context) =>
viewEntity(context: context, entity: invoice), viewEntity(context: context, entity: invoice),
appBarBottom: TabBar( appBarBottom: isDesktop(context)
? null
: TabBar(
controller: _controller, controller: _controller,
tabs: [ tabs: [
Tab(text: localization.preview), Tab(text: localization.preview),
@ -260,12 +253,34 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
viewModel.onSendPressed(context, selectedTemplate, viewModel.onSendPressed(context, selectedTemplate,
_subjectController.text, _bodyController.text); _subjectController.text, _bodyController.text);
}, },
body: viewModel.isLoading body: isDesktop(context)
? LoadingIndicator() ? Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTemplateDropdown(context),
_buildEdit(context),
],
),
),
Expanded(
child: _buildPreview(context),
),
],
)
: TabBarView( : TabBarView(
controller: _controller, controller: _controller,
children: [ children: [
_buildPreview(context), Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTemplateDropdown(context),
Expanded(child: _buildPreview(context)),
],
),
_buildEdit(context), _buildEdit(context),
//_buildHistory(context), //_buildHistory(context),
], ],

View File

@ -55,13 +55,18 @@ class MainScreen extends StatelessWidget {
Widget screen = BlankScreen(); Widget screen = BlankScreen();
bool isFullScreen = false; bool isFullScreen = false;
bool isEdit = false;
bool isEmail = false;
if (prefState.isDesktop) { if (prefState.isDesktop) {
isEdit = subRoute == '/edit';
isEmail = subRoute == '/email';
if ([ if ([
InvoiceScreen.route, InvoiceScreen.route,
QuoteScreen.route, QuoteScreen.route,
CreditScreen.route, CreditScreen.route,
].contains(mainRoute) && ].contains(mainRoute) &&
subRoute == '/edit') { (isEdit || isEmail)) {
isFullScreen = true; isFullScreen = true;
} }
} }
@ -73,13 +78,13 @@ class MainScreen extends StatelessWidget {
if (isFullScreen) { if (isFullScreen) {
switch (mainRoute) { switch (mainRoute) {
case InvoiceScreen.route: case InvoiceScreen.route:
screen = InvoiceEditScreen(); screen = isEmail ? InvoiceEmailScreen() : InvoiceEditScreen();
break; break;
case QuoteScreen.route: case QuoteScreen.route:
screen = QuoteEditScreen(); screen = isEmail ? QuoteEmailScreen() : QuoteEditScreen();
break; break;
case CreditScreen.route: case CreditScreen.route:
screen = CreditEditScreen(); screen = isEmail ? CreditEmailScreen() : CreditEditScreen();
break; break;
default: default:
switch (uiState.currentRoute) { switch (uiState.currentRoute) {

View File

@ -23,7 +23,7 @@ class InvoiceEmailScreen extends StatelessWidget {
onInit: (Store<AppState> store) { onInit: (Store<AppState> store) {
final state = store.state; final state = store.state;
final invoiceId = state.uiState.invoiceUIState.selectedId; 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); final client = state.clientState.get(invoice.clientId);
if (client.areActivitiesStale) { if (client.areActivitiesStale) {
store.dispatch(LoadClient(clientId: client.id)); store.dispatch(LoadClient(clientId: client.id));
@ -32,7 +32,7 @@ class InvoiceEmailScreen extends StatelessWidget {
converter: (Store<AppState> store) { converter: (Store<AppState> store) {
final state = store.state; final state = store.state;
final invoiceId = state.uiState.invoiceUIState.selectedId; final invoiceId = state.uiState.invoiceUIState.selectedId;
final invoice = state.invoiceState.map[invoiceId]; final invoice = state.invoiceState.get(invoiceId);
return EmailInvoiceVM.fromStore(store, invoice); return EmailInvoiceVM.fromStore(store, invoice);
}, },
builder: (context, vm) { builder: (context, vm) {