From 5fb0aa84e833a205826a99f7ed03315752a0fd29 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 28 Nov 2025 03:18:40 +0700 Subject: [PATCH] TF-4171 Display tag in mailbox list, search list on mobile --- labels/lib/extensions/label_extension.dart | 16 + .../base/widget/labels/tag_widget.dart | 3 +- .../presentation/utils/label_utils.dart | 61 ++- .../widgets/label_list_widget.dart | 45 +- .../presentation/widgets/label_widget.dart | 8 + .../email/presentation/search_email_view.dart | 23 +- .../widgets/email_tile_builder.dart | 103 ++++- .../widgets/email_tile_web_builder.dart | 384 ++++++++++++------ .../web_tablet_body_email_item_widget.dart | 114 +++++- .../label/compute_displayed_tags_test.dart | 228 ++++++++++- test/features/label/truncate_label_test.dart | 42 ++ 11 files changed, 843 insertions(+), 184 deletions(-) create mode 100644 test/features/label/truncate_label_test.dart diff --git a/labels/lib/extensions/label_extension.dart b/labels/lib/extensions/label_extension.dart index 81219b061..d28d5283a 100644 --- a/labels/lib/extensions/label_extension.dart +++ b/labels/lib/extensions/label_extension.dart @@ -1,6 +1,8 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/hex_color_extension.dart'; import 'package:flutter/material.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:labels/model/hex_color.dart'; import 'package:labels/model/label.dart'; extension LabelExtension on Label { @@ -23,4 +25,18 @@ extension LabelExtension on Label { return Colors.white; } } + + Label copyWith({ + Id? id, + String? keyword, + String? displayName, + HexColor? color, + }) { + return Label( + id: id ?? this.id, + displayName: displayName ?? this.displayName, + keyword: keyword ?? this.keyword, + color: color ?? this.color, + ); + } } diff --git a/lib/features/base/widget/labels/tag_widget.dart b/lib/features/base/widget/labels/tag_widget.dart index a85d93e53..059bc34a5 100644 --- a/lib/features/base/widget/labels/tag_widget.dart +++ b/lib/features/base/widget/labels/tag_widget.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/utils/theme_utils.dart'; import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/labels/presentation/utils/label_utils.dart'; class TagWidget extends StatelessWidget { final String text; @@ -26,7 +27,7 @@ class TagWidget extends StatelessWidget { @override Widget build(BuildContext context) { Widget labelText = Text( - isTruncateText ? _truncateName(text) : text, + isTruncateText ? LabelUtils.truncateLabel(text) : text, style: ThemeUtils.textStyleContentCaption().copyWith( color: textColor, ), diff --git a/lib/features/labels/presentation/utils/label_utils.dart b/lib/features/labels/presentation/utils/label_utils.dart index ecc5b9476..f90ead98a 100644 --- a/lib/features/labels/presentation/utils/label_utils.dart +++ b/lib/features/labels/presentation/utils/label_utils.dart @@ -73,7 +73,7 @@ class LabelUtils { } final remainingCount = total - 1; - final plus = _buildPlusLabel(remainingCount); + final plus = buildPlusLabel(remainingCount); double plusWidth = effectiveMeasure(plus); if (plusMaxWidth != null) { @@ -97,7 +97,7 @@ class LabelUtils { // Normal shrink logic while (fitCount > 0) { - final plus = _buildPlusLabel(remaining); + final plus = buildPlusLabel(remaining); double plusWidth = effectiveMeasure(plus); if (plusMaxWidth != null) { @@ -151,7 +151,7 @@ class LabelUtils { plusMaxWidth: plusMaxWidth, measureWidth: measureWidth, ); - } catch (_, __) { + } catch (_) { if (tags.isEmpty) { return (displayed: const [], hiddenCount: 0); } @@ -186,8 +186,61 @@ class LabelUtils { return (fitCount: fit, usedWidth: used); } - static Label _buildPlusLabel(int n) => Label( + static Label buildPlusLabel(int n) => Label( id: Id(LabelExtension.moreLabelId), displayName: n > 999 ? '+999+' : '+$n', ); + + static ({ + List