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

Maintenance v0.14.2 #3397

Closed
wants to merge 72 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
c207406
Disable language tool check for text field
dab246 Dec 16, 2024
65720aa
fixup! Disable language tool check for text field
dab246 Dec 16, 2024
617dbe0
Bump version to v0.14.3
hoangdat Dec 16, 2024
b3f3241
TF-3349 Escape messages when forward and reply email
dab246 Dec 16, 2024
2007665
TF-3349 Escape messages when print email
dab246 Dec 18, 2024
0b3f106
TF-3349 Add integration test for forward email
dab246 Dec 18, 2024
3f52c5d
Bump version to v0.14.4
hoangdat Dec 18, 2024
9225f9f
TF-3336 Make Echo ping of web socket optional
tddang-linagora Dec 16, 2024
6baff90
Format calendar event description
tddang-linagora Dec 16, 2024
3ee3913
TF-3341 Enable web socket for mobile
tddang-linagora Dec 17, 2024
918cfe7
TF-3341 Integration test web socket for mobile
tddang-linagora Dec 17, 2024
48a5495
TF-3334 Remove resynchronisation when performing actions with emails
dab246 Dec 18, 2024
9a6c40b
TF-3334 Auto resynchronisation search view when receives websocket no…
dab246 Dec 18, 2024
026e198
TF-3334 Remove resynchronisation when performing actions with mailbox
dab246 Dec 18, 2024
ccf49db
TF-3334 Auto resynchronisation mailbox search view when receives webs…
dab246 Dec 18, 2024
5cf7045
TF-3334 Remove `Email/get` of mark as read & mark as star action
dab246 Dec 18, 2024
de0c6a9
TF-3334 Remove `Email/get` of unsubscribe email action
dab246 Dec 18, 2024
73fe16a
TF-3334 Use queue to handle multiple refresh changes mailbox from inc…
dab246 Dec 23, 2024
65a52d5
TF-3334 Dispose web socket when close controller
dab246 Dec 23, 2024
d6c3ddc
TF-3334 Skip getting stored state in interactor when performing actio…
dab246 Dec 23, 2024
420df05
TF-3334 Add more concurrence test cases for WebSocketQueueHandler
hoangdat Dec 23, 2024
f2dd707
TF-3333 Remove `Mailbox/query` & `Mailbox/get` when performing displa…
dab246 Dec 19, 2024
ee82f21
TF-3332 Prevent refresh when switching mailbox
tddang-linagora Dec 20, 2024
b42ad94
fixup! TF-3332 Prevent refresh when switching mailbox
tddang-linagora Dec 20, 2024
39b8f66
fixup! TF-3332 Prevent refresh when switching mailbox
tddang-linagora Dec 23, 2024
63b1b48
fixup! TF-3332 Prevent refresh when switching mailbox
tddang-linagora Dec 24, 2024
36a0f77
TF-3181 Display contact support button on web app
dab246 Dec 5, 2024
23a3474
TF-3181 Display contact support button on mobile app
dab246 Dec 5, 2024
1a9cb88
TF-3181 Handle on click contact support
dab246 Dec 5, 2024
7a5ebd4
TF-3372 Fix [MU] Emptying trash: Many unnecessary `Email/query + Emai…
dab246 Dec 24, 2024
5445452
TF-3369 Fix cid image without disposition (#3373)
tddang-linagora Dec 26, 2024
cc50992
TF-3334 Synchonize cache all the time have new changes even in search…
hoangdat Dec 26, 2024
c3d7014
Bump version to v0.14.5
hoangdat Dec 26, 2024
dd19f3a
[CI] Fix Ruby conflict version
hoangdat Dec 30, 2024
3521317
TF-3372 Fix Empty Trash/Spam base on receivedAt
hoangdat Dec 30, 2024
32a7f1f
TF-3372 Add onProgressController to get the progress of emptying task
hoangdat Dec 30, 2024
3d8960e
TF-3372 Worker adds progress state to onProgressController in mobile/web
hoangdat Dec 30, 2024
0b4ade0
TF-3372 Adding onProgressController to interactor layer
hoangdat Dec 30, 2024
32d12f0
TF-3372 Use viewStateMailboxActionProgress to build progress bar for …
hoangdat Dec 30, 2024
6ae5cd1
TF-3372 Handle Empty mailbox success + failure states
hoangdat Dec 30, 2024
9748301
TF-3372 Handling error for empty trash failure
hoangdat Dec 31, 2024
f2ec6f2
TF-3337 Set maximum objects in `Email/Set` method when mark as read/s…
dab246 Dec 23, 2024
8bd4fbd
TF-3337 Write unit test to verify number of times call request when p…
dab246 Dec 23, 2024
e523ef1
TF-3370 Handle SetError when make email action (Mark as read/star/mov…
dab246 Jan 2, 2025
1408853
TF-3379 Show `replyAll` button when sender not me
dab246 Jan 2, 2025
44f2464
TF-3379 Add unit test for `getCountMailAddressWithoutMe` method
dab246 Jan 2, 2025
6627239
TF-3385 Update mailbox name
tddang-linagora Dec 31, 2024
8d1af53
TF-3385 Update mark as read and star
tddang-linagora Dec 31, 2024
7fa1a2d
TF-3385 Update recover deleted emails
tddang-linagora Dec 31, 2024
7e71eb1
TF-3385 Update save and remove draft email
tddang-linagora Jan 2, 2025
cb50c00
TF-3385 Update permanently delete emails
tddang-linagora Jan 2, 2025
76388ab
TF-3385 Update empty trash and spam emails
tddang-linagora Jan 2, 2025
1e1452e
TF-3385 Update move emails
tddang-linagora Jan 2, 2025
8bba046
TF-3385 Clean up ThreadController and SearchEmailController ever list…
tddang-linagora Jan 2, 2025
5c5233b
TF-3385 Update cache on set method
tddang-linagora Jan 2, 2025
aec0cd7
TF-3385 Create abstract group for update mailbox actions
tddang-linagora Jan 3, 2025
a20e325
TF-3385 Get & set multiple changes in email cache
tddang-linagora Jan 3, 2025
f4bcd6b
TF-3385 Add try-catch to cache method calls on user actions
tddang-linagora Jan 3, 2025
cd447aa
TF-3385 Remove skipCache mechanism in get all emails
tddang-linagora Jan 3, 2025
23852da
TF-3385 Fix mark as read not work properly
tddang-linagora Jan 3, 2025
2045037
TF-3385 Fix move and delete emails not work properly
tddang-linagora Jan 3, 2025
ec2a43e
TF-3385 Optimize misc
tddang-linagora Jan 3, 2025
c13c7f3
TF-3385 Revert undo operation handling
tddang-linagora Jan 3, 2025
a3ddf9b
TF-3385 Fix change flags not working
tddang-linagora Jan 3, 2025
2235fcc
TF-3385 Fix Map read status from fromIterable to fromEntries
tddang-linagora Jan 3, 2025
5cd2722
TF-3385 Fix tests update email flags extension
tddang-linagora Jan 3, 2025
eed47e2
TF-3385 Fix Map spam/unspam from fromIterable to fromEntries
hoangdat Jan 3, 2025
b8bf8ac
TF-3344 Handle separator when pasting list of mail addresses
dab246 Dec 24, 2024
b5959e6
TF-3344 Handle separator when submit list of mail addresses in text
hoangdat Jan 3, 2025
650cf08
Bump version to v0.14.6
hoangdat Jan 3, 2025
5e1c8be
Delegate cache control from Flutter to browser (#3289)
tddang-linagora Nov 28, 2024
671687a
Bump version to v0.14.7
hoangdat Jan 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
- name: Setup Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "ruby"
ruby-version: "3.3"
bundler-cache: true
working-directory: ${{ matrix.os }}

Expand Down
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
## [0.14.7] - 2025-01-05
### Fixed
- Delegate cache control from Flutter to browser

## [0.14.6] - 2025-01-03
### Fixed
- #3372 Paging empty trash
- #3370 Limit Email/set with limit is min of (50, maxObjectsInSet)
- #3379 Show replyAll button in case recipients not include me
- #3385 Realtime update UI base on Email/set
- #3344 Paste recipients to composer

## [0.14.5] - 2024-12-26
### Fixed
- #3336 Make Echo ping of web socket optional
- #3347 Format Calendar event description
- #3341 Enable Web socket for mobile in foreground
- #3334 Remove all own resynch after any actions in mailbox, email
- #3333 Remove Mailbox/query for spam banner when reload app
- #3332 Remove resynch when switching mailbox
- #3372 Remove Mailbox resynch when Emptying trash
- #3369 Display CID without disposition as an attachment

### Added
- #3181 Contact support

## [0.14.4] - 2024-12-18
### Fixed
- #3349 Sanitize HTML when forward/reply/replyAll an email
- #3349 Sanitize HTML when print email
- #3349 Add recipients information to the email body when forward/reply/replyAll an email

## [0.14.3] - 2024-12-16
### Fixed
- Disable Spell check API

## [0.14.2] - 2024-11-20
### Added
- #3010 Highlight search result with SearchSnippet method
Expand Down
3 changes: 3 additions & 0 deletions assets/images/ic_help.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions backend-docker/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ services:
- ./mailetcontainer.xml:/root/conf/mailetcontainer.xml
- ./imapserver.xml:/root/conf/imapserver.xml
- ./jmap.properties:/root/conf/jmap.properties
- ../provisioning/integration_test/search_email_with_sort_order/provisioning.sh:/root/conf/integration_test/search_email_with_sort_order/provisioning.sh
- ../provisioning/integration_test/search_email_with_sort_order/eml:/root/conf/integration_test/search_email_with_sort_order/eml
- ../provisioning/integration_test/provisioning.sh:/root/conf/integration_test/provisioning.sh
- ../provisioning/integration_test/eml:/root/conf/integration_test/eml
ports:
- "80:80"
environment:
Expand Down
4 changes: 3 additions & 1 deletion backend-docker/jmap.properties
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
url.prefix=https://a872-222-252-23-73.ngrok-free.app
authentication.strategy.rfc8621=BasicAuthenticationStrategy,com.linagora.tmail.james.jmap.ticket.TicketAuthenticationStrategy
url.prefix=
websocket.url.prefix=
17 changes: 0 additions & 17 deletions contact/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -688,15 +688,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.6.1"
languagetool_textfield:
dependency: transitive
description:
path: "."
ref: twake-supported
resolved-ref: f47dd9829e145acc795b4e3e62f8bc668135fcd6
url: "https://github.com/dab246/languagetool_textfield.git"
source: git
version: "0.1.0"
leak_tracker:
dependency: transitive
description:
Expand Down Expand Up @@ -1110,14 +1101,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.0"
throttling:
dependency: transitive
description:
name: throttling
sha256: e48a4c681b1838b8bf99c1a4f822efe43bb69132f9a56091cd5b7d931c862255
url: "https://pub.dev"
source: hosted
version: "2.0.1"
timing:
dependency: transitive
description:
Expand Down
1 change: 1 addition & 0 deletions core/lib/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export 'presentation/extensions/string_extension.dart';
export 'presentation/extensions/tap_down_details_extension.dart';
export 'domain/extensions/media_type_extension.dart';
export 'presentation/extensions/map_extensions.dart';
export 'presentation/extensions/either_view_state_extension.dart';

// Exceptions
export 'domain/exceptions/download_file_exception.dart';
Expand Down
12 changes: 12 additions & 0 deletions core/lib/presentation/extensions/either_view_state_extension.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';

extension EitherViewStateExtension on Either<Failure, Success> {
dynamic foldSuccessWithResult<T>() {
return fold(
(failure) => failure,
(success) => success is T ? success as T : null,
);
}
}
17 changes: 17 additions & 0 deletions core/lib/presentation/extensions/html_extension.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import 'dart:convert';

extension HtmlExtension on String {

static const String editorStartTags = '<div><br><br></div>';
Expand Down Expand Up @@ -40,4 +42,19 @@ extension HtmlExtension on String {
'cite',
attribute: 'style="text-align: left;display: block;"'
);
}

extension HtmlNullableExtension on String? {
String escapeHtmlString({HtmlEscapeMode escapeMode = HtmlEscapeMode.unknown}) {
try {
if (this?.trim().isNotEmpty != true) return '';

return HtmlEscape(escapeMode).convert(this!);
} catch (e) {
return '';
}
}

String escapeLtGtHtmlString() =>
escapeHtmlString(escapeMode: HtmlEscapeMode.element);
}
1 change: 1 addition & 0 deletions core/lib/presentation/resources/image_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ class ImagePaths {
String get icBadSignature => _getImagePath('ic_bad_signature.svg');
String get icDeleteSelection => _getImagePath('ic_delete_selection.svg');
String get icLogoTwakeWelcome => _getImagePath('ic_logo_twake_welcome.svg');
String get icHelp => _getImagePath('ic_help.svg');

String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:linkify/linkify.dart';
class SanitizeAutolinkFilter {

final HtmlEscape htmlEscape;
final bool escapeHtml;
final _linkifyOption = const LinkifyOptions(
humanize: true,
looseUrl: true,
Expand All @@ -18,7 +19,7 @@ class SanitizeAutolinkFilter {
const UrlLinkifier()
];

SanitizeAutolinkFilter(this.htmlEscape);
SanitizeAutolinkFilter(this.htmlEscape, {this.escapeHtml = true});

String process(String inputText) {
try {
Expand All @@ -36,7 +37,7 @@ class SanitizeAutolinkFilter {

for (var element in elements) {
if (element is TextElement) {
final escapedHtml = htmlEscape.convert(element.text);
final escapedHtml = escapeHtml ? htmlEscape.convert(element.text) : element.text;
htmlTextBuffer.write(escapedHtml);
} else if (element is EmailElement) {
final emailLinkTag = _buildEmailLinkTag(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'dart:convert';

import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart';

class NewLineTransformer extends TextTransformer {
const NewLineTransformer();

@override
String process(String text, HtmlEscape htmlEscape) {
return text
.replaceAll('\n', '<br>')
.replaceAll('\r', ' ')
.replaceAll('\t', ' ');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'dart:convert';

import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart';
import 'package:core/presentation/utils/html_transformer/sanitize_autolink_filter.dart';

class SanitizeAutolinkUnescapeHtmlTransformer extends TextTransformer {
const SanitizeAutolinkUnescapeHtmlTransformer();

@override
String process(String text, HtmlEscape htmlEscape) {
return SanitizeAutolinkFilter(htmlEscape, escapeHtml: false).process(text);
}
}
16 changes: 10 additions & 6 deletions core/lib/presentation/views/button/tmail_button_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class TMailButtonWidget extends StatelessWidget {
final MainAxisSize mainAxisSize;
final bool isLoading;
final Color? hoverColor;
final TextOverflow? textOverflow;

const TMailButtonWidget({
super.key,
Expand Down Expand Up @@ -74,6 +75,7 @@ class TMailButtonWidget extends StatelessWidget {
this.mainAxisSize = MainAxisSize.max,
this.isLoading = false,
this.hoverColor,
this.textOverflow,
});

factory TMailButtonWidget.fromIcon({
Expand Down Expand Up @@ -149,6 +151,7 @@ class TMailButtonWidget extends StatelessWidget {
BoxBorder? border,
int? maxLines,
Color? hoverColor,
TextOverflow? textOverflow,
}) {
return TMailButtonWidget(
key: key,
Expand All @@ -172,6 +175,7 @@ class TMailButtonWidget extends StatelessWidget {
border: border,
maxLines: maxLines,
hoverColor: hoverColor,
textOverflow: textOverflow,
);
}

Expand Down Expand Up @@ -200,7 +204,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
),
if (trailingIcon != null)
Expand Down Expand Up @@ -240,7 +244,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
),
)
Expand All @@ -253,7 +257,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
),
if (trailingIcon != null)
Expand Down Expand Up @@ -284,7 +288,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
),
)
Expand All @@ -297,7 +301,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
),
SizedBox(width: iconSpace),
Expand Down Expand Up @@ -339,7 +343,7 @@ class TMailButtonWidget extends StatelessWidget {
color: AppColor.colorTextButtonHeaderThread
),
maxLines: maxLines,
overflow: maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null,
overflow: textOverflow ?? (maxLines == 1 ? CommonTextStyle.defaultTextOverFlow : null),
softWrap: maxLines == 1 ? CommonTextStyle.defaultSoftWrap : null,
);
}
Expand Down
Loading
Loading