Skip to content

Commit 105b997

Browse files
committed
TF-2421 Update new UI for selection mode in email list view
Signed-off-by: dab246 <[email protected]>
1 parent cc2b46e commit 105b997

File tree

13 files changed

+190
-158
lines changed

13 files changed

+190
-158
lines changed

assets/images/ic_checkbox_off.svg

Lines changed: 5 additions & 0 deletions
Loading

assets/images/ic_checkbox_on.svg

Lines changed: 5 additions & 0 deletions
Loading

core/lib/presentation/resources/image_paths.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ class ImagePaths {
209209
String get icUnsubscribe => _getImagePath('ic_unsubscribe.svg');
210210
String get icRecoverDeletedMessages => _getImagePath('ic_recover_deleted_messages.svg');
211211
String get icLogoTwakeWelcome => _getImagePath('ic_logo_twake_welcome.svg');
212+
String get icCheckboxOn => _getImagePath('ic_checkbox_on.svg');
213+
String get icCheckboxOff => _getImagePath('ic_checkbox_off.svg');
212214

213215
String _getImagePath(String imageName) {
214216
return AssetsPaths.images + imageName;

core/lib/presentation/views/image/avatar_builder.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ class AvatarBuilder extends StatelessWidget {
6262
tileMode: TileMode.decal,
6363
colors: avatarColors ?? [])
6464
: null,
65-
color: bgColor ?? AppColor.avatarColor
65+
color: avatarColors?.isNotEmpty == true
66+
? null
67+
: bgColor ?? AppColor.avatarColor
6668
),
6769
child: Text(
6870
text ?? '',

lib/features/base/widget/email_avatar_builder.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
import 'package:core/presentation/extensions/color_extension.dart';
32
import 'package:core/presentation/views/image/avatar_builder.dart';
43
import 'package:flutter/material.dart';
54
import 'package:model/email/presentation_email.dart';
@@ -24,7 +23,6 @@ class EmailAvatarBuilder extends StatelessWidget {
2423
fontSize: 21,
2524
color: Colors.white
2625
),
27-
bgColor: AppColor.colorAvatar,
2826
avatarColors: emailSelected.avatarColors,
2927
);
3028
}

