TF-2520 Use mime type png to display logo in print page

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2024-03-07 10:30:56 +07:00
committed by Dat H. Pham
parent 6f26306a61
commit 58fa7f8a42
10 changed files with 260 additions and 166 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

+103 -95
View File
@@ -1,10 +1,100 @@
library core; library core;
export 'data/constants/constant.dart'; // Extensions
export 'presentation/extensions/color_extension.dart';
export 'presentation/extensions/url_extension.dart';
export 'presentation/extensions/uri_extension.dart';
export 'presentation/extensions/capitalize_extension.dart';
export 'presentation/extensions/list_extensions.dart';
export 'domain/extensions/datetime_extension.dart';
export 'presentation/extensions/html_extension.dart';
export 'presentation/extensions/compare_string_extension.dart';
export 'presentation/extensions/compare_list_extensions.dart';
export 'presentation/extensions/string_extension.dart';
export 'presentation/extensions/tap_down_details_extension.dart';
export 'domain/extensions/media_type_extension.dart';
export 'presentation/extensions/map_extensions.dart';
// Exceptions
export 'domain/exceptions/download_file_exception.dart';
export 'data/extensions/options_extensions.dart'; export 'data/extensions/options_extensions.dart';
export 'data/model/query/query_parameter.dart'; export 'domain/exceptions/web_session_exception.dart';
// Model
export 'data/model/source_type/data_source_type.dart'; // Utils
export 'presentation/utils/theme_utils.dart';
export 'presentation/utils/responsive_utils.dart';
export 'presentation/utils/keyboard_utils.dart';
export 'presentation/utils/icon_utils.dart';
export 'presentation/utils/style_utils.dart';
export 'presentation/utils/app_toast.dart';
export 'presentation/utils/html_transformer/html_transform.dart';
export 'presentation/utils/html_transformer/transform_configuration.dart';
export 'presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart';
export 'data/utils/device_manager.dart';
export 'utils/app_logger.dart';
export 'utils/benchmark.dart';
export 'utils/fps_manager.dart';
export 'utils/build_utils.dart';
export 'utils/string_convert.dart';
export 'utils/config/app_config_loader.dart';
export 'utils/config/app_config_parser.dart';
export 'utils/config/errors.dart';
export 'data/utils/compress_file_utils.dart';
export 'utils/platform_info.dart';
export 'utils/file_utils.dart';
export 'utils/option_param_mixin.dart';
export 'utils/print_utils.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
export 'presentation/views/text/text_field_builder.dart';
export 'presentation/views/text/text_form_field_builder.dart';
export 'presentation/views/text/input_decoration_builder.dart';
export 'presentation/views/text/rich_text_builder.dart';
export 'presentation/views/text/text_overflow_builder.dart';
export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/list/tree_view.dart';
export 'presentation/views/button/icon_button_web.dart';
export 'presentation/views/button/tmail_button_widget.dart';
export 'presentation/views/image/avatar_builder.dart';
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
export 'presentation/views/image/icon_builder.dart';
export 'presentation/views/context_menu/context_menu_action_builder.dart';
export 'presentation/views/context_menu/context_menu_builder.dart';
export 'presentation/views/context_menu/context_menu_header_builder.dart';
export 'presentation/views/context_menu/simple_context_menu_action_builder.dart';
export 'presentation/views/dialog/downloading_file_dialog_builder.dart';
export 'presentation/views/dialog/confirmation_dialog_builder.dart';
export 'presentation/views/dialog/edit_text_dialog_builder.dart';
export 'presentation/views/dialog/color_picker_dialog_builder.dart';
export 'presentation/views/html_viewer/html_content_viewer_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
export 'presentation/views/floating_button/scrolling_floating_button_animated.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_action_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_no_icon_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_builder.dart';
export 'presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
export 'presentation/views/modal_sheets/edit_text_modal_sheet_builder.dart';
export 'presentation/views/search/search_bar_view.dart';
export 'presentation/views/popup_menu/popup_menu_item_widget.dart';
export 'presentation/views/quick_search/quick_search_input_form.dart';
export 'presentation/views/toast/toast_position.dart';
export 'presentation/views/toast/tmail_toast.dart';
export 'presentation/views/bottom_popup/full_screen_action_sheet_builder.dart';
export 'presentation/views/checkbox/labeled_checkbox.dart';
export 'presentation/views/container/tmail_container_widget.dart';
export 'presentation/views/clipper/side_arrow_clipper.dart';
export 'presentation/views/avatar/gradient_circle_avatar_icon.dart';
export 'presentation/views/loading/cupertino_loading_widget.dart';
// Resources
export 'presentation/resources/assets_paths.dart';
export 'presentation/resources/image_paths.dart';
// Constants
export 'presentation/constants/constants_ui.dart';
export 'data/constants/constant.dart';
// Network // Network
export 'data/network/config/dynamic_url_interceptors.dart'; export 'data/network/config/dynamic_url_interceptors.dart';
export 'data/network/config/service_path.dart'; export 'data/network/config/service_path.dart';
@@ -12,96 +102,14 @@ export 'data/network/dio_client.dart';
export 'data/network/download/download_client.dart'; export 'data/network/download/download_client.dart';
export 'data/network/download/download_manager.dart'; export 'data/network/download/download_manager.dart';
export 'data/network/download/downloaded_response.dart'; export 'data/network/download/downloaded_response.dart';
export 'data/utils/compress_file_utils.dart';
export 'data/utils/device_manager.dart';
// Exceptions
export 'domain/exceptions/download_file_exception.dart';
export 'domain/exceptions/web_session_exception.dart';
export 'domain/extensions/datetime_extension.dart';
export 'domain/extensions/media_type_extension.dart';
// Action
export 'presentation/action/action_callback_define.dart';
// Constants
export 'presentation/constants/constants_ui.dart';
export 'presentation/extensions/capitalize_extension.dart';
// Extensions
export 'presentation/extensions/color_extension.dart';
export 'presentation/extensions/compare_list_extensions.dart';
export 'presentation/extensions/compare_string_extension.dart';
export 'presentation/extensions/html_extension.dart';
export 'presentation/extensions/list_extensions.dart';
export 'presentation/extensions/map_extensions.dart';
export 'presentation/extensions/string_extension.dart';
export 'presentation/extensions/tap_down_details_extension.dart';
export 'presentation/extensions/uri_extension.dart';
export 'presentation/extensions/url_extension.dart';
// Resources
export 'presentation/resources/assets_paths.dart';
export 'presentation/resources/image_paths.dart';
export 'presentation/state/failure.dart';
// State // State
export 'presentation/state/success.dart'; export 'presentation/state/success.dart';
export 'presentation/utils/app_toast.dart'; export 'presentation/state/failure.dart';
export 'presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart';
export 'presentation/utils/html_transformer/html_transform.dart'; // Model
export 'presentation/utils/html_transformer/transform_configuration.dart'; export 'data/model/source_type/data_source_type.dart';
export 'presentation/utils/icon_utils.dart'; export 'data/model/query/query_parameter.dart';
export 'presentation/utils/keyboard_utils.dart';
export 'presentation/utils/responsive_utils.dart'; // Action
export 'presentation/utils/style_utils.dart'; export 'presentation/action/action_callback_define.dart';
// Utils
export 'presentation/utils/theme_utils.dart';
export 'presentation/views/avatar/gradient_circle_avatar_icon.dart';
export 'presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_action_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_builder.dart';
export 'presentation/views/bottom_popup/cupertino_action_sheet_no_icon_builder.dart';
export 'presentation/views/bottom_popup/full_screen_action_sheet_builder.dart';
export 'presentation/views/button/icon_button_web.dart';
export 'presentation/views/button/tmail_button_widget.dart';
export 'presentation/views/checkbox/labeled_checkbox.dart';
export 'presentation/views/clipper/side_arrow_clipper.dart';
export 'presentation/views/container/tmail_container_widget.dart';
export 'presentation/views/context_menu/context_menu_action_builder.dart';
export 'presentation/views/context_menu/context_menu_builder.dart';
export 'presentation/views/context_menu/context_menu_header_builder.dart';
export 'presentation/views/context_menu/simple_context_menu_action_builder.dart';
export 'presentation/views/dialog/color_picker_dialog_builder.dart';
export 'presentation/views/dialog/confirmation_dialog_builder.dart';
export 'presentation/views/dialog/downloading_file_dialog_builder.dart';
export 'presentation/views/dialog/edit_text_dialog_builder.dart';
export 'presentation/views/floating_button/scrolling_floating_button_animated.dart';
export 'presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_widget.dart';
export 'presentation/views/image/avatar_builder.dart';
export 'presentation/views/image/icon_builder.dart';
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
export 'presentation/views/list/tree_view.dart';
export 'presentation/views/loading/cupertino_loading_widget.dart';
export 'presentation/views/modal_sheets/edit_text_modal_sheet_builder.dart';
export 'presentation/views/popup_menu/popup_menu_item_widget.dart';
export 'presentation/views/quick_search/quick_search_input_form.dart';
export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/search/search_bar_view.dart';
export 'presentation/views/text/input_decoration_builder.dart';
export 'presentation/views/text/rich_text_builder.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
export 'presentation/views/text/text_field_builder.dart';
export 'presentation/views/text/text_form_field_builder.dart';
export 'presentation/views/text/text_overflow_builder.dart';
export 'presentation/views/toast/tmail_toast.dart';
export 'presentation/views/toast/toast_position.dart';
export 'utils/app_logger.dart';
export 'utils/benchmark.dart';
export 'utils/build_utils.dart';
export 'utils/config/app_config_loader.dart';
export 'utils/config/app_config_parser.dart';
export 'utils/config/errors.dart';
export 'utils/file_utils.dart';
export 'utils/fps_manager.dart';
export 'utils/html/html_template.dart';
export 'utils/option_param_mixin.dart';
export 'utils/platform_info.dart';
export 'utils/print_utils.dart';
export 'utils/string_convert.dart';
@@ -1,4 +1,5 @@
class AssetsPaths { class AssetsPaths {
static const images = 'assets/images/'; static const images = 'assets/images/';
static const icons = 'assets/icons/';
static const configurationImages = 'configurations/icons/'; static const configurationImages = 'configurations/icons/';
} }
@@ -210,11 +210,16 @@ class ImagePaths {
String get icUnsubscribe => _getImagePath('ic_unsubscribe.svg'); String get icUnsubscribe => _getImagePath('ic_unsubscribe.svg');
String get icRecoverDeletedMessages => _getImagePath('ic_recover_deleted_messages.svg'); String get icRecoverDeletedMessages => _getImagePath('ic_recover_deleted_messages.svg');
String get icPrinter => _getImagePath('ic_printer.svg'); String get icPrinter => _getImagePath('ic_printer.svg');
String get icLogoApp => _getIconPath('logo_app.png');
String _getImagePath(String imageName) { String _getImagePath(String imageName) {
return AssetsPaths.images + imageName; return AssetsPaths.images + imageName;
} }
String _getIconPath(String iconName) {
return AssetsPaths.icons + iconName;
}
String getConfigurationImagePath(String imageName) { String getConfigurationImagePath(String imageName) {
return AssetsPaths.configurationImages + imageName; return AssetsPaths.configurationImages + imageName;
} }
@@ -1,22 +0,0 @@
import 'package:core/data/network/dio_client.dart';
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
import 'package:html/dom.dart';
class RemoveTagHiddenTransformer extends DomTransformer {
const RemoveTagHiddenTransformer();
@override
Future<void> process({
required Document document,
required DioClient dioClient,
Map<String, String>? mapUrlDownloadCID,
}) async {
final elements = document.querySelectorAll('[style]');
await Future.wait(elements.map((element) async {
var exStyle = element.attributes['style'];
if (exStyle?.contains('display: none') == true || exStyle?.contains('display:none') == true) {
element.remove();
}
}));
}
}
@@ -9,7 +9,6 @@ import 'package:core/presentation/utils/html_transformer/dom/blockquoted_transfo
import 'package:core/presentation/utils/html_transformer/dom/image_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/image_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/remove_collapsed_signature_button_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/remove_collapsed_signature_button_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/remove_lazy_loading_for_background_image_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/remove_lazy_loading_for_background_image_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/remove_tag_hidden_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/remove_tooltip_link_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/remove_tooltip_link_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/script_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/script_transformers.dart';
import 'package:core/presentation/utils/html_transformer/dom/sigature_transformers.dart'; import 'package:core/presentation/utils/html_transformer/dom/sigature_transformers.dart';
@@ -67,7 +66,6 @@ class TransformConfiguration {
const RemoveTooltipLinkTransformer(), const RemoveTooltipLinkTransformer(),
const RemoveLazyLoadingForBackgroundImageTransformer(), const RemoveLazyLoadingForBackgroundImageTransformer(),
const RemoveCollapsedSignatureButtonTransformer(), const RemoveCollapsedSignatureButtonTransformer(),
const RemoveTagHiddenTransformer(),
]); ]);
/// Provides easy access to a standard configuration that does not block external images. /// Provides easy access to a standard configuration that does not block external images.
+101 -43
View File
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:core/data/model/print_attachment.dart'; import 'package:core/data/model/print_attachment.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/file_utils.dart'; import 'package:core/utils/file_utils.dart';
import 'package:core/utils/html/html_interaction.dart'; import 'package:core/utils/html/html_interaction.dart';
import 'package:core/utils/html/html_template.dart'; import 'package:core/utils/html/html_template.dart';
@@ -16,18 +17,18 @@ class PrintUtils {
PrintUtils(this._imagePaths, this._fileUtils); PrintUtils(this._imagePaths, this._fileUtils);
Future<Element> _createUserInformationElement({ Future<Element?> _createUserInformationElement({
required String appName, required String appName,
required String userName, required String userName,
}) async { }) async {
final logoBase64Data = await _fileUtils.convertImageAssetToBase64(_imagePaths.icTMailLogo); try {
final logoBase64Data = await _fileUtils.convertImageAssetToBase64(_imagePaths.icLogoApp);
return Element.html(''' return Element.html('''
<table width="100%" cellpadding="0" cellspacing="0" border="0"> <table width="100%" cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr height="14px"> <tr height="14px">
<td width="40"><img src="${HtmlUtils.generateSVGImageData(logoBase64Data)}" width="40" height="40" class="logo" /></td> <td width="200"><img src="${HtmlUtils.convertBase64ToImageResourceData(base64Data: logoBase64Data, mimeType: 'image/png')}" width="200" height="40" class="logo" /></td>
<td style="padding-left: 10px;font-size: 20px;color: #000;"><b>$appName</b></td>
<td align="right" style="color: #777;"> <td align="right" style="color: #777;">
<b>$userName</b> <b>$userName</b>
</td> </td>
@@ -35,12 +36,24 @@ class PrintUtils {
</tbody> </tbody>
</table> </table>
'''); ''');
} catch (e) {
logError('PrintUtils::_createUserInformationElement: Exception = $e');
return null;
}
} }
Element get dividerElement => Element.html('<hr />'); Element? get dividerElement {
try {
return Element.html('<hr />');
} catch (e) {
logError('PrintUtils::dividerElement: Exception = $e');
return null;
}
}
Element _createSubjectElement(String subject) { Element? _createSubjectElement(String subject) {
return Element.html(''' try {
return Element.html('''
<table width="100%" cellpadding="0" cellspacing="0" border="0"> <table width="100%" cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr> <tr>
@@ -51,14 +64,19 @@ class PrintUtils {
</tbody> </tbody>
</table> </table>
'''); ''');
} catch (e) {
logError('PrintUtils::_createSubjectElement: Exception = $e');
return null;
}
} }
Element _createSenderElement({ Element? _createSenderElement({
required String senderName, required String senderName,
required String senderEmailAddress, required String senderEmailAddress,
required String dateTime, required String dateTime,
}) { }) {
return Element.html(''' try {
return Element.html('''
<tr> <tr>
<td> <td>
<font size="-1"><b>$senderName </b>&lt;$senderEmailAddress&gt;</font> <font size="-1"><b>$senderName </b>&lt;$senderEmailAddress&gt;</font>
@@ -66,15 +84,24 @@ class PrintUtils {
<td align="right"><font size="-1">$dateTime</font></td> <td align="right"><font size="-1">$dateTime</font></td>
</tr> </tr>
'''); ''');
} catch (e) {
logError('PrintUtils::_createSenderElement: Exception = $e');
return null;
}
} }
String _createRecipientHtmlTag(String prefix, String emailAddress) { String? _createRecipientHtmlTag(String prefix, String emailAddress) {
Element element = Element.html('<div class="${prefix.toLowerCase()}"></div>'); try {
element.text = '$prefix: $emailAddress'; Element element = Element.html('<div class="${prefix.toLowerCase()}"></div>');
return element.outerHtml; element.text = '$prefix: $emailAddress';
return element.outerHtml;
} catch (e) {
logError('PrintUtils::_createRecipientHtmlTag: Exception = $e');
return '';
}
} }
Element _createRecipientsElement({ Element? _createRecipientsElement({
required String toPrefix, required String toPrefix,
required String ccPrefix, required String ccPrefix,
required String bccPrefix, required String bccPrefix,
@@ -84,7 +111,8 @@ class PrintUtils {
String? bccAddress, String? bccAddress,
String? replyToAddress, String? replyToAddress,
}) { }) {
return Element.html(''' try {
return Element.html('''
<tr> <tr>
<td colspan="2" style="padding-bottom: 4px;" class="recipient"> <td colspan="2" style="padding-bottom: 4px;" class="recipient">
${replyToAddress?.isNotEmpty == true ? _createRecipientHtmlTag(replyToPrefix, replyToAddress!) : ''} ${replyToAddress?.isNotEmpty == true ? _createRecipientHtmlTag(replyToPrefix, replyToAddress!) : ''}
@@ -94,10 +122,15 @@ class PrintUtils {
</td> </td>
</tr> </tr>
'''); ''');
} catch (e) {
logError('PrintUtils::_createRecipientsElement: Exception = $e');
return null;
}
} }
Element _createEmailContentElement(String emailContent) { Element? _createEmailContentElement(String emailContent) {
return Element.html(''' try {
return Element.html('''
<tr> <tr>
<td colspan="2"> <td colspan="2">
<table width="100%" cellpadding="12" cellspacing="0" border="0"> <table width="100%" cellpadding="12" cellspacing="0" border="0">
@@ -110,6 +143,10 @@ class PrintUtils {
</td> </td>
</tr> </tr>
'''); ''');
} catch (e) {
logError('PrintUtils::_createEmailContentElement: Exception = $e');
return null;
}
} }
String _createTitleAttachmentHtmlTag({ String _createTitleAttachmentHtmlTag({
@@ -144,11 +181,12 @@ class PrintUtils {
'''; ''';
} }
Element _createAttachmentsElement({ Element? _createAttachmentsElement({
required String titleAttachment, required String titleAttachment,
required List<PrintAttachment> listAttachment required List<PrintAttachment> listAttachment
}) { }) {
return Element.html(''' try {
return Element.html('''
<table class="attachments" cellspacing="0" cellpadding="5" border="0"> <table class="attachments" cellspacing="0" cellpadding="5" border="0">
<tbody> <tbody>
${_createTitleAttachmentHtmlTag(countAttachments: listAttachment.length, titleAttachment: titleAttachment)} ${_createTitleAttachmentHtmlTag(countAttachments: listAttachment.length, titleAttachment: titleAttachment)}
@@ -156,6 +194,10 @@ class PrintUtils {
</tbody> </tbody>
</table> </table>
'''); ''');
} catch (e) {
logError('PrintUtils::_createAttachmentsElement: Exception = $e');
return null;
}
} }
Future<void> printEmail({ Future<void> printEmail({
@@ -185,18 +227,18 @@ class PrintUtils {
Element messageElement = Element.html('<table width="100%" cellpadding="0" cellspacing="0" border="0" class="message"></table>'); Element messageElement = Element.html('<table width="100%" cellpadding="0" cellspacing="0" border="0" class="message"></table>');
Element messageBodyElement = Element.html('<tbody></tbody>'); Element messageBodyElement = Element.html('<tbody></tbody>');
Element userInfoElement = await _createUserInformationElement( Element? userInfoElement = await _createUserInformationElement(
appName: appName, appName: appName,
userName: userName); userName: userName);
Element subjectElement = _createSubjectElement(subject); Element? subjectElement = _createSubjectElement(subject);
Element senderElement = _createSenderElement( Element? senderElement = _createSenderElement(
senderName: senderName, senderName: senderName,
senderEmailAddress: senderEmailAddress, senderEmailAddress: senderEmailAddress,
dateTime: dateTime); dateTime: dateTime);
Element recipientsElement = _createRecipientsElement( Element? recipientsElement = _createRecipientsElement(
toPrefix: toPrefix, toPrefix: toPrefix,
ccPrefix: ccPrefix, ccPrefix: ccPrefix,
bccPrefix: bccPrefix, bccPrefix: bccPrefix,
@@ -207,40 +249,56 @@ class PrintUtils {
replyToAddress: replyToAddress, replyToAddress: replyToAddress,
); );
Element emailContentElement = _createEmailContentElement(emailContent); Element? emailContentElement = _createEmailContentElement(emailContent);
bodyContainerElement.append(userInfoElement);
bodyContainerElement.append(dividerElement);
mainContentElement.append(subjectElement);
mainContentElement.append(dividerElement);
messageBodyElement.append(senderElement);
messageBodyElement.append(recipientsElement);
messageBodyElement.append(emailContentElement);
if (senderElement != null) {
messageBodyElement.append(senderElement);
}
if (recipientsElement != null) {
messageBodyElement.append(recipientsElement);
}
if (emailContentElement != null) {
messageBodyElement.append(emailContentElement);
}
messageElement.append(messageBodyElement); messageElement.append(messageBodyElement);
if (subjectElement != null) {
mainContentElement.append(subjectElement);
}
if (dividerElement != null) {
mainContentElement.append(dividerElement!);
}
mainContentElement.append(messageElement); mainContentElement.append(messageElement);
if (listAttachment?.isNotEmpty == true) { if (listAttachment?.isNotEmpty == true) {
Element attachmentsElement = _createAttachmentsElement( final attachmentsElement = _createAttachmentsElement(
titleAttachment: titleAttachment, titleAttachment: titleAttachment,
listAttachment: listAttachment!); listAttachment: listAttachment!);
mainContentElement.append(dividerElement);
mainContentElement.append(attachmentsElement); if (dividerElement != null) {
mainContentElement.append(dividerElement!);
}
if (attachmentsElement != null) {
mainContentElement.append(attachmentsElement);
}
} }
if (userInfoElement != null) {
bodyContainerElement.append(userInfoElement);
}
if (dividerElement != null) {
bodyContainerElement.append(dividerElement!);
}
bodyContainerElement.append(mainContentElement); bodyContainerElement.append(mainContentElement);
Element styleElement = Element.html(HtmlTemplate.printDocumentCssStyle);
document.head?.append(styleElement);
document.body?.append(bodyContainerElement); document.body?.append(bodyContainerElement);
Element scriptElement = Element.html(HtmlInteraction.scriptHandleInvokePrinterOnBrowser); Element scriptElement = Element.html(HtmlInteraction.scriptHandleInvokePrinterOnBrowser);
document.body?.append(scriptElement); document.body?.append(scriptElement);
Element styleElement = Element.html(HtmlTemplate.printDocumentCssStyle);
document.head?.append(styleElement);
final htmlDocument = document.outerHtml; final htmlDocument = document.outerHtml;
HtmlUtils.openNewTabHtmlDocument(htmlDocument); HtmlUtils.openNewTabHtmlDocument(htmlDocument);
@@ -44,6 +44,7 @@ import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_sta
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/send_receipt_to_sender_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/send_receipt_to_sender_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart';
@@ -206,6 +207,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
emailLoadedViewState.value = Right<Failure, Success>(success); emailLoadedViewState.value = Right<Failure, Success>(success);
} else if (success is ParseCalendarEventSuccess) { } else if (success is ParseCalendarEventSuccess) {
_handleParseCalendarEventSuccess(success); _handleParseCalendarEventSuccess(success);
} else if (success is PrintEmailLoading) {
_showMessageWhenStartingEmailPrinting();
} }
} }
@@ -226,6 +229,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
_handleParseCalendarEventFailure(failure); _handleParseCalendarEventFailure(failure);
} else if (failure is GetEmailContentFailure) { } else if (failure is GetEmailContentFailure) {
emailLoadedViewState.value = Left<Failure, Success>(failure); emailLoadedViewState.value = Left<Failure, Success>(failure);
} else if (failure is PrintEmailFailure) {
_showMessageWhenEmailPrintingFailed();
} }
} }
@@ -1587,9 +1592,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void _printEmail(BuildContext context, PresentationEmail email) { void _printEmail(BuildContext context, PresentationEmail email) {
if (email.id != _currentEmailLoaded?.emailCurrent?.id) {
log('SingleEmailController::_printEmail: EMAIL ${email.id?.asString} NOT LOADED');
}
final emailPrint = EmailPrint( final emailPrint = EmailPrint(
appName: AppLocalizations.of(context).app_name, appName: AppLocalizations.of(context).app_name,
userName: mailboxDashBoardController.userProfile.value?.email ?? '', userName: mailboxDashBoardController.userProfile.value?.email ?? '',
@@ -1609,4 +1611,22 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
); );
consumeState(_printEmailInteractor.execute(emailPrint)); consumeState(_printEmailInteractor.execute(emailPrint));
} }
void _showMessageWhenStartingEmailPrinting() {
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).printingInProgress,
leadingSVGIconColor: AppColor.primaryColor,
leadingSVGIcon: imagePaths.icPrinter);
}
}
void _showMessageWhenEmailPrintingFailed() {
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastErrorMessage(
currentOverlayContext!,
AppLocalizations.of(currentContext!).printingFailed);
}
}
} }
+13 -1
View File
@@ -1,5 +1,5 @@
{ {
"@@last_modified": "2024-02-28T17:05:44.385016", "@@last_modified": "2024-03-08T11:39:58.409792",
"initializing_data": "Initializing data...", "initializing_data": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -3665,5 +3665,17 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"printingInProgress": "Printing in progress",
"@printingInProgress": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"printingFailed": "Printing failed",
"@printingFailed": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -3819,4 +3819,18 @@ class AppLocalizations {
name: 'replyToEmailAddressPrefix', name: 'replyToEmailAddressPrefix',
); );
} }
String get printingInProgress {
return Intl.message(
'Printing in progress',
name: 'printingInProgress'
);
}
String get printingFailed {
return Intl.message(
'Printing failed',
name: 'printingFailed'
);
}
} }