TF-3479 Add hide button for composer
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -1609,10 +1609,10 @@ class ComposerController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
void displayScreenTypeComposerAction(ScreenDisplayMode displayMode) async {
|
void displayScreenTypeComposerAction(ScreenDisplayMode displayMode) async {
|
||||||
if (screenDisplayMode.value == ScreenDisplayMode.minimize) {
|
if (screenDisplayMode.value.isNotContentVisible()) {
|
||||||
_isEmailBodyLoaded = false;
|
_isEmailBodyLoaded = false;
|
||||||
}
|
}
|
||||||
if (richTextWebController != null && screenDisplayMode.value != ScreenDisplayMode.minimize) {
|
if (richTextWebController != null && !screenDisplayMode.value.isNotContentVisible()) {
|
||||||
final textCurrent = await richTextWebController!.editorController.getText();
|
final textCurrent = await richTextWebController!.editorController.getText();
|
||||||
richTextWebController!.editorController.setText(textCurrent);
|
richTextWebController!.editorController.setText(textCurrent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -641,6 +641,7 @@ class ComposerView extends GetWidget<ComposerController> {
|
|||||||
},
|
},
|
||||||
composerManager: controller.mailboxDashBoardController.composerManager,
|
composerManager: controller.mailboxDashBoardController.composerManager,
|
||||||
responsiveUtils: controller.responsiveUtils,
|
responsiveUtils: controller.responsiveUtils,
|
||||||
|
imagePaths: controller.imagePaths,
|
||||||
displayMode: controller.screenDisplayMode.value,
|
displayMode: controller.screenDisplayMode.value,
|
||||||
emailSubject: controller.subjectEmail.value ?? '',
|
emailSubject: controller.subjectEmail.value ?? '',
|
||||||
onCloseViewAction: () => controller.handleClickCloseComposer(context),
|
onCloseViewAction: () => controller.handleClickCloseComposer(context),
|
||||||
|
|||||||
@@ -189,6 +189,11 @@ class ComposerManager extends GetxController {
|
|||||||
}) {
|
}) {
|
||||||
if (composerIdsQueue.isEmpty) return;
|
if (composerIdsQueue.isEmpty) return;
|
||||||
|
|
||||||
|
if (newDisplayMode.isNotContentVisible()) {
|
||||||
|
composers.refresh();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var (availableScreenWidth, totalOpenedComposersWidth, composerControllers) =
|
var (availableScreenWidth, totalOpenedComposersWidth, composerControllers) =
|
||||||
_getSizeToArrangeComposer(screenWidth: screenWidth);
|
_getSizeToArrangeComposer(screenWidth: screenWidth);
|
||||||
|
|
||||||
@@ -245,6 +250,10 @@ class ComposerManager extends GetxController {
|
|||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get isAllHiddenComposer {
|
||||||
|
return composerIdsQueue.every((id) => getComposerView(id).controller.isHiddenScreen);
|
||||||
|
}
|
||||||
|
|
||||||
List<String> get hiddenComposerIds {
|
List<String> get hiddenComposerIds {
|
||||||
return composerIdsQueue
|
return composerIdsQueue
|
||||||
.where((id) => getComposerView(id).controller.isHiddenScreen)
|
.where((id) => getComposerView(id).controller.isHiddenScreen)
|
||||||
|
|||||||
@@ -4,4 +4,6 @@ enum ScreenDisplayMode {
|
|||||||
minimize,
|
minimize,
|
||||||
normal,
|
normal,
|
||||||
hidden;
|
hidden;
|
||||||
|
|
||||||
|
bool isNotContentVisible() => this == minimize || this == hidden;
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,7 @@ class ComposerStyle {
|
|||||||
static const double keyboardToolBarHeight = 200;
|
static const double keyboardToolBarHeight = 200;
|
||||||
static const double popupMenuRadius = 8;
|
static const double popupMenuRadius = 8;
|
||||||
static const double suggestionItemHeight = 60;
|
static const double suggestionItemHeight = 60;
|
||||||
static const double normalWidth = 725;
|
static const double normalWidth = 600;
|
||||||
static const double normalHeight = 525;
|
static const double normalHeight = 525;
|
||||||
static const double minimizeWidth = 400;
|
static const double minimizeWidth = 400;
|
||||||
static const double minimizeHeight = 52;
|
static const double minimizeHeight = 52;
|
||||||
|
|||||||
@@ -35,7 +35,27 @@ class ComposerOverlayView extends StatelessWidget {
|
|||||||
if (fullScreenComposerView != null) return fullScreenComposerView;
|
if (fullScreenComposerView != null) return fullScreenComposerView;
|
||||||
|
|
||||||
if (composerIdsQueue.length == 1) {
|
if (composerIdsQueue.length == 1) {
|
||||||
return _composerManager.getComposerView(composerIdsQueue.first);
|
final composerView = _composerManager.getComposerView(composerIdsQueue.first);
|
||||||
|
|
||||||
|
if (composerView.controller.isHiddenScreen) {
|
||||||
|
return Align(
|
||||||
|
alignment: AlignmentDirectional.bottomEnd,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsetsDirectional.all(ComposerStyle.padding),
|
||||||
|
child: ExpandComposerButton(
|
||||||
|
countComposerHidden: 1,
|
||||||
|
onRemoveHiddenComposerItem: (controller) =>
|
||||||
|
controller.handleClickCloseComposer(context),
|
||||||
|
onShowComposerAction: _composerManager.showComposerIfHidden,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return composerView;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final countComposerHidden = _composerManager.countComposerHidden;
|
final countComposerHidden = _composerManager.countComposerHidden;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||||
@@ -9,6 +10,7 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/web/minimiz
|
|||||||
class DesktopResponsiveContainerView extends StatelessWidget {
|
class DesktopResponsiveContainerView extends StatelessWidget {
|
||||||
|
|
||||||
final ResponsiveUtils responsiveUtils;
|
final ResponsiveUtils responsiveUtils;
|
||||||
|
final ImagePaths imagePaths;
|
||||||
final ComposerManager composerManager;
|
final ComposerManager composerManager;
|
||||||
final ScreenDisplayMode displayMode;
|
final ScreenDisplayMode displayMode;
|
||||||
final String emailSubject;
|
final String emailSubject;
|
||||||
@@ -21,6 +23,7 @@ class DesktopResponsiveContainerView extends StatelessWidget {
|
|||||||
required this.childBuilder,
|
required this.childBuilder,
|
||||||
required this.composerManager,
|
required this.composerManager,
|
||||||
required this.responsiveUtils,
|
required this.responsiveUtils,
|
||||||
|
required this.imagePaths,
|
||||||
required this.displayMode,
|
required this.displayMode,
|
||||||
required this.emailSubject,
|
required this.emailSubject,
|
||||||
required this.onCloseViewAction,
|
required this.onCloseViewAction,
|
||||||
@@ -32,6 +35,7 @@ class DesktopResponsiveContainerView extends StatelessWidget {
|
|||||||
if (displayMode == ScreenDisplayMode.minimize) {
|
if (displayMode == ScreenDisplayMode.minimize) {
|
||||||
final composerWidget = PointerInterceptor(
|
final composerWidget = PointerInterceptor(
|
||||||
child: MinimizeComposerWidget(
|
child: MinimizeComposerWidget(
|
||||||
|
imagePaths: imagePaths,
|
||||||
emailSubject: emailSubject,
|
emailSubject: emailSubject,
|
||||||
onCloseViewAction: onCloseViewAction,
|
onCloseViewAction: onCloseViewAction,
|
||||||
onChangeDisplayModeAction: onChangeDisplayModeAction,
|
onChangeDisplayModeAction: onChangeDisplayModeAction,
|
||||||
|
|||||||
@@ -35,6 +35,16 @@ class DesktopAppBarComposerWidget extends StatelessWidget {
|
|||||||
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
|
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
|
||||||
if (onChangeDisplayModeAction != null)
|
if (onChangeDisplayModeAction != null)
|
||||||
... [
|
... [
|
||||||
|
TMailButtonWidget.fromIcon(
|
||||||
|
icon: imagePaths.icDoubleArrowDown,
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
tooltipMessage: AppLocalizations.of(context).hide,
|
||||||
|
iconSize: AppBarComposerWidgetStyle.iconSize,
|
||||||
|
iconColor: AppBarComposerWidgetStyle.iconColor,
|
||||||
|
padding: AppBarComposerWidgetStyle.iconPadding,
|
||||||
|
onTapActionCallback: () => onChangeDisplayModeAction!(ScreenDisplayMode.hidden),
|
||||||
|
),
|
||||||
|
const SizedBox(width: AppBarComposerWidgetStyle.space),
|
||||||
TMailButtonWidget.fromIcon(
|
TMailButtonWidget.fromIcon(
|
||||||
icon: imagePaths.icMinimize,
|
icon: imagePaths.icMinimize,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
|
|||||||
@@ -89,6 +89,8 @@ class _ExpandComposerButtonState extends State<ExpandComposerButton> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final isAllHiddenComposer = _composerManager.isAllHiddenComposer;
|
||||||
|
|
||||||
return PortalTarget(
|
return PortalTarget(
|
||||||
visible: _visible,
|
visible: _visible,
|
||||||
portalFollower: GestureDetector(
|
portalFollower: GestureDetector(
|
||||||
@@ -96,10 +98,16 @@ class _ExpandComposerButtonState extends State<ExpandComposerButton> {
|
|||||||
onTap: () => setState(() => _visible = false),
|
onTap: () => setState(() => _visible = false),
|
||||||
),
|
),
|
||||||
child: PortalTarget(
|
child: PortalTarget(
|
||||||
anchor: const Aligned(
|
anchor: Aligned(
|
||||||
follower: Alignment.bottomLeft,
|
follower: isAllHiddenComposer
|
||||||
target: Alignment.topLeft,
|
? Alignment.bottomRight
|
||||||
offset: Offset(0.0, 0.0),
|
: Alignment.bottomLeft,
|
||||||
|
target: isAllHiddenComposer
|
||||||
|
? Alignment.topRight
|
||||||
|
: Alignment.topLeft,
|
||||||
|
offset: isAllHiddenComposer
|
||||||
|
? const Offset(16.0, 0.0)
|
||||||
|
: const Offset(0.0, 0.0),
|
||||||
),
|
),
|
||||||
portalFollower: HiddenComposerListViewOverlay(
|
portalFollower: HiddenComposerListViewOverlay(
|
||||||
composerManager: _composerManager,
|
composerManager: _composerManager,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:core/presentation/resources/image_paths.dart';
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
import 'package:core/presentation/views/button/tmail_button_widget.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/model/screen_display_mode.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/styles/minimize_composer_widget_style.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/styles/minimize_composer_widget_style.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/widgets/title_composer_widget.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/widgets/title_composer_widget.dart';
|
||||||
@@ -11,14 +10,14 @@ typedef OnChangeDisplayModeAction = Function(ScreenDisplayMode mode);
|
|||||||
|
|
||||||
class MinimizeComposerWidget extends StatelessWidget {
|
class MinimizeComposerWidget extends StatelessWidget {
|
||||||
|
|
||||||
|
final ImagePaths imagePaths;
|
||||||
final OnChangeDisplayModeAction onChangeDisplayModeAction;
|
final OnChangeDisplayModeAction onChangeDisplayModeAction;
|
||||||
final VoidCallback onCloseViewAction;
|
final VoidCallback onCloseViewAction;
|
||||||
final String emailSubject;
|
final String emailSubject;
|
||||||
|
|
||||||
final _imagePaths = Get.find<ImagePaths>();
|
const MinimizeComposerWidget({
|
||||||
|
|
||||||
MinimizeComposerWidget({
|
|
||||||
super.key,
|
super.key,
|
||||||
|
required this.imagePaths,
|
||||||
required this.emailSubject,
|
required this.emailSubject,
|
||||||
required this.onChangeDisplayModeAction,
|
required this.onChangeDisplayModeAction,
|
||||||
required this.onCloseViewAction,
|
required this.onCloseViewAction,
|
||||||
@@ -40,7 +39,7 @@ class MinimizeComposerWidget extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
TMailButtonWidget.fromIcon(
|
TMailButtonWidget.fromIcon(
|
||||||
icon: _imagePaths.icCancel,
|
icon: imagePaths.icCancel,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
tooltipMessage: AppLocalizations.of(context).saveAndClose,
|
tooltipMessage: AppLocalizations.of(context).saveAndClose,
|
||||||
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
||||||
@@ -50,7 +49,7 @@ class MinimizeComposerWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
||||||
TMailButtonWidget.fromIcon(
|
TMailButtonWidget.fromIcon(
|
||||||
icon: _imagePaths.icFullScreen,
|
icon: imagePaths.icFullScreen,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
tooltipMessage: AppLocalizations.of(context).fullscreen,
|
tooltipMessage: AppLocalizations.of(context).fullscreen,
|
||||||
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
||||||
@@ -60,7 +59,7 @@ class MinimizeComposerWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
||||||
TMailButtonWidget.fromIcon(
|
TMailButtonWidget.fromIcon(
|
||||||
icon: _imagePaths.icChevronUp,
|
icon: imagePaths.icChevronUp,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
tooltipMessage: AppLocalizations.of(context).show,
|
tooltipMessage: AppLocalizations.of(context).show,
|
||||||
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
||||||
@@ -69,6 +68,16 @@ class MinimizeComposerWidget extends StatelessWidget {
|
|||||||
onTapActionCallback: () => onChangeDisplayModeAction(ScreenDisplayMode.normal)
|
onTapActionCallback: () => onChangeDisplayModeAction(ScreenDisplayMode.normal)
|
||||||
),
|
),
|
||||||
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
||||||
|
TMailButtonWidget.fromIcon(
|
||||||
|
icon: imagePaths.icDoubleArrowDown,
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
tooltipMessage: AppLocalizations.of(context).hide,
|
||||||
|
iconSize: MinimizeComposerWidgetStyle.iconSize,
|
||||||
|
iconColor: MinimizeComposerWidgetStyle.iconColor,
|
||||||
|
padding: MinimizeComposerWidgetStyle.iconPadding,
|
||||||
|
onTapActionCallback: () => onChangeDisplayModeAction(ScreenDisplayMode.hidden),
|
||||||
|
),
|
||||||
|
const SizedBox(width: MinimizeComposerWidgetStyle.space),
|
||||||
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
|
Expanded(child: TitleComposerWidget(emailSubject: emailSubject)),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -826,7 +826,7 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
|
|
||||||
void hideMailboxMenuWhenScreenSizeChange(BuildContext context) {
|
void hideMailboxMenuWhenScreenSizeChange(BuildContext context) {
|
||||||
if (isDrawerOpen && responsiveUtils.isWebDesktop(context)) {
|
if (responsiveUtils.isWebDesktop(context) && isDrawerOpen) {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
closeMailboxMenuDrawer();
|
closeMailboxMenuDrawer();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user