Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support RTL mode #1930

Merged
merged 10 commits into from
Jun 15, 2023
2 changes: 1 addition & 1 deletion core/lib/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ export 'utils/platform_info.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
export 'presentation/views/text/text_field_builder.dart';
export 'presentation/views/text/text_form_field_builder.dart';
export 'presentation/views/text/input_decoration_builder.dart';
export 'presentation/views/text/text_builder.dart';
export 'presentation/views/text/rich_text_builder.dart';
export 'presentation/views/responsive/responsive_widget.dart';
export 'presentation/views/list/tree_view.dart';
Expand Down
4 changes: 2 additions & 2 deletions core/lib/data/network/download/download_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:core/data/network/dio_client.dart';
import 'package:core/data/utils/compress_file_utils.dart';
import 'package:core/presentation/extensions/html_extension.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/build_utils.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';

Expand Down Expand Up @@ -55,7 +55,7 @@ class DownloadClient {
return null;
}

if (BuildUtils.isWeb) {
if (PlatformInfo.isWeb) {
final base64Uri = encodeToBase64Uri({
'bytesData': bytesData,
'mimeType': 'image/$fileExtension',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@

import 'dart:convert';

import 'package:core/core.dart';
import 'package:core/data/network/dio_client.dart';
import 'package:core/data/utils/compress_file_utils.dart';
import 'package:core/presentation/extensions/html_extension.dart';
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:html/dom.dart';
Expand Down Expand Up @@ -59,7 +63,7 @@ class ImageTransformer extends DomTransformer {
options: Options(responseType: ResponseType.bytes));

if (responseData != null) {
if (BuildUtils.isWeb) {
if (PlatformInfo.isWeb) {
return encodeToBase64Uri(responseData);
} else {
final bytesCompressed = await compressFileUtils.compressBytesDataImage(responseData);
Expand Down
33 changes: 5 additions & 28 deletions core/lib/presentation/utils/html_transformer/html_template.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import 'package:flutter/material.dart';

const nameClassToolTip = 'tmail-tooltip';

const tooltipLinkCss = '''
Expand Down Expand Up @@ -27,6 +29,7 @@ String generateHtml(String content, {
String? styleCSS,
String? javaScripts,
bool hideScrollBar = true,
TextDirection? direction
}) {
return '''
<!DOCTYPE html>
Expand All @@ -53,35 +56,9 @@ String generateHtml(String content, {
</style>
${javaScripts ?? ''}
</head>
<body style = "overflow-x: hidden">
<body ${direction == TextDirection.rtl ? 'dir="rtl"' : ''} style = "overflow-x: hidden">
<div class="tmail-content">$content</div>
</body>
</html>
''';
}

const bodyCssStyleForEditor = '''
<style>
blockquote {
margin-left: 8px;
margin-right: 8px;
padding-left: 12px;
padding-right: 12px;
border-left: 5px solid #eee;
}
pre {
display: block;
padding: 10px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.5;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 4px;
overflow: auto;
}
</style>
''';
}
45 changes: 45 additions & 0 deletions core/lib/presentation/utils/html_transformer/html_utils.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@

import 'package:core/presentation/utils/html_transformer/html_event_action.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';

class HtmlUtils {

Expand Down Expand Up @@ -65,4 +67,47 @@ class HtmlUtils {
yDown = null;
}
''';

static String customCssStyleHtmlEditor({TextDirection direction = TextDirection.ltr}) {
if (PlatformInfo.isWeb) {
return '''
<style>
.note-editable {
direction: ${direction.name};
}

blockquote {
margin-left: 8px;
margin-right: 8px;
padding-left: 12px;
padding-right: 12px;
border-left: 5px solid #eee;
}

pre {
display: block;
padding: 10px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.5;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 4px;
overflow: auto;
}
</style>
''';
} else if (PlatformInfo.isMobile) {
return '''
#editor {
direction: ${direction.name};
}
''';
} else {
return '';
}
}
}
4 changes: 2 additions & 2 deletions core/lib/presentation/utils/icon_utils.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

import 'package:core/utils/build_utils.dart';
import 'package:core/utils/platform_info.dart';

class IconUtils {
static const double defaultIconSize = BuildUtils.isWeb ? 20.0 : 24.0;
static const double defaultIconSize = PlatformInfo.isWeb ? 20.0 : 24.0;
}
12 changes: 6 additions & 6 deletions core/lib/presentation/utils/responsive_utils.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:core/utils/build_utils.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';

Expand Down Expand Up @@ -82,7 +82,7 @@ class ResponsiveUtils {
}

bool hasLeftMenuDrawerActive(BuildContext context) {
if (BuildUtils.isWeb) {
if (PlatformInfo.isWeb) {
return isMobile(context) ||
isTablet(context) ||
isTabletLarge(context);
Expand All @@ -92,13 +92,13 @@ class ResponsiveUtils {
}

bool isWebDesktop(BuildContext context) =>
BuildUtils.isWeb && isDesktop(context);
PlatformInfo.isWeb && isDesktop(context);

bool isWebNotDesktop(BuildContext context) =>
BuildUtils.isWeb && !isDesktop(context);
PlatformInfo.isWeb && !isDesktop(context);

bool mailboxDashboardOnlyHasEmailView(BuildContext context) {
if (BuildUtils.isWeb) {
if (PlatformInfo.isWeb) {
return isMobile(context) || isTablet(context);
} else {
return isPortraitMobile(context) ||
Expand All @@ -108,7 +108,7 @@ class ResponsiveUtils {
}

bool landscapeTabletSupported(BuildContext context) {
if (BuildUtils.isWeb) {
if (PlatformInfo.isWeb) {
return isTabletLarge(context);
} else {
return !isLandscapeMobile(context) && (isLandscapeTablet(context) ||
Expand Down
7 changes: 4 additions & 3 deletions core/lib/presentation/utils/style_utils.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';

class CommonTextStyle {
Expand All @@ -9,9 +10,9 @@ class CommonTextStyle {
fontWeight: FontWeight.normal,
);

static const defaultTextOverFlow = BuildUtils.isWeb
static const defaultTextOverFlow = PlatformInfo.isWeb
? TextOverflow.fade
: TextOverflow.ellipsis;

static const defaultSoftWrap = BuildUtils.isWeb ? false : true;
static const defaultSoftWrap = PlatformInfo.isWeb ? false : true;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
Expand Down Expand Up @@ -60,7 +61,7 @@ class ConfirmationDialogActionSheetBuilder {
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10),
color: Colors.white,
child: MouseRegion(
cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
cursor: PlatformInfo.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: CupertinoActionSheetAction(
child: Text(
_messageText ?? '',
Expand All @@ -75,7 +76,7 @@ class ConfirmationDialogActionSheetBuilder {
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 10),
color: Colors.white,
child: MouseRegion(
cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
cursor: PlatformInfo.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: CupertinoActionSheetAction(
child: RichText(text: TextSpan(
style: _styleMessage ?? const TextStyle(fontSize: 14, color: AppColor.colorMessageConfirmDialog),
Expand All @@ -88,7 +89,7 @@ class ConfirmationDialogActionSheetBuilder {
Container(
color: Colors.white,
child: MouseRegion(
cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
cursor: PlatformInfo.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: CupertinoActionSheetAction(
child: Text(
_confirmText ?? '',
Expand All @@ -99,7 +100,7 @@ class ConfirmationDialogActionSheetBuilder {
),
],
cancelButton: MouseRegion(
cursor: BuildUtils.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
cursor: PlatformInfo.isWeb ? MaterialStateMouseCursor.clickable : MouseCursor.defer,
child: CupertinoActionSheetAction(
child: Text(
_cancelText ?? '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,10 @@ class EditTextDialogBuilder {
textAlign: TextAlign.center),
Padding(
padding: const EdgeInsets.only(top: 20),
child: TextFormField(
child: TextFormFieldBuilder(
keyboardType: TextInputType.visiblePassword,
onChanged: (value) => _onTextChanged(value, setState),
autofocus: true,
onTextChange: (value) => _onTextChanged(value, setState),
autoFocus: true,
controller: _textController,
decoration: InputDecoration(
errorText: _error,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
final double widthContent;
final double heightContent;
final HtmlViewerControllerForWeb controller;
final TextDirection? direction;

/// Handler for mailto: links
final Function(Uri?)? mailtoDelegate;
Expand All @@ -31,6 +32,7 @@ class HtmlContentViewerOnWeb extends StatefulWidget {
required this.controller,
this.allowResizeToDocumentSize = true,
this.mailtoDelegate,
this.direction,
}) : super(key: key);

@override
Expand Down Expand Up @@ -65,7 +67,9 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
@override
void didUpdateWidget(covariant HtmlContentViewerOnWeb oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.contentHtml != oldWidget.contentHtml) {
log('_HtmlContentViewerOnWebState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}');
if (widget.contentHtml != oldWidget.contentHtml ||
widget.direction != oldWidget.direction) {
createdViewId = _getRandString(10);
widget.controller.viewId = createdViewId;
_setUpWeb();
Expand Down Expand Up @@ -167,7 +171,8 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
minHeight: minHeight,
minWidth: minWidth,
styleCSS: tooltipLinkCss,
javaScripts: webViewActionScripts + scriptsDisableZoom);
javaScripts: webViewActionScripts + scriptsDisableZoom,
direction: widget.direction);

return htmlTemplate;
}
Expand Down Expand Up @@ -276,21 +281,18 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
return Container();
}

return Directionality(
textDirection: TextDirection.ltr,
child: FutureBuilder<bool>(
future: webInit,
builder: (context, snapshot) {
if (snapshot.hasData) {
return HtmlElementView(
key: ValueKey(htmlData),
viewType: createdViewId,
);
} else {
return Container();
}
return FutureBuilder<bool>(
future: webInit,
builder: (context, snapshot) {
if (snapshot.hasData) {
return HtmlElementView(
key: ValueKey(htmlData),
viewType: createdViewId,
);
} else {
return Container();
}
)
}
);
}
}
Loading