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/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<InvoiceEmailView>
});
}
Widget _buildPreview(BuildContext context) {
Widget _buildTemplateDropdown(BuildContext context) {
final localization = AppLocalization.of(context);
return Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Container(
color: Theme.of(context).backgroundColor,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: <Widget>[
DropdownButtonHideUnderline(
child: DropdownButton<EmailTemplate>(
value: selectedTemplate,
onChanged: (template) {
setState(() {
_subjectController.text = '';
_bodyController.text = '';
selectedTemplate = template;
_loadTemplate();
});
},
items: [
DropdownMenuItem<EmailTemplate>(
child: Text(localization.initialEmail),
value: widget.viewModel.invoice.emailTemplate,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.firstReminder),
value: EmailTemplate.reminder1,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.secondReminder),
value: EmailTemplate.reminder2,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.thirdReminder),
value: EmailTemplate.reminder3,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.firstCustom),
value: EmailTemplate.custom1,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.secondCustom),
value: EmailTemplate.custom2,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.thirdCustom),
value: EmailTemplate.custom3,
),
],
),
),
Expanded(
child: Container(),
),
],
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: DropdownButtonHideUnderline(
child: DropdownButton<EmailTemplate>(
value: selectedTemplate,
onChanged: (template) {
setState(() {
_subjectController.text = '';
_bodyController.text = '';
selectedTemplate = template;
_loadTemplate();
});
},
items: [
DropdownMenuItem<EmailTemplate>(
child: Text(localization.initialEmail),
value: widget.viewModel.invoice.emailTemplate,
),
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.firstReminder),
value: EmailTemplate.reminder1,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.secondReminder),
value: EmailTemplate.reminder2,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.thirdReminder),
value: EmailTemplate.reminder3,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.firstCustom),
value: EmailTemplate.custom1,
),
DropdownMenuItem<EmailTemplate>(
child: Text(localization.secondCustom),
value: EmailTemplate.custom2,
),
DropdownMenuItem<EmailTemplate>(
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<InvoiceEmailView>
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),
],

View File

@ -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) {

View File

@ -23,7 +23,7 @@ class InvoiceEmailScreen extends StatelessWidget {
onInit: (Store<AppState> 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<AppState> 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) {