diff --git a/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart b/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart index 55d27ec0b..161588578 100644 --- a/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart +++ b/lib/features/mailbox/domain/extensions/mailbox_name_extension.dart @@ -1,5 +1,10 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; extension MailboxNameExtension on MailboxName { - int compareToSort(MailboxName mailboxName) => name.compareTo(mailboxName.name); + int compareAlphabetically(MailboxName? other) { + if (other == null) { + return 1; + } + return name.toLowerCase().compareTo(other.name.toLowerCase()); + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 1c13233d9..b8b129144 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -10,8 +10,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 5f85d5c87..892de3167 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -1,4 +1,3 @@ -import 'package:built_collection/built_collection.dart'; import 'package:core/core.dart'; import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; @@ -10,7 +9,6 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_button_new_folder_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_tile_builder.dart'; @@ -154,10 +152,7 @@ class MailboxView extends GetWidget { .addName(AppLocalizations.of(context).new_folder) .build() ), - Obx(() => controller.folderMailboxTree.value.root.childrenItems.isNotEmpty - ? _buildFolderMailbox(context, controller.folderMailboxTree.value) - : SizedBox.shrink() - ), + _buildFolderMailbox(context), ] ); } @@ -180,19 +175,22 @@ class MailboxView extends GetWidget { .build())); } - Widget _buildFolderMailbox(BuildContext context, MailboxTree mailboxTree) { - return Transform( - transform: Matrix4.translationValues(responsiveUtils.isMobile(context) ? 0.0 : -15.0, 0.0, 0.0), - child: Padding( - padding: EdgeInsets.only(left: 4, right: 16), - child: TreeView( - startExpanded: false, - key: Key('folder_mailbox_list'), - children: _buildListChildTileWidget(context, mailboxTree.root.childrenItems))) + Widget _buildFolderMailbox(BuildContext context) { + return Obx(() => controller.folderMailboxTree.value.root.hasChildren() + ? Transform( + transform: Matrix4.translationValues(responsiveUtils.isMobile(context) ? 0.0 : -15.0, 0.0, 0.0), + child: Padding( + padding: EdgeInsets.only(left: 4, right: 16), + child: TreeView( + startExpanded: false, + key: Key('folder_mailbox_list'), + children: _buildListChildTileWidget(context, controller.folderMailboxTree.value.root.childrenItems!))) + ) + : SizedBox.shrink() ); } - List _buildListChildTileWidget(BuildContext context, BuiltList listMailboxNode) { + List _buildListChildTileWidget(BuildContext context, List listMailboxNode) { return listMailboxNode .map((mailboxNode) => mailboxNode.hasChildren() ? Padding( @@ -206,7 +204,7 @@ class MailboxView extends GetWidget { mailboxNode, controller.getSelectMode(mailboxNode.item, controller.mailboxDashBoardController.selectedMailbox.value)) .build(context)), - children: _buildListChildTileWidget(context, mailboxNode.childrenItems))) + children: _buildListChildTileWidget(context, mailboxNode.childrenItems!))) : Padding( padding: EdgeInsets.only(left: 16), child: GestureDetector( diff --git a/lib/features/mailbox/presentation/model/mailbox_tree_builder.dart b/lib/features/mailbox/presentation/model/mailbox_tree_builder.dart index 5b75f61f7..ea523a206 100644 --- a/lib/features/mailbox/presentation/model/mailbox_tree_builder.dart +++ b/lib/features/mailbox/presentation/model/mailbox_tree_builder.dart @@ -1,7 +1,9 @@ import 'dart:collection'; +import 'package:collection/collection.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/extensions/mailbox_name_extension.dart'; import 'mailbox_node.dart'; import 'mailbox_tree.dart'; @@ -21,8 +23,16 @@ class TreeBuilder { if (node != null) { if (parentNode != null) { parentNode.addChildNode(node); + parentNode.childrenItems?.sortByCompare( + (node) => node.item.name, + (name, other) => name?.compareAlphabetically(other) ?? -1 + ); } else { tree.root.addChildNode(node); + tree.root.childrenItems?.sortByCompare( + (node) => node.item.name, + (name, other) => name?.compareAlphabetically(other) ?? -1 + ); } } }); diff --git a/pubspec.yaml b/pubspec.yaml index fcc1244b1..ae2c8d1ba 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,6 +83,8 @@ dependencies: # http_parser http_parser: 4.0.0 + collection: 1.15.0 + # file_size filesize: 2.0.1 diff --git a/test/features/mailbox/presentation/model/mailbox_tree_builder_test.dart b/test/features/mailbox/presentation/model/mailbox_tree_builder_test.dart index 40364837a..395e508f3 100644 --- a/test/features/mailbox/presentation/model/mailbox_tree_builder_test.dart +++ b/test/features/mailbox/presentation/model/mailbox_tree_builder_test.dart @@ -13,46 +13,46 @@ void main() { PresentationMailbox(MailboxId(Id('root'))), childrenItems: [ MailboxNode( - PresentationMailbox(MailboxId(Id("1")), parentId: null), - childrenItems: [ - MailboxNode(PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1')))), - MailboxNode( - PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))), - childrenItems: [ - MailboxNode(PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2')))) - ] - ), - ] + PresentationMailbox(MailboxId(Id("3")), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))), + childrenItems: [MailboxNode(PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))))] + ), + MailboxNode( + PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1')))) + ] + ), + ] ), MailboxNode( - PresentationMailbox(MailboxId(Id("2")), parentId: null), - childrenItems: [ - MailboxNode(PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))), - childrenItems: [ - MailboxNode( - PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))), - childrenItems: [MailboxNode(PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))))] - ), - MailboxNode(PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1')))) - ] - ), - MailboxNode(PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2')))) - ] + PresentationMailbox(MailboxId(Id("1")), parentId: null), + childrenItems: [ + MailboxNode( + PresentationMailbox(MailboxId(Id("1_2")), parentId: MailboxId(Id('1'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id("1_2_1")), parentId: MailboxId(Id('1_2')))) + ] + ), + MailboxNode(PresentationMailbox(MailboxId(Id("1_1")), parentId: MailboxId(Id('1')))), + ] ), MailboxNode( - PresentationMailbox(MailboxId(Id("3")), parentId: null), - childrenItems: [ - MailboxNode( - PresentationMailbox(MailboxId(Id("3_1")), parentId: MailboxId(Id('3'))), - childrenItems: [ - MailboxNode(PresentationMailbox(MailboxId(Id("3_1_1")), parentId: MailboxId(Id('3_1')))) - ] - ), - MailboxNode( - PresentationMailbox(MailboxId(Id("3_2")), parentId: MailboxId(Id('3'))), - childrenItems: [MailboxNode(PresentationMailbox(MailboxId(Id("3_2_1")), parentId: MailboxId(Id('3_2'))))] - ) - ] + PresentationMailbox(MailboxId(Id("2")), parentId: null), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id("2_2")), parentId: MailboxId(Id('2')))), + MailboxNode(PresentationMailbox(MailboxId(Id("2_1")), parentId: MailboxId(Id('2'))), + childrenItems: [ + MailboxNode(PresentationMailbox(MailboxId(Id("2_1_2")), parentId: MailboxId(Id('2_1')))), + MailboxNode( + PresentationMailbox(MailboxId(Id("2_1_1")), parentId: MailboxId(Id('2_1'))), + childrenItems: [MailboxNode(PresentationMailbox(MailboxId(Id("2_1_1_1")), parentId: MailboxId(Id('2_1_1'))))] + ), + ] + ), + ] ), ] )