TF-4171 Display tag in mailbox list, search list on mobile

This commit is contained in:
dab246
2025-11-28 03:18:40 +07:00
committed by Dat H. Pham
parent 0ab57402a0
commit 5fb0aa84e8
11 changed files with 843 additions and 184 deletions
@@ -6,6 +6,7 @@ import 'package:model/email/presentation_email.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/select_mode.dart';
import 'package:tmail_ui_user/features/base/widget/labels/ai_action_tag_widget.dart';
import 'package:tmail_ui_user/features/labels/presentation/widgets/label_list_widget.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/base_email_item_tile.dart';
import 'package:tmail_ui_user/features/thread/presentation/styles/item_email_tile_styles.dart';
@@ -22,6 +23,7 @@ class EmailTileBuilder extends StatelessWidget with BaseEmailItemTile {
final bool isShowingEmailContent;
final bool isSenderImportantFlagEnabled;
final bool isAINeedsActionEnabled;
final bool autoWrapTagsByMaxWidth;
final List<Label>? labels;
final OnPressEmailActionClick? emailActionClick;
final OnMoreActionClick? onMoreActionClick;
@@ -36,6 +38,7 @@ class EmailTileBuilder extends StatelessWidget with BaseEmailItemTile {
this.isSearchEmailRunning = false,
this.isSenderImportantFlagEnabled = true,
this.isAINeedsActionEnabled = true,
this.autoWrapTagsByMaxWidth = false,
this.mailboxContain,
this.padding,
this.isDrag = false,
@@ -128,17 +131,7 @@ class EmailTileBuilder extends StatelessWidget with BaseEmailItemTile {
)),
Padding(
padding: const EdgeInsetsDirectional.only(top: 2),
child: Row(children: [
Expanded(child: buildEmailPartialContent(
context,
presentationEmail,
isSearchEmailRunning,
searchQuery)),
if (_shouldShowAIAction)
const AiActionTagWidget(
margin: EdgeInsetsDirectional.only(start: 8),
),
])
child: _buildPartialContent(context),
),
],
),
@@ -146,6 +139,94 @@ class EmailTileBuilder extends StatelessWidget with BaseEmailItemTile {
);
}
Widget _buildPartialContent(BuildContext context) {
final hasLabels = labels?.isNotEmpty == true;
final isDesktop = responsiveUtils.isDesktop(context);
final isAutoWrap = autoWrapTagsByMaxWidth;
final hasContent =
presentationEmail.getPartialContent().isNotEmpty;
final partialContent = buildEmailPartialContent(
context,
presentationEmail,
isSearchEmailRunning,
searchQuery,
);
if (!hasLabels) {
return Row(
children: [
if (hasContent)
Flexible(child: partialContent),
if (_shouldShowAIAction)
const AiActionTagWidget(
margin: EdgeInsetsDirectional.only(start: 8),
),
],
);
}
if (!hasContent) {
return Row(
children: [
if (_shouldShowAIAction)
const AiActionTagWidget(
margin: EdgeInsetsDirectional.only(start: 8),
),
Flexible(
child: LabelTagListWidget(
tags: labels!,
autoWrapTagsByMaxWidth: isAutoWrap,
isDesktop: isDesktop,
),
),
],
);
}
if (!isAutoWrap) {
return Row(
children: [
Flexible(child: partialContent),
if (_shouldShowAIAction)
const AiActionTagWidget(
margin: EdgeInsetsDirectional.only(start: 8),
),
const SizedBox(width: 12),
LabelTagListWidget(
tags: labels!,
autoWrapTagsByMaxWidth: isAutoWrap,
isDesktop: isDesktop,
),
],
);
}
return LayoutBuilder(
builder: (_, constraints) {
return Row(
children: [
Expanded(child: partialContent),
if (_shouldShowAIAction)
const AiActionTagWidget(
margin: EdgeInsetsDirectional.only(start: 8),
),
const SizedBox(width: 12),
ConstrainedBox(
constraints: BoxConstraints(maxWidth: constraints.maxWidth / 2),
child: LabelTagListWidget(
tags: labels!,
autoWrapTagsByMaxWidth: isAutoWrap,
isDesktop: isDesktop,
),
),
],
);
},
);
}
bool get _shouldShowAIAction =>
isAINeedsActionEnabled && presentationEmail.hasNeedAction;
}