Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
14f1904
TF-4169 Add labels module
dab246 Nov 21, 2025
b222abb
TF-4169 Create Labels capability and Label object
dab246 Nov 24, 2025
85ca199
TF-4169 Add `Label/get` method
dab246 Nov 24, 2025
1209427
TF-4169 Add `Label/set` method
dab246 Nov 24, 2025
5df3836
TF-4169 Add `Label/changes` method
dab246 Nov 24, 2025
04b38d2
TF-4169 Add `Labels` module in `prebuild.sh` for CI
dab246 Nov 24, 2025
252b354
TF-4169 Set `createToJson` is false to avoid create `toJson` unnecessary
dab246 Nov 24, 2025
af52532
TF-4169 Add precheck for HexColor and unit test
dab246 Nov 27, 2025
35e1577
TF-4171 Add `Labels` module to dependency of root
dab246 Nov 24, 2025
5966b77
TF-4171 Add datasource/repository/interactor for get all labels
dab246 Nov 24, 2025
ae13c8e
TF-4171 Display tag in mailbox list
dab246 Nov 25, 2025
ced72c1
TF-4171 Remove unnecessary imports in label unit test
dab246 Nov 25, 2025
f2d1ef5
TF-4171 Display tag in mailbox list, search list on mobile
dab246 Nov 27, 2025
58aae97
TF-4174 Display tag in opened email view when thread is disabled on w…
dab246 Nov 25, 2025
bb8ed42
TF-4174 Display tag in opened email view when thread is enabled on we…
dab246 Nov 25, 2025
6f9f45b
TF-4174 Display tag in opened email view on mobile
dab246 Nov 28, 2025
70f5826
TF-4179 Add Label bar in sidebar
dab246 Nov 25, 2025
fd2aea4
TF-4179 Display tag list in sidebar
dab246 Nov 25, 2025
b37f5be
TF-4179 Fix desktop/mobile style constants in LabelListItem and refin…
dab246 Dec 8, 2025
f540eee
TF-4181 Remove `mainAxisAlignment: MainAxisAlignment.center`
dab246 Dec 8, 2025
0f5d5e0
TF-4179 Sort label list by alphabet
dab246 Dec 8, 2025
8d8a5b5
TF-4179 Update new tag icon
dab246 Dec 9, 2025
6544d60
TF-4178 Add create new label modal
dab246 Nov 26, 2025
83d5fc6
TF-4178 Add color picker modal
dab246 Nov 26, 2025
724781c
TF-4178 Add datasource/repository/interactor for create new label
dab246 Nov 26, 2025
aee6136
TF-4178 Implement create new label
dab246 Dec 9, 2025
eac9f24
TF-4178 Add test for parsing error
hoangdat Dec 9, 2025
9ef7cb9
TF-4178 Add more tests for parsing error to cover all case
dab246 Dec 10, 2025
9e11e7f
TF-4178 Fix Nitpick comments from coderabbit
dab246 Dec 10, 2025
4f78131
TF-4193 Add Label to Preferences in Setting
dab246 Dec 8, 2025
526cdef
TF-4193 Handle multi click to enable Label visibility feature
dab246 Dec 9, 2025
41f2aaa
TF-4193 Show/Hide Label list when toggle label state in Setting
dab246 Dec 9, 2025
0766e91
TF-4193 Fix all `Nitpick comments` from coderabbit
dab246 Dec 10, 2025
4afa516
TF-4193 Refactor ThreadDetail: extract getLabelsForFirstEmail() to cl…
dab246 Dec 10, 2025
fefd513
TF-4193 Update missing dependency in pubspec.lock of scribe module
dab246 Dec 26, 2025
7da3fab
TF-4195 Add `Label as` to email context menu
dab246 Dec 11, 2025
b21dfe6
TF-4195 Show submenu when hover Label As item
dab246 Dec 11, 2025
3f37153
TF-4195 Add interactor/repository/datasource to feature add a Label t…
dab246 Dec 11, 2025
19ad46b
TF-4195 Implement add a Label to an email
dab246 Dec 11, 2025
3460706
TF-4195 Implement add a Label to an email on mobile
dab246 Dec 12, 2025
96cf120
TF-4195 Fix comments of coderabbit
dab246 Dec 26, 2025
02a028f
TF-4195 Fix cannot `label as` in tablet
dab246 Jan 5, 2026
22c3898
TF-4195 Add unit test for `addKeyword` in MapKeywordsExtension
dab246 Jan 5, 2026
c4041c4
TF-4195 Add Label to Thread
dab246 Jan 6, 2026
1967068
TF-4195 refactor: extract helpers for updating email label in memory
dab246 Jan 6, 2026
4301da2
TF-4243 Add `Delete label` action to context menu
dab246 Jan 12, 2026
a6f5f36
TF-4243 Add datasource/repository/interactor for delete a label feature
dab246 Jan 12, 2026
432a278
TF-4243 Implement delete a label in presentation layer
dab246 Jan 12, 2026
d0f4405
TF-4243 Add integration test on mobile for case delete_a_label
dab246 Jan 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions assets/images/ic_color_picker.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions assets/images/ic_tag.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/images/ic_thumbs_up.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions contact/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
flutter_hsvcolor_picker:
dependency: transitive
description:
name: flutter_hsvcolor_picker
sha256: f3480d7beaf4d3a3b76512a0c149a3b698076c8cf721bc515cded30de37ded6a
url: "https://pub.dev"
source: hosted
version: "1.5.1"
flutter_image_compress:
dependency: transitive
description:
Expand Down
7 changes: 7 additions & 0 deletions core/lib/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export 'presentation/extensions/map_extensions.dart';
export 'presentation/extensions/either_view_state_extension.dart';
export 'presentation/extensions/media_type_extension.dart';
export 'presentation/extensions/scroll_controller_extension.dart';
export 'presentation/extensions/hex_color_extension.dart';

