Apply new design for recover deleted emails

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-11 01:34:17 +07:00
committed by Dat H. Pham
parent da29ff01e3
commit 42339a3003
35 changed files with 1542 additions and 1795 deletions
@@ -1,134 +0,0 @@
import 'package:core/core.dart';
import 'package:core/utils/direction_utils.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/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/mailbox_dashboard/presentation/model/search/advanced_search_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';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/text_field_autocomplete_email_address_web.dart';
class AutoCompleteTagItemWidgetWeb extends StatelessWidget {
final bool isCollapsed;
final bool isLatestTagFocused;
final bool isLatestEmail;
final AdvancedSearchFilterField field;
final EmailAddress currentEmailAddress;
final List<EmailAddress> currentListEmailAddress;
final List<EmailAddress> collapsedListEmailAddress;
final OnDeleteTagAction? onDeleteTagAction;
final OnShowFullListEmailAddressAction? onShowFullAction;
final _imagePaths = Get.find<ImagePaths>();
AutoCompleteTagItemWidgetWeb({
Key? key,
required this.field,
required this.currentEmailAddress,
required this.currentListEmailAddress,
required this.collapsedListEmailAddress,
this.isCollapsed = false,
this.isLatestTagFocused = false,
this.isLatestEmail = false,
this.onDeleteTagAction,
this.onShowFullAction,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Stack(
alignment: AlignmentDirectional.centerEnd,
children: [
Padding(
padding: EdgeInsetsDirectional.only(
top: AutoCompleteTagItemWebStyle.paddingTop,
end: isCollapsed ? AutoCompleteTagItemWebStyle.paddingEnd : 0,
),
child: Draggable<DraggableEmailAddress>(
data: DraggableEmailAddress(
emailAddress: currentEmailAddress,
prefix: field.getPrefixEmailAddress()
),
feedback: DraggableRecipientTagWidget(
emailAddress: currentEmailAddress,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
),
childWhenDragging: DraggableRecipientTagWidget(
emailAddress: currentEmailAddress,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),
),
child: TextFieldTapRegion(
child: InkWell(
onTap: () => isCollapsed
? onShowFullAction?.call(field)
: null,
child: MouseRegion(
cursor: SystemMouseCursors.grab,
child: Chip(
labelPadding: EdgeInsetsDirectional.symmetric(
horizontal: AutoCompleteTagItemWebStyle.labelPaddingHorizontal,
vertical: DirectionUtils.isDirectionRTLByHasAnyRtl(currentEmailAddress.asString()) ? 0 : 2
),
label: Text(
currentEmailAddress.asString(),
maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
),
deleteIcon: SvgPicture.asset(
_imagePaths.icClose,
fit: BoxFit.fill,
),
padding: EdgeInsets.zero,
labelStyle: AutoCompleteTagItemWebStyle.labelTextStyle,
backgroundColor: _getTagBackgroundColor(),
shape: RoundedRectangleBorder(
borderRadius: AutoCompleteTagItemWebStyle.shapeBorderRadius,
side: _getTagBorderSide(),
),
avatar: currentEmailAddress.emailAddress.isNotEmpty
? AvatarTagItemWidget(tagName: currentEmailAddress.emailAddress)
: null,
onDeleted: () => onDeleteTagAction?.call(currentEmailAddress),
),
),
),
),
),
),
if (isCollapsed)
TMailButtonWidget.fromText(
margin: AutoCompleteTagItemWebStyle.marginCollapsed,
text: '+${currentListEmailAddress.length - collapsedListEmailAddress.length}',
onTapActionCallback: () => onShowFullAction?.call(field),
borderRadius: 10,
textStyle: AutoCompleteTagItemWebStyle.collapsedTextStyle,
padding: AutoCompleteTagItemWebStyle.collapsedPadding,
backgroundColor: AutoCompleteTagItemWebStyle.collapsedBackgroundColor,
)
],
);
}
Color _getTagBackgroundColor() {
if (isLatestTagFocused && isLatestEmail) {
return AppColor.colorItemRecipientSelected;
} else {
return AppColor.colorEmailAddressTag;
}
}
BorderSide _getTagBorderSide() {
if (isLatestTagFocused && isLatestEmail) {
return const BorderSide(width: 1, color: AppColor.primaryColor);
} else {
return const BorderSide(width: 0, color: AppColor.colorEmailAddressTag);
}
}
}
@@ -1,140 +0,0 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/advanced_search_input_form_style.dart';
class DateDropDownButton extends StatelessWidget {
final ImagePaths imagePaths;
final DateTime? startDate;
final DateTime? endDate;
final EmailReceiveTimeType? receiveTimeSelected;
final Function(EmailReceiveTimeType)? onReceiveTimeSelected;
const DateDropDownButton(
this.imagePaths, {
Key? key,
this.startDate,
this.endDate,
this.receiveTimeSelected,
this.onReceiveTimeSelected,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return DropdownButtonHideUnderline(
child: PointerInterceptor(
child: DropdownButton2<EmailReceiveTimeType>(
isExpanded: true,
items: EmailReceiveTimeType.values
.map((item) => _buildItemMenu(context, item))
.toList(),
value: receiveTimeSelected,
customButton: Container(
height: AdvancedSearchInputFormStyle.inputFieldHeight,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(
Radius.circular(AdvancedSearchInputFormStyle.inputFieldBorderRadius),
),
border: Border.all(
color: AdvancedSearchInputFormStyle.inputFieldBorderColor,
width: AdvancedSearchInputFormStyle.inputFieldBorderWidth,
),
color: AdvancedSearchInputFormStyle.inputFieldBackgroundColor,
),
padding: const EdgeInsetsDirectional.only(start: 12, end: 8),
child: Row(children: [
Expanded(child: Text(
receiveTimeSelected?.getTitle(context, startDate: startDate, endDate: endDate) ?? '',
style: AdvancedSearchInputFormStyle.inputTextStyle,
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
)),
SvgPicture.asset(imagePaths.icDropDown)
]),
),
onChanged: (value) {
if (value != null) {
onReceiveTimeSelected?.call(value);
}
},
buttonStyleData: ButtonStyleData(
height: AdvancedSearchInputFormStyle.inputFieldHeight,
padding: const EdgeInsetsDirectional.only(start: 12, end: 8),
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(
Radius.circular(AdvancedSearchInputFormStyle.inputFieldBorderRadius),
),
border: Border.all(
color: AdvancedSearchInputFormStyle.inputFieldBorderColor,
width: AdvancedSearchInputFormStyle.inputFieldBorderWidth,
),
color: AdvancedSearchInputFormStyle.inputFieldBackgroundColor,
)
),
dropdownStyleData: DropdownStyleData(
maxHeight: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white),
elevation: 4,
offset: const Offset(0.0, -8.0),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(40),
thickness: WidgetStateProperty.all<double>(6),
thumbVisibility: WidgetStateProperty.all<bool>(true),
),
),
iconStyleData: IconStyleData(
icon: SvgPicture.asset(imagePaths.icDropDown),
),
menuItemStyleData: const MenuItemStyleData(
height: 44,
padding: EdgeInsets.symmetric(horizontal: 12),
)
),
),
);
}
DropdownMenuItem<EmailReceiveTimeType> _buildItemMenu(
BuildContext context,
EmailReceiveTimeType receiveTime
) {
return DropdownMenuItem<EmailReceiveTimeType>(
value: receiveTime,
child: PointerInterceptor(
child: Container(
color: Colors.transparent,
height: 44,
child: Row(children: [
Expanded(child: Text(
receiveTime.getTitle(context),
style: ThemeUtils.defaultTextStyleInterFont.copyWith(
fontSize: 16,
fontWeight: FontWeight.normal,
color: Colors.black
),
maxLines: 1,
softWrap: CommonTextStyle.defaultSoftWrap,
overflow: CommonTextStyle.defaultTextOverFlow,
)),
if (receiveTime == receiveTimeSelected)
SvgPicture.asset(
imagePaths.icChecked,
width: 20,
height: 20,
fit: BoxFit.fill
)
]),
),
),
);
}
}