TF-4174 Display tag in opened email view when thread is disabled on web desktop

This commit is contained in:
dab246
2025-11-25 15:00:07 +07:00
committed by Dat H. Pham
parent 5fb0aa84e8
commit e99643085d
3 changed files with 77 additions and 17 deletions
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/base/widget/optional_scroll.dart';
import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/handle_on_iframe_click_in_email_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/presentation_email_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/validate_display_free_busy_message_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart';
import 'package:tmail_ui_user/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart';
@@ -240,18 +241,27 @@ class EmailView extends GetWidget<SingleEmailController> {
ScrollController? scrollController,
}) {
final isMobileResponsive = controller.responsiveUtils.isMobile(context);
final isWebDesktop = controller.responsiveUtils.isWebDesktop(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
if (!isInsideThreadDetailView || isFirstEmailInThreadDetail)
EmailSubjectWidget(
presentationEmail: presentationEmail.copyWith(
subject: threadSubject,
),
isMobileResponsive: isMobileResponsive,
),
Obx(() {
final allLabels =
controller.mailboxDashBoardController.labelController.labels;
final emailLabels = presentationEmail.getLabelList(allLabels);
return EmailSubjectWidget(
presentationEmail: presentationEmail.copyWith(
subject: threadSubject,
),
isMobileResponsive: isMobileResponsive,
isWebDesktop: isWebDesktop,
labels: emailLabels,
);
}),
Obx(() => InformationSenderAndReceiverBuilder(
emailSelected: presentationEmail,
imagePaths: controller.imagePaths,
@@ -1,33 +1,81 @@
import 'package:flutter/material.dart';
import 'package:labels/model/label.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/email/presentation/styles/email_subject_styles.dart';
import 'package:tmail_ui_user/features/labels/presentation/widgets/label_widget.dart';
class EmailSubjectWidget extends StatelessWidget {
final PresentationEmail presentationEmail;
final bool isMobileResponsive;
final bool isWebDesktop;
final List<Label>? labels;
const EmailSubjectWidget({
super.key,
required this.presentationEmail,
this.isMobileResponsive = false,
this.isWebDesktop = false,
this.labels,
});
bool get _hasLabels => labels?.isNotEmpty == true;
String get _title => presentationEmail.getEmailTitle();
@override
Widget build(BuildContext context) {
if (presentationEmail.getEmailTitle().isEmpty) {
return const SizedBox.shrink();
final padding = isMobileResponsive
? EmailSubjectStyles.mobilePadding
: EmailSubjectStyles.padding;
if (_title.isEmpty) {
return _hasLabels && isWebDesktop
? Padding(
padding: padding,
child: _buildLabelsOnly(),
)
: const SizedBox.shrink();
}
if (_hasLabels && isWebDesktop) {
return Padding(
padding: padding,
child: _buildTitleWithLabels(),
);
}
return Padding(
padding: isMobileResponsive
? EmailSubjectStyles.mobilePadding
: EmailSubjectStyles.padding,
child: Text(
presentationEmail.getEmailTitle(),
style: EmailSubjectStyles.textStyle,
maxLines: EmailSubjectStyles.maxLines,
)
padding: padding,
child: _buildTitle(),
);
}
Widget _buildTitle() {
return Text(
_title,
style: EmailSubjectStyles.textStyle,
maxLines: EmailSubjectStyles.maxLines,
);
}
Widget _buildLabelsOnly() {
return Wrap(
spacing: 10,
runSpacing: 10,
crossAxisAlignment: WrapCrossAlignment.center,
children: labels!.map(LabelWidget.create).toList(),
);
}
Widget _buildTitleWithLabels() {
return Wrap(
spacing: 10,
runSpacing: 10,
crossAxisAlignment: WrapCrossAlignment.center,
children: [
_buildTitle(),
...labels!.map(LabelWidget.create),
],
);
}
}
@@ -18,6 +18,8 @@ class LabelWidget extends StatelessWidget {
this.isTruncateLabel = false,
});
factory LabelWidget.create(Label label) => LabelWidget(label: label);
@override
Widget build(BuildContext context) {
final showTooltip =