// Exceptions
export 'domain/exceptions/download_file_exception.dart';
Expand Down Expand Up @@ -60,6 +61,7 @@ export 'utils/preview_eml_file_utils.dart';
export 'utils/logger/log_tracking.dart';
export 'utils/html/html_utils.dart';
export 'utils/web_link_generator.dart';
export 'utils/widget_utils.dart';

// Views
export 'presentation/views/text/slogan_builder.dart';
Expand All @@ -73,6 +75,7 @@ export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/list/tree_view.dart';
export 'presentation/views/button/icon_button_web.dart';
export 'presentation/views/button/tmail_button_widget.dart';
export 'presentation/views/button/default_close_button_widget.dart';
export 'presentation/views/image/avatar_builder.dart';
export 'presentation/views/list/sliver_grid_delegate_fixed_height.dart';
export 'presentation/views/list/no_stretch_scroll_behavior.dart';
Expand All @@ -85,6 +88,7 @@ export 'presentation/views/dialog/downloading_file_dialog_builder.dart';
export 'presentation/views/dialog/confirmation_dialog_builder.dart';
export 'presentation/views/dialog/edit_text_dialog_builder.dart';
export 'presentation/views/dialog/color_picker_dialog_builder.dart';
export 'presentation/views/dialog/modal_list_action_button_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_widget.dart';
export 'presentation/views/html_viewer/html_content_viewer_on_web_widget.dart';
export 'presentation/views/floating_button/scrolling_floating_button_animated.dart';
Expand Down Expand Up @@ -112,6 +116,9 @@ export 'presentation/views/semantics/text_field_semantics.dart';
export 'presentation/views/semantics/icon_semantics.dart';
export 'presentation/views/shortcut/key_shortcut.dart';
export 'presentation/views/tooltip/iframe_tooltip_overlay.dart';
export 'presentation/views/color/color_circle_widget.dart';
export 'presentation/views/color/colors_map_widget.dart';
export 'presentation/views/color/color_picker_modal.dart';

// Resources
export 'presentation/resources/assets_paths.dart';
Expand Down
1 change: 1 addition & 0 deletions core/lib/presentation/extensions/color_extension.dart
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ extension AppColor on Color {
static const gray49454F = Color(0xFF49454F);
static const blue00B7FF = Color(0xFF00B7FF);
static const blueD2E9FF = Color(0xFFD2E9FF);
static const grayCDCDCD = Color(0xFFCDCDCD);
static const lightGrayF9FAFB = Color(0xFFF9FAFB);
static const black4D4D4D = Color(0xFF4D4D4D);
static const black1A1A1A = Color(0xFF1A1A1A);
Expand Down
18 changes: 18 additions & 0 deletions core/lib/presentation/extensions/hex_color_extension.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:flutter/material.dart';

extension HexColorExtension on String {
Color toColor({Color fallback = Colors.transparent}) {
try {
final hex = replaceAll('#', '');

if (hex.length != 6 && hex.length != 8) {
return fallback;
}

final fullHex = hex.length == 6 ? 'FF$hex' : hex;
return Color(int.parse(fullHex, radix: 16));
} catch (_) {
return fallback;
}
}
}
3 changes: 3 additions & 0 deletions core/lib/presentation/resources/image_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,9 @@ class ImagePaths {
String get icAiMoreDetail => _getImagePath('ic_ai_more_detail.svg');
String get icAiMoreProfessional => _getImagePath('ic_ai_more_professional.svg');
String get icAiMorePolite => _getImagePath('ic_ai_more_polite.svg');
String get icTag => _getImagePath('ic_tag.svg');
String get icColorPicker => _getImagePath('ic_color_picker.svg');
String get icThumbsUp => _getImagePath('ic_thumbs_up.svg');

String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
Expand Down
2 changes: 2 additions & 0 deletions core/lib/presentation/views/button/tmail_button_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class TMailButtonWidget extends StatelessWidget {
EdgeInsetsGeometry? margin,
Color? hoverColor,
Alignment? alignment,
BoxBorder? border,
}) {
return TMailButtonWidget(
key: key,
Expand Down Expand Up @@ -137,6 +138,7 @@ class TMailButtonWidget extends StatelessWidget {
margin: margin,
hoverColor: hoverColor,
alignment: alignment,
border: border,
);
}

Expand Down
49 changes: 49 additions & 0 deletions core/lib/presentation/views/color/color_circle_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

class ColorCircleWidget extends StatelessWidget {
final Color color;
final bool isSelected;
final ImagePaths imagePaths;
final VoidCallback onTap;

const ColorCircleWidget({
super.key,
required this.color,
required this.isSelected,
required this.imagePaths,
required this.onTap,
});

@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency,
child: InkWell(
onTap: onTap,
customBorder: const CircleBorder(),
child: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle,
),
child: isSelected
? Center(
child: SvgPicture.asset(
imagePaths.icCheck,
colorFilter: Colors.white.asFilter(),
width: 18.46,
height: 18.46,
fit: BoxFit.fill,
),
)
: null,
),
),
);
}
}
Loading
Loading