TF-1581 Update UI to support language RTL

This commit is contained in:
dab246
2023-03-10 13:05:00 +07:00
committed by Dat Vu
parent 42bde0e415
commit 9af4924b9a
44 changed files with 821 additions and 392 deletions
@@ -26,6 +26,7 @@ class ButtonBuilder {
double? _maxWidth;
EdgeInsets? _padding;
String? _tooltip;
BoxConstraints? _constraints;
void key(Key key) {
_key = key;
@@ -84,6 +85,10 @@ class ButtonBuilder {
_tooltip = message;
}
void addBoxConstraints(BoxConstraints? constraints) {
_constraints = constraints;
}
ButtonBuilder(this._icon);
void onPressActionClick(OnPressActionClick onPressActionClick) {
@@ -122,6 +127,7 @@ class ButtonBuilder {
color: _decoration == null ? _colorButton : null,
decoration: _decoration,
width: _maxWidth,
constraints: _constraints,
padding: _padding ?? EdgeInsets.zero,
child: _buildBody()
),
@@ -58,6 +58,7 @@ class TreeViewChild {
final List<Widget> children;
final VoidCallback? onTap;
final EdgeInsets? paddingChild;
final bool isDirectionRTL;
TreeViewChild(
this.context,
@@ -67,6 +68,7 @@ class TreeViewChild {
this.isExpanded,
this.onTap,
this.paddingChild,
this.isDirectionRTL = false,
Key? key,
}
);
@@ -90,7 +92,10 @@ class TreeViewChild {
mainAxisSize: MainAxisSize.min,
children: children
.map((child) => Padding(
padding: paddingChild ?? const EdgeInsets.only(left: 20),
padding: paddingChild ?? EdgeInsets.only(
left: isDirectionRTL ? 0 : 20,
right: isDirectionRTL ? 20 : 0,
),
child: child
))
.toList()
@@ -89,6 +89,7 @@ class QuickSearchInputForm<T, R> extends FormField<String> {
bool hideSuggestionsBox = false,
BoxDecoration? decoration,
double? maxHeight,
bool isDirectionRTL = false,
}) : assert(
initialValue == null || textFieldConfiguration.controller == null),
assert(minCharsForSuggestions >= 0),
@@ -152,6 +153,7 @@ class QuickSearchInputForm<T, R> extends FormField<String> {
hideSuggestionsBox: hideSuggestionsBox,
decoration: decoration,
maxHeight: maxHeight,
isDirectionRTL: isDirectionRTL,
);
});
@@ -519,6 +521,8 @@ class TypeAheadFieldQuickSearch<T, R> extends StatefulWidget {
/// Max height search input
final double? maxHeight;
final bool isDirectionRTL;
/// Creates a [TypeAheadFieldQuickSearch]
const TypeAheadFieldQuickSearch(
{Key? key,
@@ -560,6 +564,7 @@ class TypeAheadFieldQuickSearch<T, R> extends StatefulWidget {
this.hideSuggestionsBox = false,
this.decoration,
this.maxHeight,
this.isDirectionRTL = false,
}) : assert(animationStart >= 0.0 && animationStart <= 1.0),
assert(
direction == AxisDirection.down || direction == AxisDirection.up),
@@ -748,6 +753,7 @@ class _TypeAheadFieldQuickSearchState<T, R> extends State<TypeAheadFieldQuickSea
},
listActionPadding: widget.listActionPadding,
hideSuggestionsBox: widget.hideSuggestionsBox,
isDirectionRTL: widget.isDirectionRTL,
);
double w = _suggestionsBox!.textBoxWidth;
@@ -899,6 +905,7 @@ class _SuggestionsList<T, R> extends StatefulWidget {
final RecentSelectionCallback<R>? onRecentSelected;
final EdgeInsets? listActionPadding;
final bool hideSuggestionsBox;
final bool isDirectionRTL;
const _SuggestionsList({
required this.suggestionsBox,
@@ -932,6 +939,7 @@ class _SuggestionsList<T, R> extends StatefulWidget {
this.onRecentSelected,
this.listActionPadding,
this.hideSuggestionsBox = false,
this.isDirectionRTL = false,
});
@override
@@ -1174,7 +1182,11 @@ class _SuggestionsListState<T, R> extends State<_SuggestionsList<T, R>>
children: widget.listActionButton!.map((dynamic action) {
if (widget.actionButtonBuilder != null) {
return Padding(
padding: const EdgeInsets.only(right: 8, bottom: kIsWeb ? 8 : 0),
padding: EdgeInsets.only(
right: widget.isDirectionRTL ? 0 : 8,
left: widget.isDirectionRTL ? 8 : 0,
bottom: kIsWeb ? 8 : 0
),
child: InkWell(
borderRadius: const BorderRadius.all(Radius.circular(10)),
onTap: () {
@@ -1255,7 +1267,11 @@ class _SuggestionsListState<T, R> extends State<_SuggestionsList<T, R>>
children: widget.listActionButton!.map((dynamic action) {
if (widget.actionButtonBuilder != null) {
return Padding(
padding: const EdgeInsets.only(right: 8, bottom: kIsWeb ? 8 : 0),
padding: EdgeInsets.only(
right: widget.isDirectionRTL ? 0 : 8,
left: widget.isDirectionRTL ? 8 : 0,
bottom: kIsWeb ? 8 : 0
),
child: InkWell(
borderRadius: const BorderRadius.all(Radius.circular(10)),
onTap: () {
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/upload/presentation/extensions/list_uploa
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ComposerView extends GetWidget<ComposerController>
with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin {
@@ -271,7 +272,8 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildFromEmailAddress(BuildContext context) {
return Padding(
padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
top: 12,
bottom: 12),
child: Row(children: [
@@ -324,7 +326,10 @@ class ComposerView extends GetWidget<ComposerController>
),
),
Expanded(child: Padding(
padding: const EdgeInsets.only(right: 8, left: 12),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 12 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 12
),
child: Text(
controller.identitySelected.value?.email ?? '',
maxLines: 1,
@@ -339,7 +344,10 @@ class ComposerView extends GetWidget<ComposerController>
return Column(
children: [
Obx(() => Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.to,
controller.listToEmailAddress,
@@ -362,7 +370,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true
? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.cc,
controller.listCcEmailAddress,
@@ -384,7 +395,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true
? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.bcc,
controller.listBccEmailAddress,
@@ -410,7 +424,10 @@ class ComposerView extends GetWidget<ComposerController>
return Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: Text(
'${AppLocalizations.of(context).subject_email}:',
style: const TextStyle(
@@ -478,7 +495,10 @@ class ComposerView extends GetWidget<ComposerController>
physics: const ClampingScrollPhysics(),
child: Column(children: [
Padding(
padding: const EdgeInsets.only(left: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : 16
),
child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding(padding: const EdgeInsets.only(top: 20),
child: (AvatarBuilder()
@@ -498,13 +518,22 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
_buildEmailAddress(context),
const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding(padding: const EdgeInsets.only(right: 16), child: _buildSubjectEmail(context)),
Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
),
child: _buildSubjectEmail(context)
),
]),
))
])),
const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding(
padding: const EdgeInsets.only(left: 60, right: 25),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 25 : 60,
right: AppUtils.isDirectionRTL(context) ? 60 : 25,
),
child: Column(children: [
_buildAttachmentsWidget(context),
buildInlineLoadingView(controller),
@@ -662,7 +691,10 @@ class ComposerView extends GetWidget<ComposerController>
itemCount: uploadFilesState.length,
itemBuilder: (context, index) => AttachmentFileComposerBuilder(
uploadFilesState[index],
itemMargin: const EdgeInsets.only(right: 8),
itemMargin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
),
maxWidth: _getMaxWidthItemListAttachment(context, constraints),
onDeleteAttachmentAction: (attachment) =>
controller.deleteAttachmentUploaded(attachment.uploadTaskId))
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/upload/presentation/extensions/list_uploa
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ComposerView extends GetWidget<ComposerController>
with AppLoaderMixin, RichTextButtonMixin, ComposerLoadingMixin {
@@ -76,56 +77,111 @@ class ComposerView extends GetWidget<ComposerController>
desktop: Obx(() {
return Stack(children: [
if (controller.screenDisplayMode.value == ScreenDisplayMode.normal)
Positioned(right: 5, bottom: 5, child: Card(
if (AppUtils.isDirectionRTL(context))
Positioned(left: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(24))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))),
width: responsiveUtils.getSizeScreenWidth(context) * 0.5,
height: responsiveUtils.getSizeScreenHeight(context) * 0.75,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(24)),
child: LayoutBuilder(builder: (context, constraints) =>
PointerInterceptor(child: _buildBodyForDesktop(context, constraints)))
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))),
width: responsiveUtils.getSizeScreenWidth(context) * 0.5,
height: responsiveUtils.getSizeScreenHeight(context) * 0.75,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(24)),
child: LayoutBuilder(builder: (context, constraints) =>
PointerInterceptor(child: _buildBodyForDesktop(context, constraints))
)
)
)
)),
))
else
Positioned(right: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(24))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(24))),
width: responsiveUtils.getSizeScreenWidth(context) * 0.5,
height: responsiveUtils.getSizeScreenHeight(context) * 0.75,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(24)),
child: LayoutBuilder(builder: (context, constraints) =>
PointerInterceptor(child: _buildBodyForDesktop(context, constraints))
)
)
)
)),
if (controller.screenDisplayMode.value == ScreenDisplayMode.minimize)
Positioned(right: 5, bottom: 5, child: Card(
if (AppUtils.isDirectionRTL(context))
Positioned(left: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))),
width: 500,
height: 50,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: PointerInterceptor(child: Row(children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).saveAndClose,
onTap: () => controller.saveEmailAsDrafts(context)
)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).fullscreen,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).show,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, right: 80),
child: _buildTitleComposer(context),
)),
]))
)
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))),
width: 500,
height: 50,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: PointerInterceptor(child: Row(children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).saveAndClose,
onTap: () => controller.saveEmailAsDrafts(context)
)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).fullscreen,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).show,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, right: 80),
child: _buildTitleComposer(context),
)),
]))
)
)
)),
))
else
Positioned(right: 5, bottom: 5, child: Card(
elevation: 20,
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container(
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(16))),
width: 500,
height: 50,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: PointerInterceptor(child: Row(children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: buildIconWeb(
icon: SvgPicture.asset(imagePaths.icCloseMailbox, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).saveAndClose,
onTap: () => controller.saveEmailAsDrafts(context)
)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icFullScreenComposer, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).fullscreen,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.fullScreen)),
buildIconWeb(
icon: SvgPicture.asset(imagePaths.icChevronUp, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).show,
onTap: () => controller.displayScreenTypeComposerAction(ScreenDisplayMode.normal)),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, right: 80),
child: _buildTitleComposer(context),
)),
]))
)
)
)),
if (controller.screenDisplayMode.value == ScreenDisplayMode.fullScreen)
Scaffold(
backgroundColor: Colors.black38,
@@ -326,7 +382,10 @@ class ComposerView extends GetWidget<ComposerController>
Padding(padding: const EdgeInsets.only(left: 20, right: 20, top: 8), child: _buildAppBar(context)),
const Padding(padding: EdgeInsets.only(top: 8), child: Divider(color: AppColor.colorDividerComposer, height: 1)),
Padding(
padding: const EdgeInsets.only(left: 16),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding(padding: const EdgeInsets.only(top: 20),
child: (AvatarBuilder()
@@ -336,7 +395,10 @@ class ComposerView extends GetWidget<ComposerController>
..backgroundColor(AppColor.colorAvatar))
.build()),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 12),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: Column(children: [
Obx(() => controller.identitySelected.value != null
? _buildFromEmailAddress(context)
@@ -346,7 +408,13 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
_buildEmailAddress(context, constraints),
const Divider(color: AppColor.colorDividerComposer, height: 1),
Padding(padding: const EdgeInsets.only(right: 16), child: _buildSubjectEmail(context)),
Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
),
child: _buildSubjectEmail(context)
),
const Divider(color: AppColor.colorDividerComposer, height: 1),
_buildListButton(context, constraints),
]),
@@ -355,8 +423,9 @@ class ComposerView extends GetWidget<ComposerController>
const Divider(color: AppColor.colorDividerComposer, height: 1),
Expanded(child: Padding(
padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 60,
right: responsiveUtils.isMobile(context) ? 16 : 25),
left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 25 : responsiveUtils.isMobile(context) ? 16 : 60,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 60 : responsiveUtils.isMobile(context) ? 16 : 25,
),
child: Column(
children: [
_buildAttachmentsWidget(context),
@@ -384,7 +453,8 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildFromEmailAddress(BuildContext context) {
return Padding(
padding: EdgeInsets.only(
left: responsiveUtils.isMobile(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0,
top: 12,
bottom: 12),
child: Row(children: [
@@ -447,7 +517,10 @@ class ComposerView extends GetWidget<ComposerController>
),
),
Expanded(child: Padding(
padding: const EdgeInsets.only(right: 8, left: 12),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 12 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 12,
),
child: Text(
controller.identitySelected.value?.email ?? '',
maxLines: 1,
@@ -471,7 +544,10 @@ class ComposerView extends GetWidget<ComposerController>
child: Column(
children: [
Obx(() => Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.to,
controller.listToEmailAddress,
@@ -495,8 +571,11 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.cc) == true
? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
child: (EmailAddressInputBuilder(context, imagePaths,
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.cc,
controller.listCcEmailAddress,
controller.listEmailAddressType,
@@ -518,7 +597,10 @@ class ComposerView extends GetWidget<ComposerController>
: const SizedBox.shrink()),
Obx(() => controller.listEmailAddressType.contains(PrefixEmailAddress.bcc) == true
? Padding(
padding: EdgeInsets.only(left: responsiveUtils.isMobile(context) ? 16 : 0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : responsiveUtils.isMobile(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 0 : 0
),
child: (EmailAddressInputBuilder(context, imagePaths,
PrefixEmailAddress.bcc,
controller.listBccEmailAddress,
@@ -547,7 +629,11 @@ class ComposerView extends GetWidget<ComposerController>
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(right: 8, top: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
top: 16
),
child: Text(
'${AppLocalizations.of(context).subject_email}:',
style: const TextStyle(
@@ -572,7 +658,11 @@ class ComposerView extends GetWidget<ComposerController>
Widget _buildListButton(BuildContext context, BoxConstraints constraints) {
return Transform(
transform: Matrix4.translationValues(-5.0, 0.0, 0.0),
transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? 0.0 : -5.0,
0.0,
0.0
),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: Row(children: [
@@ -740,10 +830,10 @@ class ComposerView extends GetWidget<ComposerController>
return Column(children: [
Padding(
padding: EdgeInsets.only(
top: 4,
bottom: 4,
left: responsiveUtils.isMobile(context) ? 16 : 20,
right: responsiveUtils.isMobile(context) ? 16: 0),
top: 4,
bottom: 4,
left: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16: 0 : responsiveUtils.isMobile(context) ? 16 : 20,
right: AppUtils.isDirectionRTL(context) ? responsiveUtils.isMobile(context) ? 16 : 20 : responsiveUtils.isMobile(context) ? 16: 0),
child: _buildAttachmentsTitle(
context,
attachments,
@@ -810,7 +900,10 @@ class ComposerView extends GetWidget<ComposerController>
itemCount: uploadFilesState.length,
itemBuilder: (context, index) => AttachmentFileComposerBuilder(
uploadFilesState[index],
itemMargin: const EdgeInsets.only(right: 8),
itemMargin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
),
maxWidth: _getMaxWidthItemListAttachment(context, constraints),
onDeleteAttachmentAction: (attachment) =>
controller.deleteAttachmentUploaded(attachment.uploadTaskId))
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_state.dart';
import 'package:tmail_ui_user/features/upload/presentation/model/upload_file_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnDeleteAttachmentAction = void Function(UploadFileState fileState);
@@ -51,9 +52,11 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
hoverColor: AppColor.primaryColor,
onTap: () {},
leading: Padding(
padding: const EdgeInsets.only(
left: 8,
bottom: BuildUtils.isWeb ? 6 : 14),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
bottom: BuildUtils.isWeb ? 6 : 14
),
child: SvgPicture.asset(
fileState.getIcon(_imagePaths),
width: 40,
@@ -62,11 +65,14 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
),
title: Transform(
transform: Matrix4.translationValues(
BuildUtils.isWeb ? 0.0 : -8.0,
AppUtils.isDirectionRTL(context) ? 0.0 : BuildUtils.isWeb ? 0.0 : -8.0,
BuildUtils.isWeb ? -8.0 : -10.0,
0.0),
child: Padding(
padding: const EdgeInsets.only(right: BuildUtils.isWeb ? 20 : 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : BuildUtils.isWeb ? 20 : 16,
left: AppUtils.isDirectionRTL(context) ? BuildUtils.isWeb ? 20 : 16 : 0
),
child: Text(
fileState.fileName,
maxLines: 1,
@@ -82,7 +88,7 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
subtitle: fileState.fileSize != 0
? Transform(
transform: Matrix4.translationValues(
BuildUtils.isWeb ? 0.0 : -8.0,
AppUtils.isDirectionRTL(context) ? 0.0 : BuildUtils.isWeb ? 0.0 : -8.0,
BuildUtils.isWeb ? -8.0 : -10.0,
0.0),
child: Text(
@@ -96,19 +102,34 @@ class AttachmentFileComposerBuilder extends StatelessWidget with AppLoaderMixin
color: AppColor.colorContentEmail)))
: null,
),
Positioned(
right: BuildUtils.isWeb ? -5 : -12,
top: BuildUtils.isWeb ? -5 : -12,
child: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).delete,
onTap: () {
if (onDeleteAttachmentAction != null) {
onDeleteAttachmentAction!.call(fileState);
if (AppUtils.isDirectionRTL(context))
Positioned(
left: BuildUtils.isWeb ? -5 : -12,
top: BuildUtils.isWeb ? -5 : -12,
child: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).delete,
onTap: () {
if (onDeleteAttachmentAction != null) {
onDeleteAttachmentAction!.call(fileState);
}
}
}
)
)
),
else
Positioned(
right: BuildUtils.isWeb ? -5 : -12,
top: BuildUtils.isWeb ? -5 : -12,
child: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icDeleteAttachment, fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).delete,
onTap: () {
if (onDeleteAttachmentAction != null) {
onDeleteAttachmentAction!.call(fileState);
}
}
)
),
Align(alignment: Alignment.bottomCenter, child: _progressLoading),
]),
)
@@ -174,7 +174,6 @@ class ContactController extends BaseController {
FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) {
_disposeWidget();
onSelectedContactCallback?.call(emailAddress);
} else {
popBack(result: emailAddress);
@@ -186,7 +185,6 @@ class ContactController extends BaseController {
FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) {
_disposeWidget();
onDismissContactView?.call();
} else {
popBack();
@@ -426,7 +426,6 @@ class DestinationPickerController extends BaseMailboxController {
}
if (BuildUtils.isWeb) {
_disposeWidget();
onSelectedMailboxCallback?.call(mailboxDestination.value);
} else {
popBack(result: mailboxDestination.value);
@@ -475,7 +474,6 @@ class DestinationPickerController extends BaseMailboxController {
FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) {
_disposeWidget();
onDismissDestinationPicker?.call();
} else {
popBack();
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_fold
import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class DestinationPickerView extends GetWidget<DestinationPickerController>
with AppLoaderMixin,
@@ -368,8 +369,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
return TreeViewChild(
context,
key: const Key('children_tree_mailbox_child'),
isDirectionRTL: AppUtils.isDirectionRTL(context),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: (MailBoxFolderTileBuilder(
context,
_imagePaths,
@@ -481,7 +486,10 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
if (actions == MailboxActions.select && (mailboxIdSelected == null ||
mailboxIdSelected == PresentationMailbox.unifiedMailbox.id))
Padding(
padding: const EdgeInsets.only(right: 30.0),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 30.0,
left: AppUtils.isDirectionRTL(context) ? 30 : 0.0,
),
child: SvgPicture.asset(
_imagePaths.icFilterSelected,
width: 20,
@@ -535,7 +543,12 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
padding: const EdgeInsets.symmetric(vertical: 16),
child: Row(
children: [
Padding(padding: const EdgeInsets.only(left: 5), child: buildIconWeb(
Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 5,
right: AppUtils.isDirectionRTL(context) ? 5 : 0,
),
child: buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(),
@@ -549,7 +562,10 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
hasBackButton: false,
hasSearchButton: true)
..addPadding(EdgeInsets.zero)
..setMargin(const EdgeInsets.only(right: 16))
..setMargin(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
))
..addDecoration(BoxDecoration(borderRadius: BorderRadius.circular(12), color: AppColor.colorBgSearchBar))
..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 18, height: 18, fit: BoxFit.fill))
..setHintText(AppLocalizations.of(context).hint_search_mailboxes)
@@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/features/search/mailbox/presentation/utils/search_mailbox_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
@@ -64,7 +65,7 @@ class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
]
)
)),
_buildSelectedIcon()
_buildSelectedIcon(context)
]
),
)
@@ -132,12 +133,15 @@ class DestinationPickerSearchMailboxItemBuilder extends StatelessWidget {
}
}
Widget _buildSelectedIcon() {
Widget _buildSelectedIcon(BuildContext context) {
if (_presentationMailbox.id == mailboxIdAlreadySelected &&
(mailboxActions == MailboxActions.select ||
mailboxActions == MailboxActions.create)) {
return Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset(
_imagePaths.icFilterSelected,
width: 20,
@@ -7,6 +7,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnCreateNewMailboxAction = Function();
typedef OnOpenCreateNewMailboxScreenAction = Function();
@@ -61,7 +62,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget {
fontWeight: FontWeight.w700))),
if (_destinationScreenType == DestinationScreenType.destinationPicker)
Padding(
padding: const EdgeInsets.only(left: 8.0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Align(
alignment: Alignment.centerLeft,
child: buildIconWeb(
@@ -76,7 +80,10 @@ class TopBarDestinationPickerBuilder extends StatelessWidget {
)
else
Padding(
padding: const EdgeInsets.only(left: 8.0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Align(
alignment: Alignment.centerLeft,
child: Material(
+50 -12
View File
@@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/information_se
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class EmailView extends GetWidget<SingleEmailController> {
@@ -81,7 +82,12 @@ class EmailView extends GetWidget<SingleEmailController> {
EdgeInsets _getMarginEmailView(BuildContext context) {
if (BuildUtils.isWeb) {
if (responsiveUtils.isDesktop(context)) {
return const EdgeInsets.only(right: 16, top: 16, bottom: 16);
return EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
top: 16,
bottom: 16
);
} else {
return const EdgeInsets.symmetric(vertical: 16);
}
@@ -278,8 +284,13 @@ class EmailView extends GetWidget<SingleEmailController> {
_buildAttachments(context),
if (BuildUtils.isWeb)
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 16, bottom: 16),
child: _buildEmailContent(context, constraints, email)))
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
bottom: 16
),
child: _buildEmailContent(context, constraints, email)
))
else
Padding(
padding: const EdgeInsets.all(16),
@@ -477,10 +488,19 @@ class EmailView extends GetWidget<SingleEmailController> {
AppLocalizations.of(context).mark_as_unread,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(
context,
@@ -507,10 +527,19 @@ class EmailView extends GetWidget<SingleEmailController> {
: AppLocalizations.of(context).mark_as_spam,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero)
..onActionClick((email) => controller.handleEmailAction(
context,
@@ -532,10 +561,19 @@ class EmailView extends GetWidget<SingleEmailController> {
AppLocalizations.of(context).quickCreatingRule,
email,
iconLeftPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 16 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 16,
)
: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
),
iconRightPadding: responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
)
: EdgeInsets.zero)
..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first)))
.build();
@@ -5,6 +5,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnBackActionClick = void Function();
typedef OnEmailActionClick = void Function(PresentationEmail, EmailActionType);
@@ -66,7 +67,10 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
fit: BoxFit.fill),
if (!isSearchIsRunning)
Container(
margin: const EdgeInsets.only(left: 8),
margin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
constraints: BoxConstraints(
maxWidth: _responsiveUtils.getSizeScreenWidth(context) - 250),
child: Text(
@@ -100,6 +100,7 @@ class IdentityCreatorController extends BaseController {
@override
void onInit() {
log('IdentityCreatorController::onInit():');
super.onInit();
keyboardRichTextController = RichTextController();
richTextWebController = RichTextWebController();
@@ -340,7 +341,6 @@ class IdentityCreatorController extends BaseController {
);
if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedIdentityCallback?.call(identityRequest);
} else {
popBack(result: identityRequest);
@@ -352,7 +352,6 @@ class IdentityCreatorController extends BaseController {
isDefaultIdentity: isDefaultIdentity.value);
if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedIdentityCallback?.call(identityRequest);
} else {
popBack(result: identityRequest);
@@ -426,7 +425,6 @@ class IdentityCreatorController extends BaseController {
void closeView(BuildContext context) {
if (BuildUtils.isWeb) {
_disposeWidget();
onDismissIdentityCreator?.call();
} else {
popBack();
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/set
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
@@ -475,12 +476,20 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
}),
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 24.0, bottom: 12.0, left: 12.0),
padding: EdgeInsets.only(
top: 24.0,
bottom: 12.0,
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0
),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.only(right: 12.0),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0
),
child: buildTextButton(
AppLocalizations.of(context).cancel,
textStyle: const TextStyle(
@@ -3,6 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnCheckboxChanged = void Function();
@@ -43,7 +44,10 @@ class SetDefaultIdentityCheckboxBuilder extends StatelessWidget {
),
),
Padding(
padding: const EdgeInsets.only(left: 8.0),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Text(
AppLocalizations.of(context).setDefaultIdentity,
style: const TextStyle(
@@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_fold
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart';
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxView extends GetWidget<MailboxController>
with MailboxWidgetMixin,
@@ -101,8 +102,11 @@ class MailboxView extends GetWidget<MailboxController>
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(left: 10),
child: _buildCloseScreenButton(context)),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 19 : 0,
),
child: _buildCloseScreenButton(context)),
SizedBox(width: controller.isSelectionEnabled() ? 49 : 40),
Expanded(child: Text(
AppLocalizations.of(context).folders,
@@ -147,8 +151,8 @@ class MailboxView extends GetWidget<MailboxController>
return Column(children: [
Padding(
padding: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 16,
right: 16),
left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ?_responsiveUtils.isLandscapeMobile(context) ? 0 : 16 : 16),
child: UserInformationWidgetBuilder(
_imagePaths,
controller.mailboxDashBoardController.userProfile.value,
@@ -203,44 +207,45 @@ class MailboxView extends GetWidget<MailboxController>
const SizedBox(height: 12),
Container(
margin: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: 16),
padding: const EdgeInsets.only(left: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(AppLocalizations.of(context).mailBoxes,
style: const TextStyle(
fontSize: 20,
color: Colors.black,
fontWeight: FontWeight.bold)),
Row(
children: [
buildIconWeb(
minSize: 40,
iconPadding: EdgeInsets.zero,
icon: SvgPicture.asset(
_imagePaths.icSearchBar,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill
),
tooltip: AppLocalizations.of(context).searchForMailboxes,
onTap: () => controller.openSearchViewAction(context)
),
buildIconWeb(
minSize: 40,
iconSize: 20,
iconPadding: EdgeInsets.zero,
splashRadius: 15,
icon: SvgPicture.asset(
_imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).new_mailbox,
onTap: () => controller.goToCreateNewMailboxView(context)),
],
left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(AppLocalizations.of(context).mailBoxes,
style: const TextStyle(
fontSize: 20,
color: Colors.black,
fontWeight: FontWeight.bold)),
Row(children: [
buildIconWeb(
minSize: 40,
iconPadding: EdgeInsets.zero,
icon: SvgPicture.asset(
_imagePaths.icSearchBar,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill
),
tooltip: AppLocalizations.of(context).searchForMailboxes,
onTap: () => controller.openSearchViewAction(context)
),
buildIconWeb(
minSize: 40,
iconSize: 20,
iconPadding: EdgeInsets.zero,
splashRadius: 15,
icon: SvgPicture.asset(
_imagePaths.icAddNewFolder,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).new_mailbox,
onTap: () => controller.goToCreateNewMailboxView(context)),
]),
]),
),
const SizedBox(height: 8),
Obx(() {
@@ -274,8 +279,8 @@ class MailboxView extends GetWidget<MailboxController>
Widget _buildHeaderMailboxCategory(BuildContext context, MailboxCategories categories) {
return Padding(
padding: EdgeInsets.only(
right: _responsiveUtils.isLandscapeMobile(context) ? 8 : 28,
left: 4),
right: AppUtils.isDirectionRTL(context) ? 4 : _responsiveUtils.isLandscapeMobile(context) ? 8 : 28,
left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 8 : 28 : 4),
child: Row(children: [
buildIconWeb(
minSize: 40,
@@ -302,9 +307,13 @@ class MailboxView extends GetWidget<MailboxController>
return Container(
margin: EdgeInsets.only(
left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: 16),
padding: const EdgeInsets.only(left: 12),
left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isLandscapeMobile(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isLandscapeMobile(context) ? 0 : 8 : 16
),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: TreeView(
key: Key('${categories.keyValue}_mailbox_list'),
children: _buildListChildTileWidget(context, mailboxNode, lastNode: lastNode)));
@@ -332,7 +341,11 @@ class MailboxView extends GetWidget<MailboxController>
context,
key: const Key('children_tree_mailbox_child'),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14),
isDirectionRTL: AppUtils.isDirectionRTL(context),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: Obx(() => (MailBoxFolderTileBuilder(
context,
_imagePaths,
@@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ap
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxView extends GetWidget<MailboxController>
with AppLoaderMixin,
@@ -39,8 +40,7 @@ class MailboxView extends GetWidget<MailboxController>
height: 0.5,
thickness: 0.2),
Expanded(child: Container(
padding: EdgeInsets.only(
left: _responsiveUtils.isDesktop(context) ? 16 : 0),
padding: _getViewPadding(context),
color: _responsiveUtils.isDesktop(context)
? AppColor.colorBgDesktop
: Colors.white,
@@ -61,13 +61,23 @@ class MailboxView extends GetWidget<MailboxController>
);
}
EdgeInsets _getViewPadding(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0);
} else {
return EdgeInsets.only(left: _responsiveUtils.isDesktop(context) ? 16 : 0);
}
}
Widget _buildLogoApp(BuildContext context) {
return Container(
color: Colors.white,
padding: EdgeInsets.only(
top: _responsiveUtils.isDesktop(context) ? 25 : 16,
bottom: _responsiveUtils.isDesktop(context) ? 25 : 16,
left: _responsiveUtils.isDesktop(context) ? 32 : 16),
top: _responsiveUtils.isDesktop(context) ? 25 : 16,
bottom: _responsiveUtils.isDesktop(context) ? 25 : 16,
left: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 32 : 16,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 32 : 16 : 0
),
child: Row(children: [
(SloganBuilder(arrangedByHorizontal: true)
..setSloganText(AppLocalizations.of(context).app_name)
@@ -102,7 +112,10 @@ class MailboxView extends GetWidget<MailboxController>
controller: controller.mailboxListScrollController,
key: const PageStorageKey('mailbox_list'),
physics: const ClampingScrollPhysics(),
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 16 : 0,
left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 16 : 0 : 0
),
child: Column(children: [
if (!_responsiveUtils.isDesktop(context))
_buildUserInformation(context),
@@ -131,7 +144,8 @@ class MailboxView extends GetWidget<MailboxController>
const SizedBox(height: 13),
Padding(
padding: EdgeInsets.only(
left: _responsiveUtils.isDesktop(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 0 : 12,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 0 : 12 : 0,
bottom: 8
),
child: Row(
@@ -143,7 +157,10 @@ class MailboxView extends GetWidget<MailboxController>
color: Colors.black,
fontWeight: FontWeight.bold)),
Padding(
padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : _responsiveUtils.isDesktop(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isDesktop(context) ? 0 : 12 : 0,
),
child: Row(
children: [
buildIconWeb(
@@ -293,8 +310,12 @@ class MailboxView extends GetWidget<MailboxController>
return TreeViewChild(
context,
key: const Key('children_tree_mailbox_child'),
isDirectionRTL: AppUtils.isDirectionRTL(context),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 14),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 14,
right: AppUtils.isDirectionRTL(context) ? 14 : 0,
),
parent: Obx(() => (MailBoxFolderTileBuilder(
context,
_imagePaths,
@@ -1,71 +0,0 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
typedef OnOpenMailboxNewFolderActionClick = void Function();
class MailboxNewFolderTileBuilder {
String? _icon;
String? _name;
OnOpenMailboxNewFolderActionClick? _onOpenMailboxFolderActionClick;
MailboxNewFolderTileBuilder();
void addIcon(String icon) {
_icon = icon;
}
void addName(String name) {
_name = name;
}
void onOpenMailboxFolderAction(OnOpenMailboxNewFolderActionClick onOpenMailboxFolderActionClick) {
_onOpenMailboxFolderActionClick = onOpenMailboxFolderActionClick;
}
Widget build() {
return Theme(
data: ThemeData(
splashColor: Colors.transparent,
highlightColor: Colors.transparent),
child: Container(
key: const Key('mailbox_new_folder_tile'),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
color: AppColor.mailboxBackgroundColor),
child: MediaQuery(
data: const MediaQueryData(padding: EdgeInsets.zero),
child: ListTile(
contentPadding: EdgeInsets.zero,
onTap: () => {
if (_onOpenMailboxFolderActionClick != null) {
_onOpenMailboxFolderActionClick!()
}
},
leading: Padding(
padding: const EdgeInsets.only(left: 34),
child: _icon != null
? SvgPicture.asset(
_icon!,
width: 24,
height: 24,
colorFilter: AppColor.mailboxIconColor.asFilter(),
fit: BoxFit.fill)
: const SizedBox.shrink()),
title: Padding(
padding: const EdgeInsets.only(left: 8),
child: Text(
_name ?? '',
maxLines: 1,
style: const TextStyle(fontSize: 15, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold),
)),
)
)
)
);
}
}
@@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displa
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailBoxFolderTileBuilder {
@@ -82,15 +83,15 @@ class MailBoxFolderTileBuilder {
Widget build() {
if (responsiveUtils?.isWebDesktop(_context) == true && mailboxDisplayed == MailboxDisplayed.mailbox) {
return DragTarget<List<PresentationEmail>>(
builder: (_, __, ___) => _buildMailboxItem(),
builder: (_, __, ___) => _buildMailboxItem(_context),
onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item),
);
} else {
return _buildMailboxItem();
return _buildMailboxItem(_context);
}
}
Widget _buildMailboxItem() {
Widget _buildMailboxItem(BuildContext context) {
if (mailboxDisplayed == MailboxDisplayed.mailbox) {
if (BuildUtils.isWeb) {
return StatefulBuilder(
@@ -108,11 +109,11 @@ class MailBoxFolderTileBuilder {
? CrossAxisAlignment.start
: CrossAxisAlignment.center,
children: [
_buildLeadingMailboxItem(),
_buildLeadingMailboxItem(context),
const SizedBox(width: 4),
Expanded(child: _buildTitleFolderItem()),
const SizedBox(width: 8),
_buildTrailingItemForMailboxView()
_buildTrailingItemForMailboxView(context)
])
),
);
@@ -141,12 +142,12 @@ class MailBoxFolderTileBuilder {
? CrossAxisAlignment.start
: CrossAxisAlignment.center,
children: [
_buildLeadingMailboxItem(),
_buildLeadingMailboxItem(context),
const SizedBox(width: 8),
Expanded(child: _buildTitleFolderItem()),
_buildSelectedIcon(),
const SizedBox(width: 8),
_buildTrailingItemForMailboxView()
_buildTrailingItemForMailboxView(context)
]),
]
),
@@ -171,7 +172,7 @@ class MailBoxFolderTileBuilder {
? AppColor.colorItemSelected
: Colors.transparent,
child: Row(children: [
_buildLeadingMailboxItem(),
_buildLeadingMailboxItem(context),
const SizedBox(width: 8),
Expanded(child: _buildTitleFolderItem()),
_buildSelectedIcon()
@@ -184,7 +185,7 @@ class MailBoxFolderTileBuilder {
}
}
Widget _buildLeadingMailboxItem() {
Widget _buildLeadingMailboxItem(BuildContext context) {
return Row(children: [
if (_mailboxNode.hasChildren())
Row(children: [
@@ -211,20 +212,27 @@ class MailBoxFolderTileBuilder {
else
const SizedBox(width: 32),
Transform(
transform: Matrix4.translationValues(-4.0, 0.0, 0.0),
transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? 0.0 : -4.0,
0.0,
0.0
),
child: _buildLeadingIcon()
),
]);
}
Widget _buildTrailingItemForMailboxView() {
Widget _buildTrailingItemForMailboxView(BuildContext context) {
if (BuildUtils.isWeb) {
if (isHoverItem) {
return _buildMenuIcon();
return _buildMenuIcon(context);
} else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
&& _mailboxNode.item.matchCountingRules()) {
return Padding(
padding: const EdgeInsets.only(right: 10),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
child: _buildCounter(),
);
} else {
@@ -233,7 +241,10 @@ class MailBoxFolderTileBuilder {
} else {
if (_mailboxNode.hasChildren()) {
return Padding(
padding: const EdgeInsets.only(right: 12),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: Row(
children: [
if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
@@ -245,7 +256,10 @@ class MailBoxFolderTileBuilder {
} else if (_mailboxNode.item.getCountUnReadEmails().isNotEmpty
&& _mailboxNode.item.matchCountingRules()) {
return Padding(
padding: const EdgeInsets.only(right: 12),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 12,
left: AppUtils.isDirectionRTL(context) ? 12 : 0,
),
child: _buildCounter(),
);
} else {
@@ -328,9 +342,12 @@ class MailBoxFolderTileBuilder {
fit: BoxFit.fill);
}
Widget _buildMenuIcon() {
Widget _buildMenuIcon(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: InkWell(
onTapDown: (detail) {
final screenSize = MediaQuery.of(_context).size;
@@ -1,11 +1,15 @@
import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/image/avatar_builder.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get_utils/src/platform/platform.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef OnSubtitleClick = void Function();
@@ -49,7 +53,11 @@ class UserInformationWidgetBuilder extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: titlePadding ?? const EdgeInsets.only(left: 16, top: 10),
padding: titlePadding ?? EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 10
),
child: Text(
_userProfile != null ? '${_userProfile?.email}' : '',
maxLines: 1,
@@ -60,7 +68,10 @@ class UserInformationWidgetBuilder extends StatelessWidget {
),
subtitle != null
? Padding(
padding: const EdgeInsets.only(left: 10),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 10 : 0
),
child: Material(
borderRadius: BorderRadius.circular(20),
color: Colors.transparent,
@@ -80,10 +91,14 @@ class UserInformationWidgetBuilder extends StatelessWidget {
])),
if (!kIsWeb)
Transform(
transform: Matrix4.translationValues(14.0, 0.0, 0.0),
transform: Matrix4.translationValues(
AppUtils.isDirectionRTL(context) ? -14.0 : 14.0,
0.0,
0.0
),
child: IconButton(
icon: SvgPicture.asset(
_imagePaths.icCollapseFolder,
AppUtils.isDirectionRTL(context) ? _imagePaths.icBack : _imagePaths.icCollapseFolder,
fit: BoxFit.fill,
colorFilter: AppColor.colorCollapseMailbox.asFilter()),
onPressed: () => {}))
@@ -205,7 +205,6 @@ class MailboxCreatorController extends BaseController {
mailboxLocation: selectedMailbox.value);
if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedMailboxCallback?.call(newMailboxArguments);
} else {
popBack(result: newMailboxArguments);
@@ -217,7 +216,6 @@ class MailboxCreatorController extends BaseController {
FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) {
_disposeWidget();
onDismissMailboxCreator?.call();
} else {
popBack();
@@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
import 'widgets/app_dashboard/app_grid_dashboard_overlay.dart';
@@ -61,7 +62,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Container(
width: ResponsiveUtils.defaultSizeMenu,
color: Colors.white,
padding: const EdgeInsets.only(left: 28),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 28,
right: AppUtils.isDirectionRTL(context) ? 28 : 0,
),
alignment: Alignment.center,
height: 80,
child: Row(children: [
@@ -95,7 +99,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Expanded(child: Container(
color: Colors.white,
alignment: Alignment.center,
padding: const EdgeInsets.only(right: 10),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
height: 80,
child: _buildRightHeader(context)))
]),
@@ -118,8 +125,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Expanded(child: Column(children: [
const SpamReportBannerWebWidget(),
_buildEmptyTrashButton(context),
const QuotasWarningBannerWidget(
margin: EdgeInsets.only(right: 16, top: 8),
QuotasWarningBannerWidget(
margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 8
),
),
_buildVacationNotificationMessage(context),
_buildListButtonQuickSearchFilter(context),
@@ -212,7 +223,12 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
Widget _buildThreadViewForWebDesktop(BuildContext context) {
return Container(
margin: const EdgeInsets.only(right: 16, top: 8, bottom: 16),
margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 8,
bottom: 16
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -273,9 +289,13 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
behavior: HitTestBehavior.opaque,
onTap: () => appGridDashboardController.toggleAppGridDashboard()),
child: PortalTarget(
anchor: const Aligned(
follower: Alignment.topRight,
target: Alignment.bottomRight
anchor: Aligned(
follower: AppUtils.isDirectionRTL(context)
? Alignment.topLeft
: Alignment.topRight,
target: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight
),
portalFollower: Obx(() {
if (appGridDashboardController.linagoraApplications.value != null) {
@@ -344,7 +364,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
..decoration(const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10)),
color: AppColor.colorButtonHeaderThread))
..paddingIcon(const EdgeInsets.only(right: 8))
..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0
))
..size(16)
..radiusSplash(10)
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
@@ -354,7 +377,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
.build(),
if (mailBoxDashboardController.isAbleMarkAllAsRead())
Padding(
padding: const EdgeInsets.only(left: 16),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: (ButtonBuilder(imagePaths.icMarkAllAsRead)
..key(const Key('button_mark_all_as_read'))
..decoration(const BoxDecoration(
@@ -378,13 +404,19 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
..decoration(BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(10)),
color: controller.filterMessageOption.value.getBackgroundColor()))
..paddingIcon(const EdgeInsets.only(right: 8))
..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..size(16)
..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8))
..radiusSplash(10)
..textStyle(controller.filterMessageOption.value.getTextStyle())
..addIconAction(Padding(
padding: const EdgeInsets.only(left: 8),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset(imagePaths.icArrowDown, fit: BoxFit.fill)))
..addOnPressActionWithPositionClick((position) =>
controller.openPopupMenuAction(
@@ -472,7 +504,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() {
if (controller.vacationResponse.value?.vacationResponderIsValid == true) {
return VacationNotificationMessageWidget(
margin: const EdgeInsets.only(top: 16, right: 16),
margin: EdgeInsets.only(
top: 16,
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
vacationResponse: controller.vacationResponse.value!,
actionGotoVacationSetting: () => controller.goToVacationSetting(),
actionEndNow: () => controller.disableVacationResponder());
@@ -491,7 +527,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
return Obx(() {
if (supportListButtonQuickSearchFilter(context)) {
return Padding(
padding: const EdgeInsets.only(right: 16, top: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
child: Row(children: QuickSearchFilter.values
.map((filter) => _buildQuickSearchFilterButton(context, filter))
.toList()
@@ -514,7 +554,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
);
return Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: InkWell(
onTap: () {
if (filter != QuickSearchFilter.last7Days) {
@@ -613,11 +656,18 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
borderRadius: const BorderRadius.all(Radius.circular(14)),
border: Border.all(color: AppColor.colorLineLeftEmailView),
color: Colors.white),
margin: const EdgeInsets.only(right: 16, top: 16),
margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(children: [
Padding(
padding: const EdgeInsets.only(right: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: SvgPicture.asset(
imagePaths.icDeleteTrash,
fit: BoxFit.fill)),
@@ -626,7 +676,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(left: 8),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: Text(
AppLocalizations.of(context).message_delete_all_email_in_trash_button,
style: const TextStyle(
@@ -671,7 +724,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
color: AppColor.colorShadowComposerButton
)
]))
..paddingIcon(const EdgeInsets.only(right: 8))
..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..iconColor(Colors.white)
..size(24)
..radiusSplash(10)
@@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class IconOpenAdvancedSearchWidget extends StatelessWidget {
IconOpenAdvancedSearchWidget(
@@ -23,11 +24,17 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
Widget build(BuildContext context) {
return Obx(
() => Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: buildIconWeb(
splashRadius: 15,
minSize: 40,
iconPadding: const EdgeInsets.only(right: 2),
iconPadding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 2,
left: AppUtils.isDirectionRTL(context) ? 2 : 0,
),
icon: SvgPicture.asset(_imagePaths.icFilterAdvanced,
colorFilter: searchController.isAdvancedSearchViewOpen.isTrue || searchController.advancedSearchIsActivated.isTrue
? AppColor.colorFilterMessageEnabled.asFilter()
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/ad
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/email_quick_search_item_tile_widget.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recent_search_item_tile_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
final MailboxDashBoardController dashBoardController;
@@ -189,7 +190,10 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
labelStyle: const TextStyle(color: Colors.black, fontSize: 16.0)
),
leftButton: Padding(
padding: const EdgeInsets.only(left: 8),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0
),
child: buildIconWeb(
minSize: 40,
iconPadding: EdgeInsets.zero,
@@ -215,10 +219,12 @@ class SearchInputFormWidget extends StatelessWidget with AppLoaderMixin {
final isFilterSelected = filter.isApplied(dashBoardController.searchController.listFilterOnSuggestionForm);
return Chip(
labelPadding: const EdgeInsets.only(
labelPadding: EdgeInsets.only(
top: 2,
bottom: 2,
right: 10),
right: AppUtils.isDirectionRTL(context) ? 0 : 10,
left: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
label: Text(
filter.getName(context),
maxLines: 1,
@@ -6,6 +6,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SpamReportBannerWebWidget extends StatelessWidget {
const SpamReportBannerWebWidget({ Key? key }) : super(key: key);
@@ -22,7 +23,11 @@ class SpamReportBannerWebWidget extends StatelessWidget {
}
return Container(
height: 84,
margin: const EdgeInsets.only(right: 16, top: 16),
margin: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
top: 16
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
@@ -53,8 +58,9 @@ class SpamReportBannerWebWidget extends StatelessWidget {
],
),
Padding(
padding: const EdgeInsets.only(
left: 32,
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 32,
right: AppUtils.isDirectionRTL(context) ? 32 : 0,
),
child: buildTextButton(
AppLocalizations.of(context).showDetails,
@@ -71,14 +77,24 @@ class SpamReportBannerWebWidget extends StatelessWidget {
),
],
),
Positioned(
top: 16,
right: 16,
child: buildSVGIconButton(
icon: imagePaths.icCloseComposer,
onTap: () => spamReportController.dismissSpamReportAction(),
),
),
if (AppUtils.isDirectionRTL(context))
Positioned(
top: 16,
left: 16,
child: buildSVGIconButton(
icon: imagePaths.icCloseComposer,
onTap: spamReportController.dismissSpamReportAction,
),
)
else
Positioned(
top: 16,
right: 16,
child: buildSVGIconButton(
icon: imagePaths.icCloseComposer,
onTap: spamReportController.dismissSpamReportAction,
),
)
],
),
);
@@ -57,6 +57,7 @@ class EmailRulesHeaderWidget extends StatelessWidget {
..iconColor(Colors.white)
..size(20)
..radiusSplash(10)
..addBoxConstraints(const BoxConstraints(minWidth: 130))
..padding(const EdgeInsets.symmetric(vertical: 12,horizontal: 8))
..textStyle(const TextStyle(
fontSize: 17,
@@ -68,7 +69,7 @@ class EmailRulesHeaderWidget extends StatelessWidget {
AppLocalizations.of(context).addNewRule,
isVertical: false,
)).build(),
const Expanded(child: SizedBox()),
const Spacer(),
],
);
} else {
@@ -34,7 +34,7 @@ extension LocaleExtension on Locale {
case 'ru':
return 'Русский';
case 'ar':
return 'اَلْعَرَبِيَّةُ';
return 'عربي';
case 'it':
return 'Italiano';
default:
@@ -2,11 +2,13 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/change_language_button_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/widgets/language_and_region_header_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
@@ -16,36 +18,44 @@ class LanguageAndRegionView extends GetWidget<LanguageAndRegionController> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: _responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop
: Colors.white,
body: Container(
width: double.infinity,
margin: _responsiveUtils.isWebDesktop(context)
? const EdgeInsets.all(24)
: EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)),
color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white,
decoration: _responsiveUtils.isWebDesktop(context)
? BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
color: Colors.white)
: null,
child: ClipRRect(
borderRadius: BorderRadius.circular(
_responsiveUtils.isWebDesktop(context) ? 20 : 0),
child: Padding(
padding: EdgeInsets.only(
left: _responsiveUtils.isWebDesktop(context) ? 24 : 0,
top: 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const LanguageAndRegionHeaderWidget(),
const SizedBox(height: 22),
Expanded(child: ChangeLanguageButtonWidget())
]
return Portal(
child: Scaffold(
backgroundColor: _responsiveUtils.isWebDesktop(context)
? AppColor.colorBgDesktop
: Colors.white,
body: Container(
width: double.infinity,
margin: _responsiveUtils.isWebDesktop(context)
? const EdgeInsets.all(24)
: EdgeInsets.symmetric(horizontal: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)),
color: _responsiveUtils.isWebDesktop(context) ? null : Colors.white,
decoration: _responsiveUtils.isWebDesktop(context)
? BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
color: Colors.white)
: null,
child: ClipRRect(
borderRadius: BorderRadius.circular(
_responsiveUtils.isWebDesktop(context) ? 20 : 0),
child: Padding(
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context)
? _responsiveUtils.isWebDesktop(context) ? 24 : 0
: 0,
left: AppUtils.isDirectionRTL(context)
? 0
: _responsiveUtils.isWebDesktop(context) ? 24 : 0,
top: 24
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const LanguageAndRegionHeaderWidget(),
const SizedBox(height: 22),
Expanded(child: ChangeLanguageButtonWidget())
]
),
),
),
),
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visib
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/utils/mailbox_visibility_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_header_widget.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
with AppLoaderMixin,
@@ -137,7 +138,11 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
context,
key: const Key('children_tree_mailbox_child'),
isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
paddingChild: const EdgeInsets.only(left: 10),
isDirectionRTL: AppUtils.isDirectionRTL(context),
paddingChild: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 10,
right: AppUtils.isDirectionRTL(context) ? 10 : 0,
),
parent: MailBoxVisibilityFolderTileBuilder(
_imagePaths,
mailboxNode,
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
@@ -75,7 +76,7 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
else
const SizedBox(width: 24),
if (!_mailboxNode.item.isTeamMailboxes)
_buildMailboxIcon(),
_buildMailboxIcon(context),
]
);
}
@@ -113,9 +114,12 @@ class MailBoxVisibilityFolderTileBuilder extends StatelessWidget {
);
}
Widget _buildMailboxIcon() {
Widget _buildMailboxIcon(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(right: 8),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
child: SvgPicture.asset(
_mailboxNode.item.getMailboxIcon(_imagePaths),
width: 20,
@@ -1,6 +1,7 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class MailboxVisibilityHeaderWidget extends StatelessWidget {
@@ -9,7 +10,10 @@ class MailboxVisibilityHeaderWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(left: 24),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 24,
right: AppUtils.isDirectionRTL(context) ? 24 : 0
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -11,6 +11,7 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart';
@@ -46,7 +47,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
desktop: Column(children: [
Row(children: [
Container(width: 256, color: Colors.white,
padding: const EdgeInsets.only(top: 25, bottom: 25, left: 32),
padding: SettingsUtils.getPaddingHeaderSetting(context),
child: Row(children: [
(SloganBuilder(arrangedByHorizontal: true)
..setSloganText(AppLocalizations.of(context).app_name)
@@ -71,7 +72,7 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
])
),
Expanded(child: Padding(
padding: const EdgeInsets.only(right: 10, top: 16, bottom: 10, left: 48),
padding: SettingsUtils.getPaddingRightHeaderSetting(context),
child: _buildRightHeader(context)))
]),
Expanded(child: Row(
@@ -6,6 +6,7 @@ import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
@@ -57,11 +58,18 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Padding(
padding: const EdgeInsets.only(left: 20, top: 24),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 20,
right: AppUtils.isDirectionRTL(context) ? 20 : 0,
top: 24
),
child: (ButtonBuilder(_imagePaths.icBack)
..key(const Key('button_back'))
..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorBgMailboxSelected))
..paddingIcon(const EdgeInsets.only(right: 8))
..paddingIcon(EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
left: AppUtils.isDirectionRTL(context) ? 8 : 0,
))
..iconColor(AppColor.colorTextButton)
..maxWidth(100)
..size(16)
@@ -72,14 +80,21 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
..text(AppLocalizations.of(context).back, isVertical: false))
.build()),
Padding(
padding: const EdgeInsets.only(left: 32, top: 20),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 32,
right: AppUtils.isDirectionRTL(context) ? 32 : 0,
top: 20
),
child: Text(
AppLocalizations.of(context).manage_account,
style: const TextStyle(color: Colors.black, fontWeight: FontWeight.bold, fontSize: 17))),
const SizedBox(height: 12),
Obx(
() => ListView.builder(
padding: const EdgeInsets.only(left: 16, right: 8),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 8 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 8
),
key: const Key('list_manage_account_property'),
shrinkWrap: true,
itemCount: controller.listAccountMenuItem.length,
@@ -95,21 +110,31 @@ class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Divider(color: AppColor.lineItemListColor, height: 0.5, thickness: 0.2)),
Padding(padding: const EdgeInsets.only(left: 32),
child: InkWell(
onTap: () {
controller.logout(
controller.dashBoardController.sessionCurrent.value,
controller.dashBoardController.accountId.value
);
},
child: Row(children: [
SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill),
const SizedBox(width: 12),
Expanded(child: Text(AppLocalizations.of(context).sign_out,
style: const TextStyle(fontWeight: FontWeight.normal, fontSize: 15, color: Colors.black)))
])
)
Padding(
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 32,
right: AppUtils.isDirectionRTL(context) ? 32 : 0,
),
child: InkWell(
onTap: () {
controller.logout(
controller.dashBoardController.sessionCurrent.value,
controller.dashBoardController.accountId.value
);
},
child: Row(children: [
SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill),
const SizedBox(width: 12),
Expanded(child: Text(
AppLocalizations.of(context).sign_out,
style: const TextStyle(
fontWeight: FontWeight.normal,
fontSize: 15,
color: Colors.black
)
))
])
)
),
]),
)),
@@ -9,6 +9,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings
import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/setting_first_level_tile_builder.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SettingsFirstLevelView extends GetWidget<SettingsController> {
SettingsFirstLevelView({Key? key}) : super(key: key);
@@ -25,7 +26,10 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
child: UserInformationWidgetBuilder(
_imagePaths,
controller.manageAccountDashboardController.userProfile.value,
titlePadding: const EdgeInsets.only(left: 16))
titlePadding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? 16 : 0
))
)),
Divider(
color: AppColor.colorDividerComposer,
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/profiles/prof
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef CloseSettingsViewAction = void Function();
@@ -66,9 +67,12 @@ class SettingsView extends GetWidget<SettingsController> {
fromAccountDashBoard: true,
vacationResponse: controller.manageAccountDashboardController.vacationResponse.value!,
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
leadingIcon: const Padding(
padding: EdgeInsets.only(right: 16),
child: Icon(Icons.timer, size: 20),
leadingIcon: Padding(
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: const Icon(Icons.timer, size: 20),
)
);
} else {
@@ -131,13 +135,14 @@ class SettingsView extends GetWidget<SettingsController> {
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Row(mainAxisSize: MainAxisSize.min, children: [
SvgPicture.asset(
_imagePaths.icBack,
width: 18,
height: 18,
AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
Container(
margin: const EdgeInsets.only(left: 8),
margin: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 8 : 0,
),
constraints: const BoxConstraints(maxWidth: 100),
child: Text(
AppLocalizations.of(context).settings,
@@ -2,6 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SettingsUtils {
static double getHorizontalPadding(BuildContext context, ResponsiveUtils responsiveUtils) {
@@ -142,4 +143,20 @@ class SettingsUtils {
return EdgeInsets.zero;
}
}
static EdgeInsets getPaddingHeaderSetting(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return const EdgeInsets.only(top: 25, bottom: 25, right: 32);
} else {
return const EdgeInsets.only(top: 25, bottom: 25, left: 32);
}
}
static EdgeInsets getPaddingRightHeaderSetting(BuildContext context) {
if (AppUtils.isDirectionRTL(context)) {
return const EdgeInsets.only(right: 48, top: 16, bottom: 10, left: 10);
} else {
return const EdgeInsets.only(right: 10, top: 16, bottom: 10, left: 48);
}
}
}
@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
typedef SettingFirstLevelTileClickAction = void Function();
@@ -41,7 +42,10 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
Row(
children: [
Padding(
padding: EdgeInsets.only(left: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? SettingsUtils.getHorizontalPadding(context, _responsiveUtils) : 0,
left: AppUtils.isDirectionRTL(context) ? 0 : SettingsUtils.getHorizontalPadding(context, _responsiveUtils),
),
child: _buildSettingIcon(context)),
Expanded(child: Padding(
padding: const EdgeInsets.only(left: 12, right: 12),
@@ -61,7 +65,11 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
),
subtitle != null
? Padding(
padding: EdgeInsets.only(left: _getSubtitleLeftPadding(context), right: 12, top: 12),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 12 : _getSubtitleLeftPadding(context),
right: AppUtils.isDirectionRTL(context) ? _getSubtitleLeftPadding(context) : 12,
top: 12
),
child: Text(
subtitle!,
style: const TextStyle(
@@ -72,9 +80,12 @@ class SettingFirstLevelTileBuilder extends StatelessWidget {
]
)),
IconButton(
padding: EdgeInsets.only(right: SettingsUtils.getHorizontalPadding(context, _responsiveUtils)),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : SettingsUtils.getHorizontalPadding(context, _responsiveUtils),
left: AppUtils.isDirectionRTL(context) ? SettingsUtils.getHorizontalPadding(context, _responsiveUtils) : 0,
),
icon: SvgPicture.asset(
_imagePath.icCollapseFolder,
AppUtils.isDirectionRTL(context) ? _imagePath.icBack : _imagePath.icCollapseFolder,
fit: BoxFit.fill,
colorFilter: AppColor.colorCollapseMailbox.asFilter()),
onPressed: clickAction
@@ -419,10 +419,9 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
Widget _buildMessagePlainTextEditor(BuildContext context) {
return (TextFieldBuilder()
..onChange((value) => controller.updateMessageBody(context, value))
..textInputAction(TextInputAction.next)
..keyboardType(TextInputType.multiline)
..addController(controller.messageTextController)
..textStyle(const TextStyle(color: Colors.black, fontSize: 16))
..keyboardType(TextInputType.text)
..minLines(10)
..maxLines(null)
..textDecoration((TextInputDecorationBuilder()
@@ -88,7 +88,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
inputConditionValueController = TextEditingController();
inputRuleNameFocusNode = FocusNode();
inputRuleConditionFocusNode = FocusNode();
}
@override
@@ -319,7 +318,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
newTMailRule);
if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else {
popBack(result: ruleFilterRequest);
@@ -330,7 +328,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
newTMailRule);
if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else {
popBack(result: ruleFilterRequest);
@@ -359,7 +356,6 @@ class RulesFilterCreatorController extends BaseMailboxController {
FocusScope.of(context).unfocus();
if (BuildUtils.isWeb) {
_disposeWidget();
onDismissRuleFilterCreator?.call();
} else {
popBack();
@@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_sta
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class SearchEmailView extends GetWidget<SearchEmailController>
with AppLoaderMixin {
@@ -108,11 +109,11 @@ class SearchEmailView extends GetWidget<SearchEmailController>
return Row(
children: [
buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icBack,
width: 18,
height: 18,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill),
icon: SvgPicture.asset(
AppUtils.isDirectionRTL(context) ? _imagePaths.icCollapseFolder : _imagePaths.icBack,
colorFilter: AppColor.colorTextButton.asFilter(),
fit: BoxFit.fill
),
tooltip: AppLocalizations.of(context).back,
onTap: () => controller.closeSearchView(context)
),
@@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/filter_messag
import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_report_banner_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart';
class ThreadView extends GetWidget<ThreadController>
with AppLoaderMixin,
@@ -187,11 +188,16 @@ class ThreadView extends GetWidget<ThreadController>
? EdgeInsets.zero
: controller.listEmailSelected.isNotEmpty ? const EdgeInsets.only(bottom: 70) : EdgeInsets.zero,
child: Align(
alignment: Alignment.bottomRight,
alignment: AppUtils.isDirectionRTL(context)
? Alignment.bottomLeft
: Alignment.bottomRight,
child: ScrollingFloatingButtonAnimated(
icon: SvgPicture.asset(_imagePaths.icCompose, width: 20, height: 20, fit: BoxFit.fill),
text: Padding(
padding: const EdgeInsets.only(right: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: Text(AppLocalizations.of(context).compose,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
@@ -532,14 +538,17 @@ class ThreadView extends GetWidget<ThreadController>
border: Border.all(color: AppColor.colorLineLeftEmailView),
color: Colors.white),
margin: EdgeInsets.only(
left: _responsiveUtils.isWebDesktop(context) ? 0 : 16,
right: 16,
left: AppUtils.isDirectionRTL(context) ? 16 : _responsiveUtils.isWebDesktop(context) ? 0 : 16,
right: AppUtils.isDirectionRTL(context) ? _responsiveUtils.isWebDesktop(context) ? 0 : 16 : 16,
bottom: _responsiveUtils.isWebDesktop(context) ? 0 : 16,
top: _responsiveUtils.isWebDesktop(context) ? 16 : 0),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(children: [
Padding(
padding: const EdgeInsets.only(right: 16),
padding: EdgeInsets.only(
right: AppUtils.isDirectionRTL(context) ? 0 : 16,
left: AppUtils.isDirectionRTL(context) ? 16 : 0,
),
child: SvgPicture.asset(
_imagePaths.icDeleteTrash,
fit: BoxFit.fill)),
@@ -548,7 +557,10 @@ class ThreadView extends GetWidget<ThreadController>
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(left: 8),
padding: EdgeInsets.only(
left: AppUtils.isDirectionRTL(context) ? 0 : 8,
right: AppUtils.isDirectionRTL(context) ? 0 : 8,
),
child: Text(
AppLocalizations.of(context).message_delete_all_email_in_trash_button,
style: const TextStyle(
+2 -1
View File
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
+7 -1
View File
@@ -1,7 +1,9 @@
import 'package:core/core.dart';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:intl/intl.dart' as intl;
class AppUtils {
@@ -26,4 +28,8 @@ class AppUtils {
}
static String? get fcmVapidPublicKey => BuildUtils.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null;
static bool isDirectionRTL(BuildContext context) {
return intl.Bidi.isRtlLanguage(Localizations.localeOf(context).languageCode);
}
}