TF-4013 Collapse all recipients fields when unfocus

(cherry picked from commit cd2c2db33a242d22a06265dca5fa4601753957ab)
This commit is contained in:
dab246
2025-10-06 12:46:53 +07:00
committed by Dat H. Pham
parent 7ef7aae2ce
commit dd1d1f10fd
14 changed files with 705 additions and 369 deletions
@@ -7,8 +7,8 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/base/widget/default_field/default_autocomplete_input_field_widget.dart';
import 'package:tmail_ui_user/features/base/widget/default_field/default_draggable_tag_widget.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/draggable_recipient_tag_widget.dart';
import 'package:tmail_ui_user/features/base/model/filter_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/autocomplete_tag_item_web_style.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/avatar_tag_item_widget.dart';
@@ -71,11 +71,11 @@ class DefaultAutocompleteTagItemWidget extends StatelessWidget {
emailAddress: currentEmailAddress,
filterField: field,
),
feedback: DraggableRecipientTagWidget(
feedback: DefaultDraggableTagWidget(
emailAddress: currentEmailAddress,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
),
childWhenDragging: DraggableRecipientTagWidget(
childWhenDragging: DefaultDraggableTagWidget(
emailAddress: currentEmailAddress,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
),
@@ -0,0 +1,67 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/extensions/string_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/avatar/gradient_circle_avatar_icon.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart';
import 'package:tmail_ui_user/features/base/widget/default_field/default_draggable_tag_widget_style.dart';
class DefaultDraggableTagWidget extends StatelessWidget {
final EmailAddress emailAddress;
final EdgeInsetsGeometry? padding;
final _imagePaths = Get.find<ImagePaths>();
DefaultDraggableTagWidget({
super.key,
required this.emailAddress,
this.padding,
});
@override
Widget build(BuildContext context) {
return MouseRegion(
cursor: SystemMouseCursors.grab,
child: Container(
decoration: const ShapeDecoration(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(DefaultDraggableTagWidgetStyle.radius),
),
),
color: DefaultDraggableTagWidgetStyle.backgroundColor,
),
padding: padding ?? DefaultDraggableTagWidgetStyle.padding,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (emailAddress.emailAddress.isNotEmpty)
GradientCircleAvatarIcon(
colors: emailAddress.avatarColors,
label: emailAddress.emailAddress.firstCharacterToUpperCase,
labelFontSize:
DefaultDraggableTagWidgetStyle.avatarLabelFontSize,
iconSize: DefaultDraggableTagWidgetStyle.avatarIconSize,
),
Padding(
padding: DefaultDraggableTagWidgetStyle.labelPadding,
child: DefaultTextStyle(
style: DefaultDraggableTagWidgetStyle.labelTextStyle,
child: Text(emailAddress.asString()),
),
),
SvgPicture.asset(
_imagePaths.icClose,
colorFilter:
DefaultDraggableTagWidgetStyle.deleteIconColor.asFilter(),
fit: BoxFit.fill,
)
],
),
),
);
}
}
@@ -0,0 +1,22 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:flutter/material.dart';
class DefaultDraggableTagWidgetStyle {
static const double radius = 10;
static const double avatarIconSize = 24;
static const double avatarLabelFontSize = 12;
static const Color deleteIconColor = Colors.white;
static const Color backgroundColor = AppColor.primaryColor;
static const EdgeInsetsGeometry padding = EdgeInsets.symmetric(horizontal: 6, vertical: 3);
static const EdgeInsetsGeometry labelPadding = EdgeInsets.symmetric(horizontal: 8);
static TextStyle labelTextStyle = ThemeUtils.defaultTextStyleInterFont.copyWith(
color: Colors.white,
fontSize: 17,
fontWeight: FontWeight.normal
);
}
@@ -149,20 +149,26 @@ class _SmartInteractionWidgetState extends State<SmartInteractionWidget> {
_lastPointerEventOffset = event.position;
}
},
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onDoubleTap: _handleDoubleTap,
onTap: _handleOnTapAction,
child: widget.child,
),
),
);
} else {
return MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
key: _childKey,
behavior: HitTestBehavior.opaque,
onDoubleTap: _handleDoubleTap,
onTap: _handleOnTapAction,
child: widget.child,
),
);
} else {
return GestureDetector(
key: _childKey,
behavior: HitTestBehavior.opaque,
onDoubleTap: _handleDoubleTap,
onTap: _handleOnTapAction,
child: widget.child,
);
}
} else {
return GestureDetector(