TF-1581 Update UI to support language RTL
This commit is contained in:
@@ -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)
|
||||
|
||||
+7
-3
@@ -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,
|
||||
|
||||
+9
-2
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
+5
-1
@@ -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)
|
||||
|
||||
+9
-2
@@ -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,
|
||||
|
||||
+27
-11
@@ -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,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
+2
-1
@@ -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 {
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ extension LocaleExtension on Locale {
|
||||
case 'ru':
|
||||
return 'Русский';
|
||||
case 'ar':
|
||||
return 'اَلْعَرَبِيَّةُ';
|
||||
return 'عربي';
|
||||
case 'it':
|
||||
return 'Italiano';
|
||||
default:
|
||||
|
||||
+40
-30
@@ -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())
|
||||
]
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
+6
-1
@@ -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,
|
||||
|
||||
+7
-3
@@ -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,
|
||||
|
||||
+5
-1
@@ -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
|
||||
)
|
||||
))
|
||||
])
|
||||
)
|
||||
),
|
||||
]),
|
||||
)),
|
||||
|
||||
+5
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+15
-4
@@ -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
@@ -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';
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user