lib/features/search/email/presentation/search_email_view.dart

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,9 @@ class SearchEmailView extends GetWidget<SearchEmailController>
489489
physics: const AlwaysScrollableScrollPhysics(),
490490
key: const PageStorageKey('list_presentation_email_in_search_view'),
491491
itemCount: listPresentationEmail.length,
492+
padding: controller.selectionMode.value == SelectMode.INACTIVE
493+
? null
494+
: const EdgeInsets.symmetric(horizontal: 8),
492495
itemBuilder: (context, index) {
493496
final currentPresentationEmail = listPresentationEmail[index];
494497
return Obx(() => EmailTileBuilder(
@@ -497,7 +500,11 @@ class SearchEmailView extends GetWidget<SearchEmailController>
497500
searchQuery: controller.searchQuery,
498501
isShowingEmailContent: controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id,
499502
isSearchEmailRunning: true,
500-
padding: SearchEmailUtils.getPaddingItemListMobile(context, controller.responsiveUtils),
503+
padding: SearchEmailUtils.getPaddingItemListMobile(
504+
context,
505+
controller.responsiveUtils,
506+
controller.selectionMode.value
507+
),
501508
mailboxContain: currentPresentationEmail.mailboxContain,
502509
emailActionClick: (action, email) {
503510
controller.pressEmailAction(
@@ -524,13 +531,19 @@ class SearchEmailView extends GetWidget<SearchEmailController>
524531
));
525532
},
526533
separatorBuilder: (BuildContext context, int index) {
527-
if (index < listPresentationEmail.length - 1) {
528-
return Padding(
529-
padding: SearchEmailUtils.getPaddingItemListMobile(context, controller.responsiveUtils),
530-
child: const Divider());
531-
} else {
532-
return const SizedBox.shrink();
533-
}
534+
return Padding(
535+
padding: ItemEmailTileStyles.getMobilePaddingDivider(
536+
context: context,
537+
responsiveUtils: controller.responsiveUtils,
538+
selectMode: controller.selectionMode.value
539+
),
540+
child: Divider(
541+
color: index < listPresentationEmail.length - 1 &&
542+
controller.selectionMode.value == SelectMode.INACTIVE
543+
? null
544+
: Colors.white,
545+
)
546+
);
534547
},
535548
)
536549
: ScrollbarListView(

lib/features/search/email/presentation/utils/search_email_utils.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import 'package:core/presentation/utils/responsive_utils.dart';
33
import 'package:core/utils/platform_info.dart';
44
import 'package:flutter/material.dart';
5+
import 'package:model/mailbox/select_mode.dart';
56

67
class SearchEmailUtils {
78
static EdgeInsets getPaddingAppBar(BuildContext context, ResponsiveUtils responsiveUtils) {
@@ -64,11 +65,19 @@ class SearchEmailUtils {
6465
}
6566
}
6667

67-
static EdgeInsets getPaddingItemListMobile(BuildContext context, ResponsiveUtils responsiveUtils) {
68+
static EdgeInsets getPaddingItemListMobile(
69+
BuildContext context,
70+
ResponsiveUtils responsiveUtils,
71+
SelectMode selectMode
72+
) {
6873
if (responsiveUtils.isPortraitMobile(context)) {
69-
return const EdgeInsets.symmetric(horizontal: 16);
74+
return EdgeInsets.symmetric(
75+
horizontal: selectMode == SelectMode.ACTIVE ? 8 : 16
76+
);
7077
} else {
71-
return const EdgeInsets.symmetric(horizontal: 32);
78+
return EdgeInsets.symmetric(
79+
horizontal: selectMode == SelectMode.ACTIVE ? 24 : 32
80+
);
7281
}
7382
}
7483

lib/features/thread/presentation/mixin/base_email_item_tile.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,9 @@ mixin BaseEmailItemTile {
271271
fit: BoxFit.fill),
272272
);
273273
} else {
274-
return Container(
275-
alignment: Alignment.center,
276-
color: Colors.transparent,
277-
child: SvgPicture.asset(
278-
email.isSelected
279-
? imagePaths.icSelected
280-
: imagePaths.icUnSelected,
281-
width: 24, height: 24));
274+
return SvgPicture.asset(
275+
email.isSelected ? imagePaths.icCheckboxOn : imagePaths.icCheckboxOff
276+
);
282277
}
283278
}
284279

lib/features/thread/presentation/styles/item_email_tile_styles.dart

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
import 'package:core/presentation/utils/responsive_utils.dart';
33
import 'package:flutter/cupertino.dart';
4+
import 'package:model/mailbox/select_mode.dart';
45

56
class ItemEmailTileStyles {
67

@@ -17,11 +18,37 @@ class ItemEmailTileStyles {
1718
}
1819
}
1920

20-
static EdgeInsetsGeometry getMobilePaddingItemList(BuildContext context, ResponsiveUtils responsiveUtils) {
21+
static EdgeInsetsGeometry getMobilePaddingItemList({
22+
required BuildContext context,
23+
required ResponsiveUtils responsiveUtils,
24+
SelectMode? selectMode
25+
}) {
2126
if (responsiveUtils.isPortraitMobile(context) || responsiveUtils.isLandscapeTablet(context)) {
22-
return const EdgeInsets.symmetric(horizontal: 16);
27+
return EdgeInsets.symmetric(
28+
horizontal: selectMode == SelectMode.ACTIVE ? 8 : 16
29+
);
2330
} else {
24-
return const EdgeInsets.symmetric(horizontal: 32);
31+
return EdgeInsets.symmetric(
32+
horizontal: selectMode == SelectMode.ACTIVE ? 24 : 32
33+
);
34+
}
35+
}
36+
37+
static EdgeInsetsGeometry getMobilePaddingDivider({
38+
required BuildContext context,
39+
required ResponsiveUtils responsiveUtils,
40+
SelectMode? selectMode
41+
}) {
42+
if (responsiveUtils.isPortraitMobile(context) || responsiveUtils.isLandscapeTablet(context)) {
43+
return EdgeInsets.symmetric(
44+
horizontal: 16,
45+
vertical: selectMode == SelectMode.ACTIVE ? 2 : 0.0
46+
);
47+
} else {
48+
return EdgeInsets.symmetric(
49+
horizontal: 32,
50+
vertical: selectMode == SelectMode.ACTIVE ? 2 : 0.0
51+
);
2552
}
2653
}
2754

lib/features/thread/presentation/thread_view.dart

Lines changed: 69 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -113,54 +113,60 @@ class ThreadView extends GetWidget<ThreadController>
113113
}
114114
}),
115115
if (PlatformInfo.isMobile)
116-
Padding(
117-
padding: _getBannerMargin(context, controller.responsiveUtils),
118-
child: Row(
119-
children: [
120-
Expanded(
121-
child: SearchBarView(
122-
key: const Key('email_search_bar_view'),
123-
imagePaths: controller.imagePaths,
124-
margin: const EdgeInsetsDirectional.only(end: 8),
125-
hintTextSearch: AppLocalizations.of(context).search_emails,
126-
onOpenSearchViewAction: controller.goToSearchView
127-
),
128-
),
129-
Obx(() {
130-
return TMailButtonWidget.fromIcon(
131-
key: const Key('filter_email_button'),
132-
icon: controller.imagePaths.icFilter,
133-
iconColor: MobileAppBarThreadWidgetStyle.getFilterButtonColor(
134-
controller.mailboxDashBoardController.filterMessageOption.value
116+
Obx(() {
117+
final selectionMode = controller.mailboxDashBoardController.currentSelectMode.value;
118+
if (selectionMode == SelectMode.INACTIVE) {
119+
return Padding(
120+
padding: _getBannerMargin(context, controller.responsiveUtils),
121+
child: Row(
122+
children: [
123+
Expanded(
124+
child: SearchBarView(
125+
key: const Key('email_search_bar_view'),
126+
imagePaths: controller.imagePaths,
127+
margin: const EdgeInsetsDirectional.only(end: 8),
128+
hintTextSearch: AppLocalizations.of(context).search_emails,
129+
onOpenSearchViewAction: controller.goToSearchView
130+
),
135131
),
136-
padding: EdgeInsets.zero,
137-
backgroundColor: Colors.transparent,
138-
tooltipMessage: AppLocalizations.of(context).filter_messages,
139-
onTapActionCallback: controller.responsiveUtils.isScreenWithShortestSide(context)
140-
? () => controller.openContextMenuAction(
141-
context,
142-
_filterMessagesCupertinoActionTile(
143-
context,
144-
controller.mailboxDashBoardController.filterMessageOption.value
145-
)
146-
)
147-
: null,
148-
onTapActionAtPositionCallback: !controller.responsiveUtils.isScreenWithShortestSide(context)
149-
? (position) => controller.openPopupMenuAction(
150-
context,
151-
position,
152-
popupMenuFilterEmailActionTile(
153-
context,
154-
controller.mailboxDashBoardController.filterMessageOption.value,
155-
(option) => controller.filterMessagesAction(context, option)
156-
)
157-
)
158-
: null,
159-
);
160-
})
161-
],
162-
),
163-
)
132+
Obx(() {
133+
final filterOption = controller.mailboxDashBoardController.filterMessageOption.value;
134+
return TMailButtonWidget.fromIcon(
135+
key: const Key('filter_email_button'),
136+
icon: controller.imagePaths.icFilter,
137+
iconColor: MobileAppBarThreadWidgetStyle.getFilterButtonColor(filterOption),
138+
padding: EdgeInsets.zero,
139+
backgroundColor: Colors.transparent,
140+
tooltipMessage: AppLocalizations.of(context).filter_messages,
141+
onTapActionCallback: controller.responsiveUtils.isScreenWithShortestSide(context)
142+
? () => controller.openContextMenuAction(
143+
context,
144+
_filterMessagesCupertinoActionTile(
145+
context,
146+
filterOption
147+
)
148+
)
149+
: null,
150+
onTapActionAtPositionCallback: !controller.responsiveUtils.isScreenWithShortestSide(context)
151+
? (position) => controller.openPopupMenuAction(
152+
context,
153+
position,
154+
popupMenuFilterEmailActionTile(
155+
context,
156+
filterOption,
157+
(option) => controller.filterMessagesAction(context, option)
158+
)
159+
)
160+
: null,
161+
);
162+
})
163+
],
164+
),
165+
);
166+
} else {
167+
return const SizedBox.shrink();
168+
}
169+
})
164170
else
165171
SearchBarView(
166172
key: const Key('email_search_bar_view'),
@@ -419,15 +425,24 @@ class ThreadView extends GetWidget<ThreadController>
419425
controller: controller.listEmailController,
420426
physics: const AlwaysScrollableScrollPhysics(),
421427
itemCount: listPresentationEmail.length,
428+
padding: controller.mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE
429+
? null
430+
: const EdgeInsets.symmetric(horizontal: 8),
422431
itemBuilder: (context, index) => Obx(() => _buildEmailItemNotDraggable(context, listPresentationEmail[index])),
423432
separatorBuilder: (context, index) {
424-
if (index < listPresentationEmail.length - 1) {
425-
return Padding(
426-
padding: ItemEmailTileStyles.getMobilePaddingItemList(context, controller.responsiveUtils),
427-
child: const Divider());
428-
} else {
429-
return const SizedBox.shrink();
430-
}
433+
return Padding(
434+
padding: ItemEmailTileStyles.getMobilePaddingDivider(
435+
context: context,
436+
responsiveUtils: controller.responsiveUtils,
437+
selectMode: controller.mailboxDashBoardController.currentSelectMode.value
438+
),
439+
child: Divider(
440+
color: index < listPresentationEmail.length - 1 &&
441+
controller.mailboxDashBoardController.currentSelectMode.value == SelectMode.INACTIVE
442+
? null
443+
: Colors.white,
444+
)
445+
);
431446
},
432447
)
433448
: Focus(

0 commit comments

Comments
 (0)