Commit Graph

845 Commits

Author SHA1 Message Date
dab246 190ccc7bc3 TF-4301 Add "Create a new label" button in Label As menus and wire up tagging in email view 2026-04-17 11:58:53 +07:00
dab246 2a3325ab7a TF-4265 Add integration test for attachment reminder on mobile 2026-04-07 13:20:25 +07:00
dab246 74c0c75023 TF-4265 Refactor: Move Regex pattern generation to Main Thread to leverage static caching and reduce Isolate initialization overhead. 2026-04-07 13:20:25 +07:00
dab246 55e27c78ed TF-4265 Additional config for include and exclude keywords 2026-04-07 13:20:25 +07:00
dab246 42fb24e6e5 TF-4265 Add include list to support custom keywords detection 2026-04-07 13:20:25 +07:00
dab246 1071bb49cf TF-4265 Add exclude list support to AttachmentTextDetector 2026-04-07 13:20:25 +07:00
dab246 772a5e3219 TF-4265 Update logic matchedKeywordsUnique method and add some keywords file, files, file., file?, .... 2026-04-07 13:20:25 +07:00
dab246 beb323874b TF-4392 [Team Mailbox] Auto save draft email team mailbox when edit 2026-04-01 18:08:12 +07:00
dab246 db8ae35c9d TF-4392 [Team Mailbox] Move email to trash on delete in Email List View 2026-04-01 18:08:12 +07:00
dab246 6a245f228a TF-4404 Fix missing subject when perform Mail to attendees action in event email 2026-03-27 10:36:23 +07:00
dab246 28d5036667 TF-4378 Migrate scribe-mobile branch to master branch 2026-03-25 11:52:35 +07:00
Théo Poizat 2ab6e0df02 [Scribe] Add Improve button (#4335) 2026-03-25 11:52:35 +07:00
Théo Poizat 13f81a9bee Include spacer in tablet bottom bar Scribe button 2026-03-25 11:52:35 +07:00
Théo Poizat 7b3e3e1b16 Do not focus composer when clicking on tablet bottom bar button 2026-03-25 11:52:35 +07:00
Théo Poizat 03a03b9088 Fix Scribe on responsive mobile
- Button was not added in MobileResponsiveAppBar
- Mobile behavior related scripts were not correctly added for web composer
- Mobile behavior related scripts return value was not properly handled for web composer
- In responsive web, bottomsheet modal clicks were intercepted by iframe behind
2026-03-25 11:52:35 +07:00
Théo Poizat 46a12745a5 Ensure replace function respect new lines in every editor 2026-03-25 11:52:35 +07:00
Théo Poizat 7a6a49fc7b Display Scribe mobile (bottomsheet) only when responsive mobile
Previosuly, we display Scribe mobile (bottomsheet) if platform was mobile, so also Android or iOS tablet.

Now we choose to display Scribe mobile relatively to display screens instead of platform to display the desktop Scribe (context menu) for tablets.
2026-03-25 11:52:35 +07:00
Théo Poizat 40030fe88e Properly escape HTML in every Scribe actions
In recent commits I separated how we could add text in the editor. So
we need to escape HTML in both method that add text:
insertTextInEditor and setTextInEditor.

I had to extract the HTML escape part of
convertTextContentToHtmlContent because when using setTextInEditor we
do not need to convert \n to <br>.
2026-03-25 11:52:35 +07:00
Théo Poizat cf8ed16ed0 Use warning logs instead of error logs for Scribe 2026-03-25 11:52:35 +07:00
Théo Poizat c05a01d92a Move Scribe icon in tablet at left of icons 2026-03-25 11:52:35 +07:00
Théo Poizat b5606626f4 Fix more Scribe mobile issues
- Add getSavedSelection to check saved selection without consuming it
- Distinguish between setText (replace all) and insertText (at cursor) operations
- Fix replace callback to use setText when no selection exists
- Clean up saved selection state after restoration in HTML utils
- Move mobile editor focus and selection restore to appropriate callbacks
2026-03-25 11:52:35 +07:00
Théo Poizat be7f28f270 Fix Scribe mobile issues
- Fix Scribe replace on mobile when opened from menu bar (to be complete
this fix needs this PR https://github.com/Enough-Software/enough_html_editor/pull/37)
- Ensure all mobile editor call are awaited
- Do not clear text if a selection has been restored (which mean we replace a selection)
- Avoid collapseToEnd crash
2026-03-25 11:52:35 +07:00
Théo Poizat 752f42dc7d Ensure editor is focused before calling insert HTML
enough_html_editor uses execCommand to insert HTML. However
execCommand only works if the contenteditable element is focused. So
inserting or replacing Scribe result do not work if the user did not
click before in the composer.

Here we manually focus the contenteditable element to fix this before
inserting content.
2026-03-25 11:52:35 +07:00
Théo Poizat 84176cb113 Hide keyboard and selection icons when Scribe mobile modal opened
When opening Scribe mobile modal, we now unfocus the composer to hide the keyboard and the selection start and end icons from the OS.

Add new methods to save, restore, and clear text selection in HTML editor. These methods allow preserving and restoring user selection state when opening the Scribe mobile modal so that the "replace" action still works.
2026-03-25 11:52:35 +07:00
Théo Poizat 245dfc714d Display sparkle button in mobile app bar to launch AI Scribe
- Same icon than for desktop
- Displayed only if AI Scribe is enabled
2026-03-25 11:52:35 +07:00
Théo Poizat b28dea732a Fix AI Scribe overlay button display in iOS
The button was never displayed because the selectionchange event listener was loaded when the WebView was not entirely loaded so selectionchange event were never fired.

Now we setup selection listener when the WebView is loaded instead of created.
2026-03-25 11:52:35 +07:00
Théo Poizat 03c70922a0 Fix selection coordinates in mobile
Because the HTML editor is different, we need a different selector to get the editable element.

We also need to add a small offset to the coordinates to avoid positionning the overlay icon above native selection UI in mobile. For example, Android adds a marker at the beginning and the end of the selection and we do not want to display the Scribe overlay icon above this marker.
2026-03-25 11:52:35 +07:00
Théo Poizat 9e601caa86 Enable AI scribe in mobile 2026-03-25 11:52:35 +07:00
dab246 d256b5ca52 TF-4367 Update logic apply Reply/Forward prefix for subject when compose email 2026-03-11 13:33:28 +07:00
dab246 b7594a4adb fix: The message field in UnknownRemoteException is typed as String? and the condition will always be false. 2026-03-10 11:06:16 +07:00
dab246 8a21e35d1e fix: Prefer reusing AppBaseException instead of redefining the exception contract CacheException and RemoteException 2026-03-10 11:06:16 +07:00
dab246 2e8a11e7eb refactor(sentry): standardize exceptions to prevent Sentry minification 2026-03-10 11:06:16 +07:00
Dat Dang 1b29b481c0 HOTFIX Integration test 0.24.8 (#4298) 2026-02-03 12:12:44 +07:00
Dat Dang de8de6c83f HOTFIX Create identity memory leak (#4295) 2026-02-02 19:46:11 +07:00
dab246 f9ff9ecde7 TF-4229 Add isSelected && condition to non-RTL selectedIconWidget rendering to match RTL behavior. 2026-01-22 10:54:04 +07:00
dab246 2052fdbe5e TF-4227 Add integration test on mobile for case display_view_with_all_email_with_tag_scenario 2026-01-19 11:34:43 +07:00
dab246 e8b2c1d2a5 TF-4195 Fix comments of coderabbit 2026-01-19 11:34:43 +07:00
dab246 0076a7af57 TF-4195 Implement add a Label to an email on mobile 2026-01-19 11:34:43 +07:00
dab246 03b3d1181f TF-4195 Add Label as to email context menu 2026-01-19 11:34:43 +07:00
dab246 1514136f39 TF-4136 Replace logError to logWarning for some place 2026-01-15 09:46:51 +07:00
dab246 fedb8fed93 TF-4136 Apply early exit to prevent string operation in log 2026-01-15 09:46:51 +07:00
dab246 df5ed118b3 TF-4141 should not show inkwell effect when user drag email into virtual folder 2026-01-11 22:55:49 +07:00
dab246 a23d15a9ca TF-4136 refactor(logging): replace logError with logWarning for non-critical cases 2026-01-06 13:53:22 +07:00
Dang Dat a31898185e [Memory leak] Handle dispose in MobileEditorWidget 2025-12-29 10:11:56 +07:00
dab246 20b93cd8db hotfix(ai-scribe): Fix text selection handler correctly gated by AI Scribe availability. 2025-12-29 05:13:18 +07:00
dab246 f45f55751f hotfix(ai-scribe): Only implement OnTextSelectionChanged when isAIScribeAvailable is true 2025-12-29 05:13:18 +07:00
dab246 29b54a76ee hotfix(ai-scribe): fix Safari keyboard input issue in AI Scribe search bar dialog 2025-12-23 17:27:26 +07:00
dab246 6e09d853fd feat(ai-scribe): Fix the English locale file `(intl_en.arb)` is missing all three AI Scribe keys
feat(ai-scribe): Fix async function declared without proper return type annotation.

feat(ai-scribe): Fix Async operations not properly awaited.

feat(ai-scribe): Fix inconsistent capitalization between button labels.

feat(ai-scribe): Fix GenerateAITextFailure check will never match.

feat(ai-scribe): Fix consider validating text input for predefined actions.

feat(ai-scribe): Using a subshell for directory isolation.

feat(ai-scribe): Fix verify the mock usage or document intent.

feat(ai-scribe): Using a more conventional import for Offset.

feat(ai-scribe): Adding error handling for consistency

feat(ai-scribe): Remove `fromJson` and `toJson` of AIResponse

feat(ai-scribe): Using constants for role values.

feat(ai-scribe): Using a more specific import.

feat(ai-scribe): Using Timer for cleaner lifecycle management

feat(ai-scribe): Adding error handling to fromMap() for consistency.

feat(ai-scribe): Disposing the ValueNotifier

feat(ai-scribe): Redundant null check after assignment

feat(ai-scribe): Fix calling `registerSelectionChangeListener` multiple times may be inefficient.

feat(ai-scribe): Safer type handling for JavaScript callback args

feat(ai-scribe): Fix async callbacks not awaited in switch statement.

feat(ai-scribe): Fix binding lifecycle mismatch for GetAIScribeConfigInteractor

feat(ai-scribe): Fix ai prompts

feat(ai-scribe): Fix unawaited async call to `_setupSelectionListener`

feat(ai-scribe): Fix switch cases use top-origin coordinates while `PositionedDirectional(bottom:)`` expects bottom-origin coordinates.

feat(ai-scribe): Adding error handling for selection listener setup.
2025-12-19 19:03:39 +07:00
dab246 6e56a50713 feat(ai-scribe): Load AI scribe config in dashboard 2025-12-19 19:03:39 +07:00
HuyNguyen 428d95c999 Enable AI Scribe modal based on configuration and availability 2025-12-19 19:03:39 +07:00