From 1b20ab8174c27552160b6599eb0d117c30d33ec2 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 22 Nov 2023 12:33:37 +0200 Subject: [PATCH] Add run_template action --- lib/redux/client/client_actions.dart | 1 + lib/redux/invoice/invoice_actions.dart | 1 + lib/redux/payment/payment_actions.dart | 1 + lib/redux/project/project_actions.dart | 1 + lib/redux/task/task_actions.dart | 1 + lib/utils/dialogs.dart | 115 ++++++++++++++----------- 6 files changed, 68 insertions(+), 52 deletions(-) diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index 6057f5002..35fa0a403 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -543,6 +543,7 @@ void handleClientAction(BuildContext? context, List clients, case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.client, entities: clients, diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index dd38f0f34..6bdc3f7aa 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -862,6 +862,7 @@ void handleInvoiceAction(BuildContext? context, List invoices, case EntityAction.runTemplate: showDialog( context: navigatorKey.currentContext!, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.invoice, entities: invoices, diff --git a/lib/redux/payment/payment_actions.dart b/lib/redux/payment/payment_actions.dart index 38e6065b1..28b9ef05b 100644 --- a/lib/redux/payment/payment_actions.dart +++ b/lib/redux/payment/payment_actions.dart @@ -414,6 +414,7 @@ void handlePaymentAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.payment, entities: payments, diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index ebbc7a04e..33f96ddac 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -392,6 +392,7 @@ void handleProjectAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.project, entities: projects, diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index 47c975b36..65b441cef 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -546,6 +546,7 @@ void handleTaskAction( case EntityAction.runTemplate: showDialog( context: context, + barrierDismissible: false, builder: (context) => RunTemplateDialog( entityType: EntityType.task, entities: tasks, diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart index 2424cea39..1cd3d115b 100644 --- a/lib/utils/dialogs.dart +++ b/lib/utils/dialogs.dart @@ -34,6 +34,7 @@ import 'package:invoiceninja_flutter/utils/oauth.dart'; import 'package:invoiceninja_flutter/utils/web_stub.dart' if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart'; +import 'package:printing/printing.dart'; void showRefreshDataDialog( {required BuildContext context, bool includeStatic = false}) async { @@ -630,28 +631,27 @@ class _RunTemplateDialogState extends State { String _designId = ''; bool _sendEmail = false; bool _isLoading = false; + Uint8List? _data; - Future loadTemplate(String jobHash) async { + Future loadTemplate(String jobHash) async { final store = StoreProvider.of(context); final state = store.state; final credentials = state.credentials; final url = '${credentials.url}/templates/preview/$jobHash'; - Uint8List? data; - - while (data == null) { + while (_data == null) { await Future.delayed(Duration(seconds: 3)); try { final response = await WebClient().post(url, credentials.token, rawResponse: true); - data = response.bodyBytes; + _data = response.bodyBytes; } catch (error) { print('## CATCH ERROR: $error'); } } - return data; + return _data != null; } @override @@ -699,8 +699,7 @@ class _RunTemplateDialogState extends State { showToast(localization.exportedData); } else { final jobHash = response['message']; - final data = await loadTemplate(jobHash); - print('## DATA LENGTH: ${data.length}'); + await loadTemplate(jobHash); setState(() => _isLoading = false); } }).catchError((error) { @@ -711,51 +710,63 @@ class _RunTemplateDialogState extends State { child: Text(localization.start.toUpperCase()), ), ], - content: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - localization.lookup(widget.entities.length == 1 - ? widget.entityType.snakeCase - : widget.entityType.plural), - style: Theme.of(context).textTheme.bodySmall, + content: _data != null + ? SizedBox( + width: 600, + child: PdfPreview( + build: (format) => _data!, + canChangeOrientation: false, + canChangePageFormat: false, + allowPrinting: false, + allowSharing: false, + canDebug: false, + ), + ) + : SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + localization.lookup(widget.entities.length == 1 + ? widget.entityType.snakeCase + : widget.entityType.plural), + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox(height: 8), + ...widget.entities + .map((entity) => Text(entity.listDisplayName)) + .toList(), + if (_isLoading) ...[ + SizedBox(height: 32), + LinearProgressIndicator() + ] else ...[ + SizedBox(height: 16), + DesignPicker( + autofocus: true, + entityType: widget.entityType, + initialValue: _designId, + onSelected: (design) { + setState(() { + _designId = design?.id ?? ''; + }); + }, + ), + SizedBox(height: 16), + SwitchListTile( + value: _sendEmail, + title: Text( + localization.sendEmail, + ), + onChanged: (value) { + setState(() { + _sendEmail = value; + }); + }, + ), + ], + ], + ), ), - SizedBox(height: 8), - ...widget.entities - .map((entity) => Text(entity.listDisplayName)) - .toList(), - if (_isLoading) ...[ - SizedBox(height: 30), - LinearProgressIndicator() - ] else ...[ - SizedBox(height: 8), - DesignPicker( - autofocus: true, - entityType: widget.entityType, - initialValue: _designId, - onSelected: (design) { - setState(() { - _designId = design?.id ?? ''; - }); - }, - ), - SizedBox(height: 16), - SwitchListTile( - value: _sendEmail, - title: Text( - localization.sendEmail, - ), - onChanged: (value) { - setState(() { - _sendEmail = value; - }); - }, - ), - ], - ], - ), - ), ); } }