Add designs templates

This commit is contained in:
Hillel Coren 2023-11-09 18:54:21 +02:00
parent bd1d619604
commit a7de25323e
7 changed files with 58 additions and 96 deletions

View File

@ -14,14 +14,13 @@ import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart'; import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import '../document/document_actions.dart';
class ViewProductList implements PersistUI { class ViewProductList implements PersistUI {
ViewProductList({ ViewProductList({
this.force = false, this.force = false,

View File

@ -2,6 +2,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/repositories/purchase_order_repository.dart'; import 'package:invoiceninja_flutter/data/repositories/purchase_order_repository.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart'; import 'package:invoiceninja_flutter/redux/purchase_order/purchase_order_actions.dart';
import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/purchase_order/edit/purchase_order_edit_vm.dart';
@ -20,8 +21,6 @@ import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import '../document/document_actions.dart';
List<Middleware<AppState>> createStorePurchaseOrdersMiddleware([ List<Middleware<AppState>> createStorePurchaseOrdersMiddleware([
PurchaseOrderRepository repository = const PurchaseOrderRepository(), PurchaseOrderRepository repository = const PurchaseOrderRepository(),
]) { ]) {

View File

@ -2,6 +2,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
// Package imports: // Package imports:
@ -20,8 +21,6 @@ import 'package:invoiceninja_flutter/ui/recurring_invoice/recurring_invoice_pdf_
import 'package:invoiceninja_flutter/ui/recurring_invoice/recurring_invoice_screen.dart'; import 'package:invoiceninja_flutter/ui/recurring_invoice/recurring_invoice_screen.dart';
import 'package:invoiceninja_flutter/ui/recurring_invoice/view/recurring_invoice_view_vm.dart'; import 'package:invoiceninja_flutter/ui/recurring_invoice/view/recurring_invoice_view_vm.dart';
import '../document/document_actions.dart';
List<Middleware<AppState>> createStoreRecurringInvoicesMiddleware([ List<Middleware<AppState>> createStoreRecurringInvoicesMiddleware([
RecurringInvoiceRepository repository = const RecurringInvoiceRepository(), RecurringInvoiceRepository repository = const RecurringInvoiceRepository(),
]) { ]) {

View File

@ -4,7 +4,6 @@ import 'dart:convert';
// Flutter imports: // Flutter imports:
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// Package imports: // Package imports:
@ -15,6 +14,7 @@ import 'package:http/http.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/design/design_selectors.dart';
import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart';
import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
@ -40,11 +40,6 @@ import 'package:invoiceninja_flutter/utils/dialogs.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/platforms.dart';
import 'package:invoiceninja_flutter/utils/web_stub.dart'
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
import '../../redux/design/design_selectors.dart';
class ClientPdfView extends StatefulWidget { class ClientPdfView extends StatefulWidget {
const ClientPdfView({ const ClientPdfView({
Key? key, Key? key,
@ -70,7 +65,6 @@ class _ClientPdfViewState extends State<ClientPdfView> {
convertDateTimeToSqlDate(DateTime.now().subtract(Duration(days: 365))); convertDateTimeToSqlDate(DateTime.now().subtract(Duration(days: 365)));
String? _endDate = convertDateTimeToSqlDate(); String? _endDate = convertDateTimeToSqlDate();
String _status = kStatementStatusAll; String _status = kStatementStatusAll;
String? _pdfString;
String? _designId; String? _designId;
@override @override
@ -86,7 +80,6 @@ class _ClientPdfViewState extends State<ClientPdfView> {
} }
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final state = widget.viewModel.state;
setState(() { setState(() {
_isLoading = true; _isLoading = true;
@ -100,12 +93,6 @@ class _ClientPdfViewState extends State<ClientPdfView> {
} }
} else { } else {
_response = response; _response = response;
if (kIsWeb && state.prefState.enableNativeBrowser) {
_pdfString = 'data:application/pdf;base64,' +
base64Encode(response!.bodyBytes);
WebUtils.registerWebView(_pdfString);
}
} }
_isLoading = false; _isLoading = false;
@ -501,19 +488,15 @@ class _ClientPdfViewState extends State<ClientPdfView> {
Expanded( Expanded(
child: _isLoading || _response == null child: _isLoading || _response == null
? LoadingIndicator() ? LoadingIndicator()
: (kIsWeb && state.prefState.enableNativeBrowser) : PdfPreview(
? HtmlElementView(viewType: _pdfString!) build: (format) => _response!.bodyBytes,
: PdfPreview( canChangeOrientation: false,
build: (format) => _response!.bodyBytes, canChangePageFormat: false,
canChangeOrientation: false, canDebug: false,
canChangePageFormat: false, maxPageWidth: 600,
canDebug: false, pdfFileName:
maxPageWidth: 600, localization.statement + '_' + client.number + '.pdf',
pdfFileName: localization.statement + ),
'_' +
client.number +
'.pdf',
),
), ),
], ],
), ),

View File

@ -7,11 +7,11 @@ import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/static/static_selectors.dart'; import 'package:invoiceninja_flutter/redux/static/static_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart';
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart';
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart';
import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import '../../app/form_card.dart';
class ClientEditShippingAddress extends StatefulWidget { class ClientEditShippingAddress extends StatefulWidget {
const ClientEditShippingAddress({ const ClientEditShippingAddress({

View File

@ -6,14 +6,13 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart';
// Project imports: // Project imports:
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/help_text.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart';
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import '../../../redux/app/app_state.dart';
class InvoiceEditContacts extends StatelessWidget { class InvoiceEditContacts extends StatelessWidget {
const InvoiceEditContacts({ const InvoiceEditContacts({
Key? key, Key? key,

View File

@ -1,6 +1,5 @@
// Dart imports: // Dart imports:
import 'dart:async'; import 'dart:async';
import 'dart:convert';
// Flutter imports: // Flutter imports:
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -31,9 +30,6 @@ import 'package:invoiceninja_flutter/utils/formatting.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/platforms.dart';
import 'package:invoiceninja_flutter/utils/web_stub.dart'
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
class InvoicePdfView extends StatefulWidget { class InvoicePdfView extends StatefulWidget {
const InvoicePdfView({ const InvoicePdfView({
Key? key, Key? key,
@ -53,7 +49,6 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
bool _isDeliveryNote = false; bool _isDeliveryNote = false;
String? _designId; String? _designId;
String? _activityId; String? _activityId;
String? _pdfString;
http.Response? _response; http.Response? _response;
//int _pageCount = 1; //int _pageCount = 1;
//int _currentPage = 1; //int _currentPage = 1;
@ -75,7 +70,6 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
void loadPdf() { void loadPdf() {
final viewModel = widget.viewModel; final viewModel = widget.viewModel;
final invoice = viewModel.invoice!; final invoice = viewModel.invoice!;
final state = viewModel.state;
if (invoice.invitations.isEmpty) { if (invoice.invitations.isEmpty) {
return; return;
@ -95,12 +89,6 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
setState(() { setState(() {
_response = response; _response = response;
_isLoading = false; _isLoading = false;
if (kIsWeb && state!.prefState.enableNativeBrowser) {
_pdfString = 'data:application/pdf;base64,' +
base64Encode(response!.bodyBytes);
WebUtils.registerWebView(_pdfString);
}
}); });
}).catchError((Object error) { }).catchError((Object error) {
setState(() { setState(() {
@ -144,42 +132,39 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
]; ];
*/ */
final activityPicker = final activityPicker = _activityId == null
_activityId == null || (kIsWeb && state.prefState.enableNativeBrowser) ? SizedBox()
? SizedBox() : Expanded(
: Expanded( child: Padding(
child: Padding( padding: const EdgeInsets.only(left: 17),
padding: const EdgeInsets.only(left: 17), child: IgnorePointer(
child: IgnorePointer( ignoring: _isLoading,
ignoring: _isLoading, child: AppDropdownButton<String>(
child: AppDropdownButton<String>( value: _activityId,
value: _activityId, onChanged: (dynamic activityId) {
onChanged: (dynamic activityId) { setState(() {
setState(() { _activityId = activityId;
_activityId = activityId; loadPdf();
loadPdf(); });
}); },
}, items: invoice.balanceHistory
items: invoice.balanceHistory .map((history) => DropdownMenuItem(
.map((history) => DropdownMenuItem( child: Text(formatNumber(history.amount, context,
child: Text(formatNumber( clientId: invoice.clientId)! +
history.amount, context, '' +
clientId: invoice.clientId)! + formatDate(
'' + convertTimestampToDateString(
formatDate( history.createdAt),
convertTimestampToDateString( context,
history.createdAt), showTime: true)),
context, value: history.activityId,
showTime: true)), ))
value: history.activityId, .toList()),
)) ),
.toList()), ),
), );
),
);
final designPicker = _activityId != null || final designPicker = _activityId != null ||
(kIsWeb && state.prefState.enableNativeBrowser) ||
!hasDesignTemplatesForEntityType( !hasDesignTemplatesForEntityType(
state.designState.map, invoice.entityType!) state.designState.map, invoice.entityType!)
? SizedBox() ? SizedBox()
@ -289,20 +274,18 @@ class _InvoicePdfViewState extends State<InvoicePdfView> {
Expanded( Expanded(
child: _isLoading || _response == null child: _isLoading || _response == null
? LoadingIndicator() ? LoadingIndicator()
: (kIsWeb && state.prefState.enableNativeBrowser) : PdfPreview(
? HtmlElementView(viewType: _pdfString!) build: (format) => _response!.bodyBytes,
: PdfPreview( canChangeOrientation: false,
build: (format) => _response!.bodyBytes, canChangePageFormat: false,
canChangeOrientation: false, canDebug: false,
canChangePageFormat: false, maxPageWidth: 600,
canDebug: false, pdfFileName:
maxPageWidth: 600, localization.lookup(invoice.entityType!.snakeCase) +
pdfFileName: '_' +
localization.lookup(invoice.entityType!.snakeCase) + invoice.number +
'_' + '.pdf',
invoice.number + ),
'.pdf',
),
), ),
], ],
), ),