TF-3427 Fix subject was not in print & click outside context menu can not close

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-01-17 18:30:29 +07:00
committed by Dat H. Pham
parent 778c138a10
commit 395b24e58f
18 changed files with 356 additions and 261 deletions
@@ -1,13 +1,14 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_bar_composer_widget_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnOpenContextMenuAction = Function(RelativeRect position);
class AppBarComposerWidget extends StatelessWidget {
final ImagePaths imagePaths;
final bool isSendButtonEnabled;
final bool isNetworkConnectionAvailable;
final VoidCallback onCloseViewAction;
@@ -17,10 +18,9 @@ class AppBarComposerWidget extends StatelessWidget {
final VoidCallback openRichToolbarAction;
final OnOpenContextMenuAction openContextMenuAction;
final _imagePaths = Get.find<ImagePaths>();
AppBarComposerWidget({
const AppBarComposerWidget({
super.key,
required this.imagePaths,
required this.isSendButtonEnabled,
required this.onCloseViewAction,
required this.sendMessageAction,
@@ -40,7 +40,7 @@ class AppBarComposerWidget extends StatelessWidget {
child: Row(
children: [
TMailButtonWidget.fromIcon(
icon: _imagePaths.icCancel,
icon: imagePaths.icCancel,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).saveAndClose,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -49,7 +49,7 @@ class AppBarComposerWidget extends StatelessWidget {
),
const Spacer(),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icRichToolbar,
icon: imagePaths.icRichToolbar,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.richTextIconSize,
@@ -61,7 +61,7 @@ class AppBarComposerWidget extends StatelessWidget {
...[
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icAttachFile,
icon: imagePaths.icAttachFile,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -70,7 +70,7 @@ class AppBarComposerWidget extends StatelessWidget {
),
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icInsertImage,
icon: imagePaths.icInsertImage,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -81,8 +81,8 @@ class AppBarComposerWidget extends StatelessWidget {
],
TMailButtonWidget.fromIcon(
icon: isSendButtonEnabled
? _imagePaths.icSendMobile
: _imagePaths.icSendDisable,
? imagePaths.icSendMobile
: imagePaths.icSendDisable,
backgroundColor: Colors.transparent,
padding: MobileAppBarComposerWidgetStyle.iconPadding,
iconSize: MobileAppBarComposerWidgetStyle.sendButtonIconSize,
@@ -91,7 +91,7 @@ class AppBarComposerWidget extends StatelessWidget {
),
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icMore,
icon: imagePaths.icMore,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
padding: MobileAppBarComposerWidgetStyle.iconPadding,
@@ -1,13 +1,13 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_bar_composer_widget_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class LandscapeAppBarComposerWidget extends StatelessWidget {
final ImagePaths imagePaths;
final bool isSendButtonEnabled;
final bool isNetworkConnectionAvailable;
final VoidCallback onCloseViewAction;
@@ -17,10 +17,9 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
final VoidCallback openRichToolbarAction;
final OnOpenContextMenuAction openContextMenuAction;
final _imagePaths = Get.find<ImagePaths>();
LandscapeAppBarComposerWidget({
const LandscapeAppBarComposerWidget({
super.key,
required this.imagePaths,
required this.isSendButtonEnabled,
required this.onCloseViewAction,
required this.sendMessageAction,
@@ -43,7 +42,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
child: Row(
children: [
TMailButtonWidget.fromIcon(
icon: _imagePaths.icCancel,
icon: imagePaths.icCancel,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).saveAndClose,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -52,7 +51,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
),
const Spacer(),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icRichToolbar,
icon: imagePaths.icRichToolbar,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.richTextIconSize,
@@ -64,7 +63,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
...[
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icAttachFile,
icon: imagePaths.icAttachFile,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -73,7 +72,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
),
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icInsertImage,
icon: imagePaths.icInsertImage,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
@@ -84,8 +83,8 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
],
TMailButtonWidget.fromIcon(
icon: isSendButtonEnabled
? _imagePaths.icSendMobile
: _imagePaths.icSendDisable,
? imagePaths.icSendMobile
: imagePaths.icSendDisable,
backgroundColor: Colors.transparent,
padding: MobileAppBarComposerWidgetStyle.iconPadding,
iconSize: MobileAppBarComposerWidgetStyle.sendButtonIconSize,
@@ -94,7 +93,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget {
),
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: _imagePaths.icMore,
icon: imagePaths.icMore,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
padding: MobileAppBarComposerWidgetStyle.iconPadding,
@@ -1,8 +1,11 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:custom_pop_up_menu/custom_pop_up_menu.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/base/widget/highlight_svg_icon_on_hover.dart';
import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart';
import 'package:tmail_ui_user/features/base/widget/popup_menu_overlay_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/web/bottom_bar_composer_widget_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class BottomBarComposerWidget extends StatelessWidget {
@@ -12,13 +15,16 @@ class BottomBarComposerWidget extends StatelessWidget {
final bool isPrintDraftEnabled;
final bool isFormattingOptionsEnabled;
final bool hasReadReceipt;
final CustomPopupMenuController menuMoreOptionController;
final VoidCallback openRichToolbarAction;
final VoidCallback attachFileAction;
final VoidCallback insertImageAction;
final VoidCallback deleteComposerAction;
final VoidCallback saveToDraftAction;
final VoidCallback sendMessageAction;
final OnOpenContextMenuAction openContextMenuAction;
final VoidCallback toggleCodeViewAction;
final VoidCallback toggleRequestReadReceiptAction;
final VoidCallback printDraftAction;
const BottomBarComposerWidget({
super.key,
@@ -27,13 +33,16 @@ class BottomBarComposerWidget extends StatelessWidget {
required this.isPrintDraftEnabled,
required this.isFormattingOptionsEnabled,
required this.hasReadReceipt,
required this.menuMoreOptionController,
required this.openRichToolbarAction,
required this.attachFileAction,
required this.insertImageAction,
required this.deleteComposerAction,
required this.saveToDraftAction,
required this.sendMessageAction,
required this.openContextMenuAction,
required this.toggleCodeViewAction,
required this.toggleRequestReadReceiptAction,
required this.printDraftAction,
});
@override
@@ -84,13 +93,56 @@ class BottomBarComposerWidget extends StatelessWidget {
),
),
const SizedBox(width: BottomBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: imagePaths.icMore,
iconColor: BottomBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: BottomBarComposerWidgetStyle.iconSize,
tooltipMessage: AppLocalizations.of(context).more,
onTapActionAtPositionCallback: openContextMenuAction,
PopupMenuOverlayWidget(
controller: menuMoreOptionController,
iconButton: HighlightSVGIconOnHover(
icon: imagePaths.icMore,
size: BottomBarComposerWidgetStyle.iconSize,
iconColor: BottomBarComposerWidgetStyle.iconColor,
tooltipMessage: AppLocalizations.of(context).more,
),
listButtonAction: [
PopupItemWidget(
imagePaths.icStyleCodeView,
AppLocalizations.of(context).embedCode,
styleName: BottomBarComposerWidgetStyle.popupItemTextStyle,
colorIcon: BottomBarComposerWidgetStyle.iconColor,
padding: BottomBarComposerWidgetStyle.popupItemPadding,
selectedIcon: imagePaths.icFilterSelected,
isSelected: isCodeViewEnabled,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
toggleCodeViewAction();
},
),
PopupItemWidget(
imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt,
styleName: BottomBarComposerWidgetStyle.popupItemTextStyle,
padding: BottomBarComposerWidgetStyle.popupItemPadding,
colorIcon: BottomBarComposerWidgetStyle.iconColor,
selectedIcon: imagePaths.icFilterSelected,
isSelected: hasReadReceipt,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
toggleRequestReadReceiptAction();
},
),
if (isPrintDraftEnabled)
PopupItemWidget(
imagePaths.icPrinter,
AppLocalizations.of(context).print,
colorIcon: BottomBarComposerWidgetStyle.iconColor,
styleName: BottomBarComposerWidgetStyle.popupItemTextStyle,
padding: BottomBarComposerWidgetStyle.popupItemPadding,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
printDraftAction();
},
),
],
arrangeAsList: true,
position: null,
),
const Spacer(),
TMailButtonWidget.fromIcon(
@@ -1,23 +1,32 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:custom_pop_up_menu/custom_pop_up_menu.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/base/widget/highlight_svg_icon_on_hover.dart';
import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart';
import 'package:tmail_ui_user/features/base/widget/popup_menu_overlay_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_bar_composer_widget_style.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
typedef OnOpenContextMenuAction = Function(RelativeRect position);
class MobileResponsiveAppBarComposerWidget extends StatelessWidget {
final ImagePaths imagePaths;
final bool isCodeViewEnabled;
final bool isSendButtonEnabled;
final bool isFormattingOptionsEnabled;
final bool hasRequestReadReceipt;
final bool isPrintDraftEnabled;
final CustomPopupMenuController menuMoreOptionController;
final VoidCallback onCloseViewAction;
final VoidCallback attachFileAction;
final VoidCallback insertImageAction;
final VoidCallback sendMessageAction;
final OnOpenContextMenuAction openContextMenuAction;
final VoidCallback openRichToolbarAction;
final VoidCallback toggleCodeViewAction;
final VoidCallback toggleRequestReadReceiptAction;
final VoidCallback printDraftAction;
final VoidCallback saveToDraftsAction;
final VoidCallback deleteComposerAction;
const MobileResponsiveAppBarComposerWidget({
super.key,
@@ -25,12 +34,19 @@ class MobileResponsiveAppBarComposerWidget extends StatelessWidget {
required this.isCodeViewEnabled,
required this.isFormattingOptionsEnabled,
required this.isSendButtonEnabled,
required this.hasRequestReadReceipt,
required this.isPrintDraftEnabled,
required this.menuMoreOptionController,
required this.openRichToolbarAction,
required this.onCloseViewAction,
required this.attachFileAction,
required this.insertImageAction,
required this.sendMessageAction,
required this.openContextMenuAction,
required this.toggleCodeViewAction,
required this.toggleRequestReadReceiptAction,
required this.printDraftAction,
required this.saveToDraftsAction,
required this.deleteComposerAction,
});
@override
@@ -94,13 +110,78 @@ class MobileResponsiveAppBarComposerWidget extends StatelessWidget {
onTapActionCallback: sendMessageAction,
),
const SizedBox(width: MobileAppBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: imagePaths.icMore,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
iconSize: MobileAppBarComposerWidgetStyle.iconSize,
tooltipMessage: AppLocalizations.of(context).more,
onTapActionAtPositionCallback: openContextMenuAction,
PopupMenuOverlayWidget(
controller: menuMoreOptionController,
iconButton: HighlightSVGIconOnHover(
icon: imagePaths.icMore,
size: MobileAppBarComposerWidgetStyle.iconSize,
iconColor: MobileAppBarComposerWidgetStyle.iconColor,
tooltipMessage: AppLocalizations.of(context).more,
),
listButtonAction: [
PopupItemWidget(
imagePaths.icStyleCodeView,
AppLocalizations.of(context).embedCode,
styleName: MobileAppBarComposerWidgetStyle.popupItemTextStyle,
colorIcon: MobileAppBarComposerWidgetStyle.iconColor,
padding: MobileAppBarComposerWidgetStyle.popupItemPadding,
selectedIcon: imagePaths.icFilterSelected,
isSelected: isCodeViewEnabled,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
toggleCodeViewAction();
},
),
PopupItemWidget(
imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt,
styleName: MobileAppBarComposerWidgetStyle.popupItemTextStyle,
padding: MobileAppBarComposerWidgetStyle.popupItemPadding,
colorIcon: MobileAppBarComposerWidgetStyle.popupItemIconColor,
selectedIcon: imagePaths.icFilterSelected,
isSelected: hasRequestReadReceipt,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
toggleRequestReadReceiptAction();
},
),
if (isPrintDraftEnabled)
PopupItemWidget(
imagePaths.icPrinter,
AppLocalizations.of(context).print,
colorIcon: MobileAppBarComposerWidgetStyle.popupItemIconColor,
styleName: MobileAppBarComposerWidgetStyle.popupItemTextStyle,
padding: MobileAppBarComposerWidgetStyle.popupItemPadding,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
printDraftAction();
},
),
PopupItemWidget(
imagePaths.icSaveToDraft,
AppLocalizations.of(context).saveAsDraft,
colorIcon: MobileAppBarComposerWidgetStyle.popupItemIconColor,
styleName: MobileAppBarComposerWidgetStyle.popupItemTextStyle,
padding: MobileAppBarComposerWidgetStyle.popupItemPadding,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
saveToDraftsAction();
},
),
PopupItemWidget(
imagePaths.icDeleteMailbox,
AppLocalizations.of(context).delete,
colorIcon: MobileAppBarComposerWidgetStyle.popupItemIconColor,
styleName: MobileAppBarComposerWidgetStyle.popupItemTextStyle,
padding: MobileAppBarComposerWidgetStyle.popupItemPadding,
onCallbackAction: () {
menuMoreOptionController.hideMenu();
deleteComposerAction();
},
),
],
arrangeAsList: true,
position: null,
),
],
),
@@ -212,6 +212,7 @@ class ToolbarRichTextWebBuilder extends StatelessWidget with RichTextButtonMixin
_imagePaths,
(paragraph) => richTextWebController.applyParagraphType(paragraph)))
.toList(),
padding: const EdgeInsets.symmetric(horizontal: 5),
iconButton: buildWrapIconStyleText(
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
spacing: 3,
@@ -235,6 +236,7 @@ class ToolbarRichTextWebBuilder extends StatelessWidget with RichTextButtonMixin
_imagePaths,
(orderType) => richTextWebController.applyOrderListType(orderType)))
.toList(),
padding: const EdgeInsets.symmetric(horizontal: 5),
iconButton: buildWrapIconStyleText(
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
spacing: 3,