Compare commits

..

555 commits

Author SHA1 Message Date
yu-i-i
3461c105f4 Fix: always include repository prefix in sandboxed compiles image name 2025-07-22 19:22:12 +02:00
yu-i-i
bfc75552a5 Fix template publishing to align with upstream project context changes 2025-07-22 19:22:12 +02:00
yu-i-i
0d3890e2ae Move documentation from README.md to Wiki 2025-07-22 19:22:12 +02:00
yu-i-i
a66cfc15ec Remove LDAP admin check via group search in ldap-passport 2025-07-22 19:22:11 +02:00
yu-i-i
9f8136d13a toggleSymbolPalette now in useEditorPropertiesContext 2025-07-22 19:22:11 +02:00
yu-i-i
5e527b9a61 Set use-ai capability to false 2025-07-22 19:22:11 +02:00
yu-i-i
88283f054d Track changes: convert to mjs 2025-07-22 19:22:11 +02:00
yu-i-i
e9efde94b7 Track changes: use getTrackedChangesUserIds introduced in the mainstream 2025-07-22 19:22:11 +02:00
yu-i-i
e8813f89cb Remove OVERLEAF_OIDC_DISABLE_JIT_ACCOUNT_CREATION in favor of OVERLEAF_OIDC_ALLOWED_EMAIL_DOMAINS 2025-07-22 19:22:11 +02:00
Synésio Neto
07a66fe94c Introduce an environment variable to allow JIT OIDC users creation based on their email address domain. 2025-07-22 19:22:11 +02:00
yu-i-i
af636b8940 Update README: variable to control JIT account creation in OIDC authentication 2025-07-22 19:22:11 +02:00
yu-i-i
08d22264c6 Introduce an environment variable to control user creation in OIDC authentication, closes #47 2025-07-22 19:22:11 +02:00
53f532fa29 I need the --network=host settings for building the container 2025-07-22 19:22:11 +02:00
yu-i-i
94c0234284 Avoid DEP0174 by removing async from callback-based getGroupPolicyForUser 2025-07-22 19:22:10 +02:00
yu-i-i
176a1a4f96 README.md: v5.5.0-v3 2025-07-22 19:22:10 +02:00
yu-i-i
3ce4381768 Fix missing Templates link on login page 2025-07-22 19:22:10 +02:00
yu-i-i
7de6dffb3c Fix login page 2025-07-22 19:22:10 +02:00
yu-i-i
dce4c64534 Update README.md: Changes to Template Gallery and Sandboxed Compiles, v5.4.1-ext-v3 2025-07-22 19:22:10 +02:00
yu-i-i
8af4a2996a Symbol Palette: make close button visible 2025-07-22 19:22:10 +02:00
yu-i-i
73ff0a0eee Template Gallery: replace markdown-it with marked 2025-07-22 19:22:10 +02:00
yu-i-i
571735fd8f Refactor Template Gallery; resolves #38 and #39
- Replace free-text license input with a select box
- Improve visual presentation of modals and enhance keyboard interaction
2025-07-22 19:22:10 +02:00
yu-i-i
2253ec577e Refactor Sandboxed Compiles 2025-07-22 19:22:10 +02:00
yu-i-i
88486fa491 README.md: v5.4.0-v2 2025-07-22 19:22:09 +02:00
yu-i-i
26521730ef Symbol Palette: improve keyboard input experience 2025-07-22 19:22:09 +02:00
yu-i-i
7bb14e7e9d Symbol Palette: get rid of @reach/tabs 2025-07-22 19:22:09 +02:00
yu-i-i
9e0792f665 Add 'poll' to clsi seccomp profile, fixes minted. Thanks, David. 2025-07-22 19:22:09 +02:00
yu-i-i
8a20b2b5a1 Update README.md: Template Gallery 2025-07-22 19:22:09 +02:00
yu-i-i
ae99d681bb Make Template Gallery optional; rename environment variables 2025-07-22 19:22:09 +02:00
yu-i-i
b035613237 Add Template Gallery support 2025-07-22 19:22:09 +02:00
yu-i-i
2a0d304b70 Enable From External URL feature 2025-07-22 19:22:08 +02:00
yu-i-i
da8bcee3c1 Minor changes in README.md 2025-07-22 19:22:08 +02:00
yu-i-i
f38be34f46 Track changes / comments: update backend to support frontend changes 2025-07-22 19:22:08 +02:00
yu-i-i
d86d6519e6 Allow EXTERNAL_AUTH to be undefined, fixes #26 2025-07-22 19:22:08 +02:00
yu-i-i
1e3e9a4096 Clarify OIDC redirect URI in README.md (closes #28) 2025-07-22 19:22:08 +02:00
yu-i-i
d0b38798d8 Symbol palette: switch to 'OL' UI components and apply minor cosmetic changes 2025-07-22 19:22:08 +02:00
yu-i-i
a31f70f4db Clarify OVERLEAF_OIDC_USER_ID_FIELD parameter usage (closes #24) 2025-07-22 19:22:08 +02:00
yu-i-i
bfecca5eb3 Make OVERLEAF_OIDC_USER_ID_FIELD support 'email' as a value 2025-07-22 19:22:08 +02:00
yu-i-i
b6f4eaf1df See upstream commit 42ee56e 2025-07-22 19:22:08 +02:00
yu-i-i
747b021030 Fix glitches in symbol palette after switching to Bootstrap 5 2025-07-22 19:22:07 +02:00
yu-i-i
db3f0d08dc Whitelist /oidc/login endpoint, fixes #21 2025-07-22 19:22:07 +02:00
yu-i-i
586afb3e70 Update README.md (add ENV variables to control SAML signature validation) 2025-07-22 19:22:07 +02:00
yu-i-i
f90b086f32 Add ENV variables to control SAML signature validation 2025-07-22 19:22:07 +02:00
yu-i-i
29ed51f81b Update README.md 2025-07-22 19:22:07 +02:00
yu-i-i
41d0404df4 Re-export doLogout (was removed from exports in commit b9fb636). 2025-07-22 19:22:07 +02:00
yu-i-i
beff3fdb07 Refactor authentication code; add OIDC support 2025-07-22 19:22:07 +02:00
yu-i-i
f5859e373f Allow adding extra flags to LaTeX compiler through environment variable 2025-07-22 19:22:06 +02:00
yu-i-i
f1e9b0645c Update README.md 2025-07-22 19:22:06 +02:00
yu-i-i
47cefe1c45 Enable LDAP and SAML authentication support 2025-07-22 19:22:06 +02:00
yu-i-i
c15930080c Enable Symbol Palette 2025-07-22 19:22:06 +02:00
yu-i-i
3b3fc01308 Allow selecting a TeX Live image for a project 2025-07-22 19:22:06 +02:00
Sam Van den Vonder
5d3d056af2 Enable Sandboxed Compiles feature 2025-07-22 19:22:06 +02:00
yu-i-i
010192506b Enable autocomplete of reference keys feature 2025-07-22 19:22:06 +02:00
yu-i-i
9821e64994 Enable track changes and comments feature 2025-07-22 19:22:05 +02:00
yu-i-i
3eb637d999 Redirect non-existing links to Overleaf page 2025-07-22 19:22:05 +02:00
Jakob Ackermann
0546fb7233 [third-party-datastore] improve error handling (#26881)
* [third-party-datastore] use generic serializer for dropboxError

The `err` serializer will not pick up all the dropbox fields.

Co-authored-by: Thomas Mees <thomas.mees@overleaf.com>

* [third-party-datastore] handle user_suspended like insufficient_space

Unlink dropbox and display a notification (same key to clear later).

Co-authored-by: Thomas Mees <thomas.mees@overleaf.com>

* [third-party-datastore] skip retries when rejected with disallowed_name

Co-authored-by: Thomas Mees <thomas.mees@overleaf.com>

* [web] sort translations

* [web] update copy for dropbox_unlinked_because_suspended

Co-authored-by: Kamal Arkinstall <kamal.arkinstall@overleaf.com>

---------

Co-authored-by: Thomas Mees <thomas.mees@overleaf.com>
Co-authored-by: Kamal Arkinstall <kamal.arkinstall@overleaf.com>
GitOrigin-RevId: 8fbb9074d1d6eb879e904d79dd4b2a2c952ff902
2025-07-22 08:07:13 +00:00
Jakob Ackermann
b1880ba64d [monorepo] upgrade tough-cookie in request to latest version (#27249)
GitOrigin-RevId: 9096e05d2c337c3d3a9b4ca6efec8fd40c51a622
2025-07-22 08:07:08 +00:00
Jakob Ackermann
082121d3da [web] reject upload requests without a file path (#27156)
* [web] reject upload requests without a file path

* [web] update copy on error message and link to contact form

Co-authored-by: Kamal Arkinstall <kamal.arkinstall@overleaf.com>

* [web] update copy: move dot to the end

---------

Co-authored-by: Kamal Arkinstall <kamal.arkinstall@overleaf.com>
GitOrigin-RevId: ba1ee81a91b046540caeb2f3f3da0e305611b35f
2025-07-22 08:07:03 +00:00
Jakob Ackermann
81f0807fc6 [web] prepare filestore migration for Server Pro/CE (#27230)
* [web] prepare filestore migration for Server Pro/CE

* [history-v1] remove unused USER_FILES_BUCKET_NAME env var from script

* [server-ce] tests: write default docker-compose.override.yml on startup

* [server-ce] tests: extend access logging of host-admin for response

* [server-ce] tests: test text and binary file upload

* [server-ce] tests: add tests for filestore migration

* [web] simplify feature gate for filestore/project-history-blobs logic

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

* [server-ce] test: fix flaky test helper

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: f89bdab2749e2b7a49d609e2eac6bf621c727966
2025-07-22 08:06:58 +00:00
Jakob Ackermann
bf43d4f709 [history-v1] make back_fill_file_hash_fix_up compatible with Server Pro (#27280)
* [history-v1] move MockFilestore into shared place

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

* [history-v1] make back_fill_file_hash_fix_up compatible with Server Pro

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: 70ea57e1503031d9f14dcd60c4c110e746450587
2025-07-22 08:06:41 +00:00
David
ae3f63d37f Merge pull request #27209 from overleaf/dp-collaborator-colour
Adapt online user and chat user colors based on luminance

GitOrigin-RevId: 1b0c843147ee3dc585866bc491a7c7613cb00e70
2025-07-22 08:06:32 +00:00
Antoine Clausse
30b0cabbbc [web] Update tests to add emails with 6-digits flow (#27076)
* In tests, post to `/user/emails/secondary` (6-digits) instead of the deprecated `/user/emails` (link-token)

* Update `addEmailAndConfirm` so it calls the right endpoint

* Remove unnecessary `userId` from `confirmEmail` and `addEmailAndConfirm` args

* Use `updateUser` to add unconfirmed email to user

* Confirm, then unconfirm emails, in order to test on unconfirmed emails

* Lowercase emails in `unconfirmSecondaryEmail`, so they get matched correctly

* Update UserEmailsTests.mjs with 6-digits flow, fetch, no `npm:async`

GitOrigin-RevId: 71b9ed65daebea5f22272240559caab375515f0c
2025-07-22 08:06:23 +00:00
Tim Down
2f427ef0e0 Merge pull request #27229 from overleaf/td-group-pricing-select
Allow clicks on icon in group plans select lists to open the select

GitOrigin-RevId: d54b27851cb8b5541d71c48ff815d52cf99db16f
2025-07-22 08:06:10 +00:00
Tim Down
0778bab910 Merge pull request #27254 from overleaf/td-project-dashboard-cookie-banner
Implement React cookie banner on project dashboard

GitOrigin-RevId: 95d2778d7ce7cb3054a06b06486b815a3453a623
2025-07-22 08:06:05 +00:00
Domagoj Kriskovic
d5b5710d01 Add docModified hook in ds-mobile-app module (#27196)
* Add docModified hook in ds-mobile-app module

* use Object.entries when iterating over promises

* avoid project lookup

* update tests

GitOrigin-RevId: 88676746f56558a97ce31010b57f5eeb254fefef
2025-07-22 08:05:56 +00:00
Domagoj Kriskovic
868d562d96 Support password-fallbackPassword array in requireBasicAuth (#27237)
GitOrigin-RevId: 33b15a05996bfa0190041f347772867a9667e2ca
2025-07-22 08:05:51 +00:00
Andrew Rumble
5d79cf18c0 Define all initial roles
GitOrigin-RevId: ad613bad4d8a47e327281e90b5475e989a3ccec4
2025-07-22 08:05:42 +00:00
Christopher Hoskin
7ecee2e0aa Merge pull request #27255 from overleaf/revert-27252-revert-26843-csh-issue-26608-mongo8-dev-ci
Revert "Revert "Upgrade the dev environment and CI to mongo 8""

GitOrigin-RevId: 5074b012504e65240017f1fde9b0d8d04c7b8b61
2025-07-22 08:05:25 +00:00
Christopher Hoskin
f4dc8f7ebc Merge pull request #27252 from overleaf/revert-26843-csh-issue-26608-mongo8-dev-ci
Revert "Upgrade the dev environment and CI to mongo 8"

GitOrigin-RevId: f2145812a5c1cf8d3d3ac31c76cc4aed4ea9d46d
2025-07-21 08:05:01 +00:00
Christopher Hoskin
456f751a18 Merge pull request #26843 from overleaf/csh-issue-26608-mongo8-dev-ci
Upgrade the dev environment and CI to mongo 8

GitOrigin-RevId: 5fc33863094ea2bdb9235372efdc7d0cb492c34a
2025-07-21 08:04:57 +00:00
Jakob Ackermann
48df8c9f38 [server-ce] reduce verbose output from cron jobs (#27240)
GitOrigin-RevId: 8a2eda551796e62af6fddf80a3ce8cf37ec309d4
2025-07-21 08:04:50 +00:00
Miguel Serrano
7540bc9cbe Merge pull request #27202 from overleaf/msm-fix-pricing
[web] Remove group size limits for additional licenses

GitOrigin-RevId: d48976ccd72ec5e99249f80ab5d3e9e85e089b18
2025-07-18 08:07:17 +00:00
David
5aacccc9d0 Merge pull request #27138 from overleaf/dp-overleaf-dark
Add overleaf dark editor theme

GitOrigin-RevId: bd8cdbcc7ad6b56078611b7c2ab69008ea578ae7
2025-07-18 08:07:06 +00:00
David
3fe4cd31b9 Merge pull request #27203 from overleaf/dp-overleaf-dark-theme-name
Change name of dark overall theme from "Default" to "Dark"

GitOrigin-RevId: 6928e4779c433e55525becfb5ba3f07a5b3847d3
2025-07-18 08:07:02 +00:00
David
8d8142ba2b Merge pull request #27205 from overleaf/dp-persist-rail-tab
Persist currently selected rail tab on refresh

GitOrigin-RevId: a609bed93340d950a1fba8358fd5ed20afe6a4ce
2025-07-18 08:06:57 +00:00
Antoine Clausse
cf668d897d [web] Create middleware and functions for checks on admin permissions (#27107)
* Create AdminCapabilities in admin-panel module

* Add `adminRolesEnabled` setting

* Use `PermissionsController.requirePermission` in admin-panel routes

* Update `adminCapabilities` to be an array

* Update frontend tests

* Rename `defaultAdminCapabilities` to `fullAdminCapabilities`

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Add tests to PermissionsManagerTests.js

* Get admin roles and capabilities from the database

* Add tests to admin-panel

* Fixup PermissionsManagerTests.js without admin-panel module

* Revert "Use `PermissionsController.requirePermission` in admin-panel routes"

This reverts commit ccbf3e3e3bca9239b786c662cba2ac6bd2f4117a.

* Revert "Fixup PermissionsManagerTests.js without admin-panel module"

This reverts commit 6d7ad207bb17c5ca4c12c489d4636a02c608926d.

* Revert "Add tests to PermissionsManagerTests.js"

This reverts commit 8f9cc911750911e1c4b74b631d8c8a1b1ca86630.

* Fix tests after the reverts

* Replace capabilities to more sensible examples ('modify-user-email' and 'view-project')

* Set `adminRolesEnabled: false` for now

* Return `[]` capabilities for non-admins

* Misc: types, test description, settings ordering

* Small refactor of AdminPermissions.mjs:

Reuse code with `getMissingCapabilities`
Throw when `requiredCapabilities` is empty

* Update tests after update

* Rename `checkAdminPermissions` to `hasAdminPermissions`

* Change role permissions to array instead of object

* Remove admin capabilities when `!Settings.adminPrivilegeAvailable`

* Return `[]` if there is no user id

* Throw if `user?._id` is missing

* Update services/web/modules/admin-panel/app/src/AdminPermissions.mjs

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Adjust to ForbiddenError constructor syntax

* Give empty capabilities for unknown role, update tests

---------

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: 1eec4f6a45e1cc3ae76a3a4603cec1ceba1c2322
2025-07-18 08:06:40 +00:00
Andrew Rumble
71a33925b6 Update types to match usage
GitOrigin-RevId: c3d175ba804bcb27613adf6604b9a45b714ee531
2025-07-18 08:06:26 +00:00
Antoine Clausse
98af0e3d82 [web] In tests, update email confirmation to use the 6-digits flow (#27069)
* Rename `sendExistingSecondaryEmailConfirmationCode` to `sendExistingEmailConfirmationCode`

* Deduplicate error handling into `throwIfErrorResponse`

* Update `userHelper.confirmEmail` to use the 6-digits flow

GitOrigin-RevId: 91bdf7b185407b58520ca6b2aa1a7c71bdd23bc8
2025-07-18 08:06:18 +00:00
Brian Gough
5208ad39ec Merge pull request #27173 from overleaf/bg-filestore-migration-remove-backups
remove backup code from back_fill_file_hash script and tests

GitOrigin-RevId: 364eefc47670e6e7f2314de810ea259b609ff976
2025-07-18 08:06:14 +00:00
David
2e82852ed0 Merge pull request #27125 from overleaf/ae-extension-exports
Add CodeMirror history-related exports to `UNSTABLE_editor:extensions` event

GitOrigin-RevId: 015a19f8b97075ee441dda1d42e19d7f81804ed7
2025-07-18 08:06:06 +00:00
David
b0776da02c Merge pull request #27119 from overleaf/dp-select-error-text
Make error log header text selectable

GitOrigin-RevId: f3844d20bb11abf32ee053da763531c39d63a543
2025-07-18 08:06:02 +00:00
David
ec2ab62f4d Merge pull request #27171 from overleaf/dp-make-a-copy
Update copy of copy project option

GitOrigin-RevId: 3d1cc544f3945f55600f0daf1021b07de9d207bc
2025-07-18 08:05:58 +00:00
David
be4a11484f Merge pull request #27172 from overleaf/dp-file-menu-settings
Add settings option to file menu

GitOrigin-RevId: a5ad0cecad5b7896185a8b9c91364c7904961438
2025-07-18 08:05:53 +00:00
David
97eceb9c58 Merge pull request #27174 from overleaf/dp-subscription-settings
Add subscription option to settings modal

GitOrigin-RevId: 5f38db41c1d4f5727d56e2d0a4e0740e83114f15
2025-07-18 08:05:49 +00:00
David
63ca134fc5 Merge pull request #27182 from overleaf/dp-file-outline-spacing
Fix nesting of file outline

GitOrigin-RevId: b18e5eca9bdfb2c01c244e3843d0ae38041a7378
2025-07-18 08:05:45 +00:00
David
ee8e1915ab Merge pull request #27183 from overleaf/dp-file-tree-open-state
Persist rail tab isOpen state

GitOrigin-RevId: f1cbaa80fecd10953e9be61a993d69bd2c3c7915
2025-07-18 08:05:41 +00:00
Andrew Rumble
f054a5658f Run npm install with new npm version
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: 8d81e73f528c34ad8df8b09716198dbaeebee23f
2025-07-18 08:05:33 +00:00
Andrew Rumble
5df6047fd8 Add npm engines entry
GitOrigin-RevId: 4f5ba34447d339cebba654835045c3eff1e23b39
2025-07-18 08:05:28 +00:00
Andrew Rumble
29d9408a69 Add vitest check when initialising redis
This is similar to the Mocha checks and will error if a connection is
attempted.

GitOrigin-RevId: 35e73cb56dc7c72393c55f40b6c18e9aaf74ab50
2025-07-18 08:05:14 +00:00
Tim Down
9c16a85295 Merge pull request #24030 from overleaf/td-bs5-remove-font-awesome
Remove Font Awesome in BS5

GitOrigin-RevId: 3ee9b136ac9ecda57ba9985d1da7d7a7e6b275e6
2025-07-18 08:05:06 +00:00
Brian Gough
5669a7d1c8 Merge pull request #27147 from overleaf/bg-filestore-migration-for-server-pro-II
add support for fetching files via http from filestore in back_fill_file_hash script and tests

GitOrigin-RevId: 8dea6383ed6fe9ee6786a5695e2deee93b1cdd84
2025-07-17 08:05:30 +00:00
MoxAmber
93c6353b90 Merge pull request #27120 from overleaf/as-compile-timeout-date-change
[web] Update compile timeout enforcement date

GitOrigin-RevId: 9c6957bad440a381e954e1f4de98d603d31aef42
2025-07-17 08:05:05 +00:00
Jakob Ackermann
9720413218 [web] add support for pug caching when running E2E tests in dev-env (#27073)
GitOrigin-RevId: bbb53723bd1bc22db5b3d440539f1624a905341f
2025-07-16 08:06:07 +00:00
Jakob Ackermann
8c39add865 [clsi-cache] meter ingress and egress bandwidth (#27143)
* [mics] fix "app" label in clsi-cache metrics in dev-env

* [clsi-cache] validate filePath when processing file

* [clsi-cache] meter ingress and egress bandwidth

Files are downloaded directly from nginx, hence we cannot meter egress
in clsi-cache easily.

GitOrigin-RevId: 24de8c41728f0e9c984113c1470dec6153e75f20
2025-07-16 08:05:59 +00:00
M Fahru
3e29af53a8 Merge pull request #27058 from overleaf/mf-re-add-sticky-header-plans-page
[web] Re-add sticky header for mobile plans table on bs5 version of the plans page

GitOrigin-RevId: 2c97e9983f8d0e1beb312c135558758a7f4f2ec0
2025-07-16 08:05:48 +00:00
Eric Mc Sween
1833bd3d00 Merge pull request #27126 from overleaf/em-fix-persist-changes
Fix chunk creation over a one change chunk

GitOrigin-RevId: aecae334849522975b83c77224ee27db64de4ed8
2025-07-16 08:05:40 +00:00
Liangjun Song
1daa49d9d2 Merge pull request #27093 from overleaf/ls-support-3ds-in-group-plan-update-flows
Support 3DS verification in group plan update flows

GitOrigin-RevId: 3206f612e5699f39ac44864daf6610da2956e6ca
2025-07-16 08:05:25 +00:00
Liangjun Song
9e22ed9c3f Merge pull request #26934 from overleaf/ls-support-individual-to-group-plan-upgrade
Support individual to group plan upgrade in Stripe

GitOrigin-RevId: 24cbe7bd6de86a4d9410e1abc49b6457e0871f40
2025-07-16 08:05:20 +00:00
David
1375f695d3 Merge pull request #27079 from overleaf/mj-base-theme-extraction
[web] Extract breadcrumbs theme to constant

GitOrigin-RevId: 55d65597a85a7da5cf5506caf8e13d4e2977fb1f
2025-07-16 08:05:16 +00:00
David
5b5e650754 Merge pull request #27078 from overleaf/mj-dark-mode-panel-border
[web] Use correct border color between toolbar and editor

GitOrigin-RevId: 48e08bdec57b25f2f70731f89c66be8c487b9e41
2025-07-16 08:05:12 +00:00
David
ce074ecf11 Merge pull request #27128 from overleaf/mj-ide-tooltip-teardown
[web] Editor Redesign: Tear down editor nudge tooltips

GitOrigin-RevId: 83c412ad782d041c960eba8533ffc49935524b9c
2025-07-16 08:05:07 +00:00
David
42a408c6ae Merge pull request #27053 from overleaf/dp-review-panel-disabled
Disable review panel tab when it cannot be opened in new editor

GitOrigin-RevId: 586ef06bc7cd27efdec6cb7ccc287f4ad41e4da5
2025-07-16 08:05:03 +00:00
Rebeka Dekany
488d0fdf9e Preserve source-only extensions on file switch (#27080)
GitOrigin-RevId: 661c70b78a508619e6532b87b0409f546b4d9e82
2025-07-15 08:06:32 +00:00
Jessica Lawshe
524402e817 Merge pull request #26603 from overleaf/jel-domainCaptureEnabled
[web] Add admin toggle for setting `domainCaptureEnabled` feature for groups

GitOrigin-RevId: d116a493402f39c06b3267bf5294ed90ed3e762d
2025-07-15 08:06:23 +00:00
Jessica Lawshe
3c24c9bcc9 Merge pull request #26473 from overleaf/jel-group-domainCapture
[web] Add admin toggle for setting `domainCapture` feature for groups

GitOrigin-RevId: d4dc373aa0d7863f83129126613a38d914afbd5f
2025-07-15 08:06:19 +00:00
Jessica Lawshe
1768bef22a Merge pull request #26366 from overleaf/jel-group-csv
[web] Include in group members CSV if user is managed and/or linked to the group's SSO

GitOrigin-RevId: 449974917d98cf121ea46eaa58be4b3666d88268
2025-07-15 08:06:14 +00:00
Jakob Ackermann
0f1d672a57 [server-ce] update copy/logo in README (#27104)
* [server-ce] add warning on not using sandboxed compiles

Co-authored-by: Mathew Evans <matt.evans@overleaf.com>

* [server-ce] update logo

Co-authored-by: Jamie Liu <jamie.liu@overleaf.com>

---------

Co-authored-by: Mathew Evans <matt.evans@overleaf.com>
Co-authored-by: Jamie Liu <jamie.liu@overleaf.com>
GitOrigin-RevId: 9fafa951af9918924eae5493dbe8f9aa3dfc87b2
2025-07-15 08:06:09 +00:00
Jakob Ackermann
2e2415c56e [server-pro] move revision from /var/www/revisions.txt into label (#27071)
Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: d760498b50006a23f446a91647954d00fa22f2f2
2025-07-15 08:05:57 +00:00
roo hutton
caedd0f850 Merge pull request #27046 from overleaf/rh-header-footer
Header and footer changes

GitOrigin-RevId: 963b07e6240401b6fc87ace7328b6f5a2046dc6c
2025-07-15 08:05:52 +00:00
roo hutton
1b70f09bee Merge pull request #27031 from overleaf/rh-safari-video-el
Catch video autoplay errors from Safari

GitOrigin-RevId: c2ed2b0a720603bfb80ebb3025c4ed107eec7f06
2025-07-15 08:05:47 +00:00
roo hutton
fe8964cc0a Merge pull request #26994 from overleaf/rh-cio-ai-assist
Expose AI status to customer.io

GitOrigin-RevId: 7e69676d686326f50b16cbae9b1e4d97c14612fa
2025-07-15 08:05:42 +00:00
Antoine Clausse
10f4722641 [web] Add some types to web module (#27051)
* Update `WebModule` types

* Add `if (module.middleware)` so types are satisfied

GitOrigin-RevId: 875fa2710a65d557037771c3eb76ff3cb0e73429
2025-07-15 08:05:34 +00:00
Antoine Clausse
4c03ebe4ee [web] Add some types for existing capabilities and PermissionController (#27048)
* Add types on existing Capabilities code

* Add ts-expect-error comments

* Minor code changes to satisfy types

* Remove ts-check because of unrelated errors

* Remove some ts-expect-error comments

* Revert "Remove some ts-expect-error comments"

This reverts commit 76cc0a073710eecf4f8b88f8579405838607f4d5.

* Remove the `@ts-check`s for now

It looks like typescript is somewhat flaky. We can re-enable this later

* Remove the `@ts-expect-error`s

* Remove return type

GitOrigin-RevId: 57bbd370654592c0662047e72e61f91bf38e0949
2025-07-15 08:05:29 +00:00
Antoine Clausse
c20c17b68e [web] Fix clockDelta computation in socket diagnostic (#27022)
GitOrigin-RevId: f27ac2b182c650a38cf74806152e10460a8dd21b
2025-07-15 08:05:24 +00:00
Kristina
ea2ba8cdbe [web] add error messages for payment failing on upgrade (#27054)
* [web] add error messages for payment failing to upgrade modal
* [web] show payment error on preview change page
* [web] add separate message for 3ds failure

GitOrigin-RevId: b2680ff9b4f01e42f31c1c11457f216a5eadf49d
2025-07-15 08:05:19 +00:00
Kristina
2ac46151f8 Merge pull request #26996 from overleaf/kh-include-region-in-errors
[web] improve errors thrown from StripeClient & PaymentService

GitOrigin-RevId: 59319936cc0caa876d80b068aac324dfe469b343
2025-07-15 08:05:14 +00:00
Eric Mc Sween
122c618e53 Merge pull request #27085 from overleaf/em-upgrade-oauth-tokens
Script for upgrading OAuth token scopes

GitOrigin-RevId: 9411494d402a1ff4bdc275ce54d574049a5f5060
2025-07-14 08:06:14 +00:00
Andrew Rumble
a9fa1aa598 Replace uses of resolve in place of a NextFunction
rejectOnError is safer

GitOrigin-RevId: 9ae988975ce5c4921964ecdab5892b72def0e78e
2025-07-14 08:06:09 +00:00
Eric Mc Sween
6abd4fe23e Merge pull request #26975 from overleaf/em-dsmp-subscribe
Add DS mobile app subscribe/unsubscribe endpoints

GitOrigin-RevId: 7396ccd54671016c62d61076e5e92ff3ecd42338
2025-07-14 08:06:01 +00:00
Rebeka Dekany
e35f79bf32 Tear down bs5-auth-pages feature flag (#27035)
* Remove auth-pages-bs5 test assignment setPassword

* Remove auth-pages-bs5 test assignment passwordReset

* Remove auth-pages-bs5 test assignment primaryEmailCheck

* Remove auth-pages-bs5 test assignment reconfirm

* Remove - bootstrap5PageStatus = 'enabled'

* Remove primary-email-check.less

* Fix spacing

* Remove unused translations

* Removed unused SplitTestHandler

* Update password_reset_sentence_case to password_reset

GitOrigin-RevId: d5a5c9a1576f325186aa103c4b7ad8fb819b790a
2025-07-14 08:05:56 +00:00
Rebeka Dekany
35f5588be4 Tear down cms-pages-bs5 feature flag - BS3 CMS pages (#27032)
* Remove cms-pages-bs5 assignments

* Remove BS3 version of CMS pages

* Remove website-redesign.less

* Remove default variant and update path

* Use async await

GitOrigin-RevId: a7728de85d971cd1cc66f340a5bc6f6e45c16101
2025-07-14 08:05:43 +00:00
Mathias Jakobsen
39b4581e1d Merge pull request #26735 from overleaf/mj-system-theme
[web] Add new system theme to the editor

GitOrigin-RevId: b65083c5e96abc493556e901c861689cb7e3bbf7
2025-07-14 08:05:37 +00:00
Miguel Serrano
72aca352fc [web] Group audit log for Feature disablement (#26930)
Adds a `update-group-policy` group audit log including the policies that are toggled.

GitOrigin-RevId: a582d612d20c8547995228e6b92b730373a89b63
2025-07-11 08:07:45 +00:00
Miguel Serrano
5351488f0e [web] Feature disablement status on user's admin panel (#26924)
* [web] Feature disablement status on user's admin panel

Adds a visual hint on the end user's admin panel when
dropbox/chat/ai features are disabled

GitOrigin-RevId: ded7a80120821ff606cc2c3b61bc2d82615c6026
2025-07-11 08:07:40 +00:00
Miguel Serrano
406312d495 Merge pull request #26513 from overleaf/msm-fix-sso-disable-managed-group
[web] Fix disable managed users clears SSO enrollment

GitOrigin-RevId: 75742840b5cee98a203ad11e9213e2e31cf18985
2025-07-11 08:07:32 +00:00
Jimmy Domagala-Tang
d5e00845c6 Revert "Merge pull request #27060 from overleaf/em-log-oauth-authenticate-errors" (#27062)
This reverts commit 32bb3c66b61d0de8cbbfe1da08042f06b4f4342a, reversing
changes made to 5e87b704cd90478aedc8d8befa0aa5787a53177b.

Co-authored-by: Eric Mc Sween <5454374+emcsween@users.noreply.github.com>
GitOrigin-RevId: 10b51500e3429a637dc76e3cec7d6b2764708ddb
2025-07-11 08:07:27 +00:00
Eric Mc Sween
bc49968908 Merge pull request #27060 from overleaf/em-log-oauth-authenticate-errors
Log OAuth authentication errors

GitOrigin-RevId: 32bb3c66b61d0de8cbbfe1da08042f06b4f4342a
2025-07-11 08:07:23 +00:00
Brian Gough
2f2862ecd7 Merge pull request #26637 from overleaf/bg-clsi-fix-process-group-for-local-compiles
fix "stop compile" option for local command runner in CE/SP

GitOrigin-RevId: 7986b505362aaf33ac6e161b3b54458baba1e2e6
2025-07-11 08:07:11 +00:00
Brian Gough
85ecef4d96 Merge pull request #26652 from overleaf/bg-run-e2e-tests-under-wayland
allow running e2e tests under Wayland

GitOrigin-RevId: 281186059300b4012e7f57b963b2577bfd5d0d93
2025-07-11 08:07:03 +00:00
M Fahru
8a07389ce6 Merge pull request #26979 from overleaf/mf-show-error-alert-in-plans-page
[web] Show error alert in plans page if error occurs when accessing Stripe checkout page

GitOrigin-RevId: 51cce691b25bc6bd59ee004c2ba495b75639c737
2025-07-11 08:06:58 +00:00
M Fahru
028d4b481f Merge pull request #26965 from overleaf/mf-trials-convert-to-regular-should-not-send-subscription-renewed
[web] Stop sending any event when trial changes to active for Stripe subscription on `customer.subscription.updated` stripe webhook event type

GitOrigin-RevId: 11256878cd2828036aad3130a05ad36d95466199
2025-07-11 08:06:50 +00:00
M Fahru
fd8a4ac020 Merge pull request #26970 from overleaf/mf-fix-spacing-issue-plans-faq
[web] Fix various spacing issues in plans page -> faq section

GitOrigin-RevId: d265c4c0b92f093a496ec8a4a180f1061e007b11
2025-07-11 08:06:46 +00:00
David
e38b04a3ee Merge pull request #27047 from overleaf/dp-fix-lint
Remove unneeded import

GitOrigin-RevId: 4120038529e2b15845b491c624d98bab2819d482
2025-07-11 08:06:41 +00:00
David
e7918247b4 Merge pull request #27034 from overleaf/dp-rail-tabs-on-click
Ensure rail tab always opens when clicked

GitOrigin-RevId: 70a01fab81c15011753b469a117cde599f98b541
2025-07-11 08:06:37 +00:00
David
beb3d87a77 Merge pull request #27036 from overleaf/dp-max-errors-message
Fix logic for PdfLogsEntries hasErrors prop

GitOrigin-RevId: ca9346bac807176882059ba758594356a7fa854f
2025-07-11 08:06:32 +00:00
David
d014db9893 Merge pull request #27037 from overleaf/dp-file-outline-spacing
Reduce line height for file outline items in new editor

GitOrigin-RevId: 4f022a99d264b919cd591eb028eaa24664dc914a
2025-07-11 08:06:28 +00:00
David
f0d2df3c43 Merge pull request #27040 from overleaf/dp-file-tree-close-button
Add close button to file tree rail panel

GitOrigin-RevId: d8abac122e266922b9ca914bc5df6ae7895b3796
2025-07-11 08:06:19 +00:00
Brian Gough
8fab1b54a3 Merge pull request #27025 from overleaf/bg-delete-redis-buffer-when-project-deleted
delete redis buffer when project deleted

GitOrigin-RevId: eef7b6fdeb04cb556ae47794379d83e659f89b2e
2025-07-11 08:06:08 +00:00
ilkin-overleaf
97f1425326 Merge pull request #27018 from overleaf/ii-flexible-licensing-manually-billed-billed-tear-down-revert
[web] Revert "FL manually billed subscription feature flag tear down"

GitOrigin-RevId: 7cc809570d310f56b8f9e1a4f43ca895db8a8073
2025-07-11 08:06:03 +00:00
ilkin-overleaf
f5dd356df3 Merge pull request #27017 from overleaf/ii-flexible-licensing-manually-billed-users-add-seats-revert
[web] Revert "FL manually billed subscriptions with no upsell"

GitOrigin-RevId: 3ce5441f825f9a364d3c17e3ac09aa3b9e87b0e7
2025-07-11 08:05:58 +00:00
ilkin-overleaf
8efe921326 Merge pull request #27016 from overleaf/ii-group-admin-managed-status-revert
[web] Revert "Managed status for group admin"

GitOrigin-RevId: 5a691a4f3702292648d484c8148bb2707c64028c
2025-07-11 08:05:54 +00:00
ilkin-overleaf
ca426842c1 Merge pull request #27014 from overleaf/ii-join-group-copy-improvement-revert
[web] Revert "Copy change on the consent screen when joining a managed group"

GitOrigin-RevId: 0690545a38c362f3cd32ec04bc7e2ae36808ebc3
2025-07-11 08:05:49 +00:00
ilkin-overleaf
da0967e902 Merge pull request #27015 from overleaf/ii-groups-pagination-2-revert
[web] Revert "Group members page pagination"

GitOrigin-RevId: 83c377e319c32110bdaa22970cc378f2aa89be7c
2025-07-11 08:05:44 +00:00
Jakob Ackermann
95b5c1f659 [terraform] clsi: add C4D trial (#27033)
* [terraform] clsi: add C4D trial

* [terraform] clsi: make SPOT instance setup idempotent

GitOrigin-RevId: 19d5cf0b1f3aaaa967a2b1e78eba77fc1887cc65
2025-07-11 08:05:36 +00:00
roo hutton
6bdcd1f803 Merge pull request #26901 from overleaf/rh-hotjar-marketing
Add hotjar tracking to marketing pages

GitOrigin-RevId: 5490392b44a287e4853778416323b3aa5fbfc1ef
2025-07-11 08:05:25 +00:00
David
14afc82acf Merge pull request #27003 from overleaf/dp-modal-opacity
Change settings modal appearance tab to have transparent backdrop

GitOrigin-RevId: 9cbf36164a8d82ec5945d06c7107a3b73b334cfe
2025-07-11 08:05:20 +00:00
David
029395ebb9 Merge pull request #26990 from overleaf/dp-pdf-logs-max-entries
Ensure that PreviewLogsPaneMaxEntries uses new style log entry in new editor

GitOrigin-RevId: 964525a4676eeb341ce168aa3189ef59bb26b1cc
2025-07-11 08:05:15 +00:00
Mathias Jakobsen
9e6ca01e7f Merge pull request #27005 from overleaf/mj-editor-redesign-feature-flag
[web] Allow editor redesign to be loaded through feature flag

GitOrigin-RevId: b600b0d42c7a052fde19be3eee46c9e11cc3bac1
2025-07-11 08:05:10 +00:00
Mathias Jakobsen
4ab4fbdf51 Merge pull request #26951 from overleaf/mj-layout-broken
[web] Add restoreView to LayoutContext

GitOrigin-RevId: 3a50c1e215c99236f503285fee1c924df57e07e4
2025-07-11 08:05:06 +00:00
Mathias Jakobsen
6b6ff921ef [web] Add W&C nudges to full-library synced libraries (#26784)
GitOrigin-RevId: d958191a543993a0080f0c58ebd373bad0b42aa2
2025-07-11 08:05:01 +00:00
Tim Down
bfa0459e72 Merge pull request #26928 from overleaf/td-remove-use-scope-value
Remove useScopeValue and its associated store

GitOrigin-RevId: 439d6eb16343f65695ef615a9ff697d0cc5ad2c7
2025-07-10 08:08:59 +00:00
Jimmy Domagala-Tang
e4a9b13e9a fix: adding target blank to usage limits link in assist paywall (#26817) (#26792)
GitOrigin-RevId: da9624b51c0394c81f6355470322d7185a144b21
2025-07-10 08:08:51 +00:00
Jimmy Domagala-Tang
102f3a5d5c fix: prevent users spam clicking from creating multiple projects (#26818)
GitOrigin-RevId: 8e867d02df70424f710b101e23e0889101e31d72
2025-07-10 08:08:42 +00:00
Jimmy Domagala-Tang
1083a05d69 adding link to delete writefull account on deletion modal (#26974)
GitOrigin-RevId: 6e9dec05a7cecb3013b629bc87b066466db9ed02
2025-07-10 08:08:37 +00:00
Davinder Singh
698d2aebb1 adding a check on the variable (#27021)
GitOrigin-RevId: 9ecc517ff9bee1dac14e579d494294c0efeb6b69
2025-07-10 08:08:29 +00:00
M Fahru
8ea682cba3 Merge pull request #26823 from overleaf/mf-re-add-cta-click-event-homepage
[web] Re-add homepage CTA click events that were accidentally removed

GitOrigin-RevId: d0452562f0a39f396e54ade0127e1fa2801f917b
2025-07-10 08:08:20 +00:00
M Fahru
c62c2d6157 Merge pull request #26820 from overleaf/mf-fix-btn-class-missing-homepage
[web] Fix missing `.btn` class from the "begin now" card

GitOrigin-RevId: ec51d3875a1a567a6bf051761becb3202e0fb580
2025-07-10 08:08:15 +00:00
M Fahru
1e9dcd9983 Merge pull request #26750 from overleaf/mf-fix-tooltip-disabled-plans-cta
[web] Fix tooltip isn't showing properly in plans CTA for disabled state in bs5 plans page

GitOrigin-RevId: e734e3ed93cfa8c28211d4f721aded1e968d142a
2025-07-10 08:08:10 +00:00
M Fahru
da203d6e96 Merge pull request #26749 from overleaf/mf-tear-down-plans-page-bs5
[web] Tear down plans-page-bs5 and make the bs5 version the default version

GitOrigin-RevId: 6a4d8c8a75597bbda23057f8ca404cf6c5e1f428
2025-07-10 08:08:06 +00:00
Mathias Jakobsen
298f56cbe5 [web] Support multi-byte characters in online user name (#26882)
GitOrigin-RevId: 9547ed7df13fcf8bb51ddd8c3f59167c2099e4e6
2025-07-10 08:08:01 +00:00
David
3c63c1ac3e Merge pull request #26971 from overleaf/dp-settings-button-active-state
Avoid using OLIconButton to remove active background on rail settings button

GitOrigin-RevId: c0a6c47e258ff350e82dfc465f9d37123411e446
2025-07-10 08:07:56 +00:00
Domagoj Kriskovic
11cb140fe3 Move AI related functions from PaymentProviderEntities to AiHelper (#26956)
* Move AI related functions from PaymentProviderEntities to AiHelper

* added @ts-check

GitOrigin-RevId: 8c8eec334b40a7f8f8533f6d5194f428112f68f9
2025-07-10 08:07:51 +00:00
Alf Eaton
d617fd0754 Add visual preview (#26947)
GitOrigin-RevId: f77b59219909971b11416f196783b3ab7198ed91
2025-07-10 08:07:28 +00:00
Alf Eaton
3e9d60c25a Ensure collaborator cursor colour is updated (#26847)
GitOrigin-RevId: 7057cdbb4815d5f1c5e5771d38255e58f592f9cd
2025-07-10 08:07:23 +00:00
Alf Eaton
bd64f09b91 Test entity counts on admin project info page (#26845)
GitOrigin-RevId: a49926358f367a7cbfb8aa2a1bc77a1cc1fd0b77
2025-07-10 08:07:18 +00:00
Alf Eaton
b410de7c39 Disable Insert > Comment menu item when no text is selected (#26805)
GitOrigin-RevId: a5fdd662cd487359f9b09212a449d7831bb5dcac
2025-07-10 08:07:13 +00:00
Alf Eaton
b87b83e33c Use full URL for keyboard shortcuts documentation (#26777)
GitOrigin-RevId: dc165fc475a0d2513eaebec0176479dd538a7bac
2025-07-10 08:07:08 +00:00
Alf Eaton
b843603bb1 Use data-type="number" for numeric meta values (#26775)
GitOrigin-RevId: 844f56383457ee7f2043af553b7dd5ae1b33f8a9
2025-07-10 08:07:04 +00:00
Eric Mc Sween
b165fea0de Merge pull request #26915 from overleaf/em-jd-increase-max-request-size
Increase web's max JSON request size to 12 MB

GitOrigin-RevId: 91da31e14570e770553049d8376ae1686eba3336
2025-07-10 08:06:55 +00:00
Eric Mc Sween
7219043c6b Merge pull request #26918 from overleaf/em-transfer-to-reviewer
Support ownership transfer to reviewer

GitOrigin-RevId: 1e97439e720a2125028a1776525f5c3766a289ef
2025-07-10 08:06:50 +00:00
Rebeka Dekany
bae2eb3861 Improve landmarks on the learn pages (#26821)
* Add search HTML tag and improve landmarks

* Add material symbol icons

* Add translation and improve landmarks

GitOrigin-RevId: bd0ddcce16348883c58ae547623b8e615b55df27
2025-07-10 08:06:45 +00:00
Rebeka Dekany
59b34d7c2b Fix table layout of Audit logs (#26796)
GitOrigin-RevId: 9882b3ba56bfbe6e78b03e1721ab77dcd55a7e85
2025-07-10 08:06:40 +00:00
Tim Down
905cc5d45f Move project context out of scope value store (#26615)
* Refactor project context to not use scope store

* Fix Cypress tests for project context changes

* Fix frontend React Testing Library tests for project context changes

* Remove redundant code

* Fix some project types in tests

* Remove unused import and fix a type

* Throw an error if updating the project in the project context before joining the project

* Fix some review panel tests

* Remove unused imports

GitOrigin-RevId: 2f0c928b651f387aa980c29aef7d1ba0649790a7
2025-07-10 08:06:31 +00:00
David
9237d8227b Merge pull request #26972 from overleaf/dp-file-tree-icons
Improvements to file tree icon buttons

GitOrigin-RevId: a27b25e11c90f1b833fac0f5ce2c1cb8d0cedb8c
2025-07-10 08:06:26 +00:00
Davinder Singh
349fb62f60 adding a specific class for quote to avoid overriding general blockquote tag (#26987)
GitOrigin-RevId: 046322bdc05b9322ede5920af2b829beca0bc0d2
2025-07-10 08:06:20 +00:00
Davinder Singh
8adc7526d9 Tearing down "paywall-change-compile-timeout" (#26741)
* removing the split test

* removing translations

* removing comments

* removing odcRole

GitOrigin-RevId: 8654876a6d97c52058fe9416f4495845d1320765
2025-07-10 08:06:10 +00:00
Davinder Singh
97d2954cc0 Home page burger menu scroll fix (#26853)
* adding a scroll fix

* generalising the solution so it works for both BS3 and BS5

GitOrigin-RevId: 8dd0d82356b484adcad9de487b12ecfc4050d109
2025-07-10 08:05:59 +00:00
David
6969caf690 Merge pull request #26969 from overleaf/dp-chat-text-color
Fix chat empty state colors in dark mode

GitOrigin-RevId: 8daca1971443d0112068bb06bb312ab633d39a20
2025-07-10 08:05:54 +00:00
David
e17eaf51d2 Merge pull request #26967 from overleaf/dp-synctex-not-bold
Change synctex icons in new editor to not be bold

GitOrigin-RevId: edb5aab8248c484b3791c0705dd571bdb405e612
2025-07-10 08:05:49 +00:00
David
faabd91e43 Merge pull request #26966 from overleaf/dp-review-panel-border
Fix review panel border in dark mode

GitOrigin-RevId: 68ad036b6d452be6259afbcd1eae723a873756c2
2025-07-10 08:05:44 +00:00
David
496093203a Merge pull request #26932 from overleaf/dp-auto-expand-first-message
Auto-expand first error log in new editor

GitOrigin-RevId: 03237426fb7127c631b2da3488322deb22b8d63b
2025-07-10 08:05:39 +00:00
David
74063b14e0 Merge pull request #26909 from overleaf/dp-eq-preview-presentation-mode
Prevent codemirror tooltips appearing on top of pdf preview

GitOrigin-RevId: 0c6ce15cd91b4958674fbc247bcd27ce5778f7fc
2025-07-10 08:05:34 +00:00
Kristina
6ce114da77 Revert "Revert "[web] link to correct Stripe dashboard from admin panel (#26756)"" (#26984)
This reverts commit 30aae5a0b0849a736e27e34661971dd9a950202e.

GitOrigin-RevId: c4837ece509a1f8da525f49895402f2f4f298f11
2025-07-10 08:05:21 +00:00
Rebeka Dekany
66b7fd8844 Fix selectors in e2e tests (#26695)
* Fix e2e tests

* Fix e2e tests

GitOrigin-RevId: 10bb27b6b33dd38d35964d327c0122d094a0abc9
2025-07-09 08:07:17 +00:00
Eric Mc Sween
ebf810e836 Merge pull request #26968 from overleaf/em-revert-jul8
Revert bad deploy

GitOrigin-RevId: fd6227cf4fde7fd8053b47365154d59d15fa115e
2025-07-09 08:07:12 +00:00
ilkin-overleaf
9d1641a1ab Merge pull request #26842 from overleaf/ii-flexible-licensing-manually-billed-billed-tear-down
[web] FL manually billed subscription feature flag tear down

GitOrigin-RevId: c860e8fc17c14685688fb834260772d9b63bcc6a
2025-07-09 08:06:49 +00:00
ilkin-overleaf
aa9dcb19a3 Merge pull request #26829 from overleaf/ii-flexible-licensing-manually-billed-users-add-seats
[web] FL manually billed subscriptions with no upsell

GitOrigin-RevId: b5f2083c7eabd0a1a5d024d5699d2c5e5556671a
2025-07-09 08:06:44 +00:00
ilkin-overleaf
9b43b82c95 Merge pull request #26770 from overleaf/ii-group-admin-managed-status
[web] Managed status for group admin

GitOrigin-RevId: 15db443f1ab06174dd5c30e48eff6b495166ec07
2025-07-09 08:06:40 +00:00
Kristina
c5fad346f9 [web] link to correct Stripe dashboard from admin panel (#26756)
* [web] link to correct Stripe dashboard from admin panel
* [web] be more careful about constructing the base URL
* [web] be extra careful about accessing values in the subscription
* [web] switch to plain text environment variables

GitOrigin-RevId: 5fa802fce11967f56289b11476f39e2e1d5a9c74
2025-07-09 08:06:35 +00:00
ilkin-overleaf
37b63f9823 Merge pull request #26634 from overleaf/ii-join-group-copy-improvement
[web] Copy change on the consent screen when joining a managed group

GitOrigin-RevId: e888673778e42b8db2a857a58df89b06c4b38cdb
2025-07-09 08:06:30 +00:00
ilkin-overleaf
cb945472c7 Merge pull request #26610 from overleaf/ii-groups-pagination-2
[web] Group members page pagination

GitOrigin-RevId: 9c7635bf24bed0af6d7d1a9626cae310f524b3e0
2025-07-09 08:06:26 +00:00
Jakob Ackermann
9fc0373fab [terraform] clsi: add C3D trial (#26929)
* [terraform] clsi: add C3D trial

* [terraform] clsi: switch C3D to standard variant with local SSD

GitOrigin-RevId: 6e6ceeb93ee94800d8ce46557322da82dc99fc2a
2025-07-09 08:06:10 +00:00
Andrew Rumble
1a1f283245 Update node to 22.17.0
GitOrigin-RevId: 7a15f7a0e95e3331c589955aca1fbc5dfb13a568
2025-07-09 08:06:01 +00:00
Andrew Rumble
f0827f0e67 consider trustedUsersRegex when choosing to show captcha at login
GitOrigin-RevId: 963fe1c40d05fe088a092eb45b12bcddf1f18e7b
2025-07-09 08:05:56 +00:00
Andrew Rumble
519b18e4a1 Lint fixes
GitOrigin-RevId: 686f3fb718faf5830a34656d45f888c8e245f7f9
2025-07-09 08:05:48 +00:00
Andrew Rumble
1b03bb6e5d Fix prettier
GitOrigin-RevId: a3bdc1bc6a8bfa05ed9f8d7bfcd91cbd4cd48375
2025-07-09 08:05:43 +00:00
Andrew Rumble
8a5e2b0ea3 Update package-lock file
This step is required as renovate is not able to generate a lockfile
itself

GitOrigin-RevId: d5fcdc4a98b24c6fb5662ef77dac6a1cf47589c2
2025-07-09 08:05:31 +00:00
renovate[bot]
6176f4d074 Update linters
GitOrigin-RevId: e6ce5461881abe515f57b9b066bb81c194f80e53
2025-07-09 08:05:22 +00:00
Tim Down
132ccbc4cc Merge pull request #26583 from overleaf/td-editor-scope-values-to-context
Move scope values starting with `editor.` to contexts

GitOrigin-RevId: 7ca349ceff002228cf4e931c644c8c386eb6c597
2025-07-09 08:05:15 +00:00
Domagoj Kriskovic
b2fb70c2b6 Add support for --any-comments to check_docs script (#26903)
GitOrigin-RevId: 283e761a3f305286584164b12e9736deba0064d9
2025-07-08 08:08:04 +00:00
Rebeka Dekany
5ed1225162 Remove admin-panel LESS stylesheet (#26797)
GitOrigin-RevId: e289ed2c82623034785d08564e01340828f7b91c
2025-07-08 08:07:52 +00:00
Rebeka Dekany
83a00e7546 Remove info Badge from the left menu (#26856)
GitOrigin-RevId: 108571730106aea29db2454b646c88cc9fc3f39a
2025-07-08 08:07:47 +00:00
M Fahru
16f3795c3e Merge pull request #25962 from overleaf/mf-stripe-payment-page-form-success-event
[web] Simulate sending `payment-page-form-success` event when user successfully subscribe using Stripe

GitOrigin-RevId: 82243fc16d3410670e4e6e9c0ccd487a5f2253a3
2025-07-08 08:07:20 +00:00
M Fahru
b3c339464e Merge pull request #25911 from overleaf/mf-stripe-payment-page-form-submit-event
[web] Simulate `payment-page-form-submit` event for Stripe subscription

GitOrigin-RevId: 8cfa1a2d91aaea4314a4a40f3256bade50507084
2025-07-08 08:07:16 +00:00
David
d4ab715a9b Merge pull request #26738 from overleaf/dp-search-filter-select-color
Fix selected state color for search modifiers in dark mode

GitOrigin-RevId: 9f488bdb57591d3f92c52283778ce38ee9e315b5
2025-07-08 08:07:11 +00:00
David
5973c90e39 Merge pull request #26726 from overleaf/dp-capitalize-pdf
Capitalize PDF in pdf error state

GitOrigin-RevId: 8a2f42cbadcc355759d836d68bfbb712dfae46ab
2025-07-08 08:07:06 +00:00
Mathias Jakobsen
2cacf8f645 [web] Fix zip name in e2e tests (#26888)
GitOrigin-RevId: d0efd0f09af04ea5039d0f5335f8d1a776dcf3a3
2025-07-08 08:06:54 +00:00
Brian Gough
16135bde64 Merge pull request #26874 from overleaf/bg-sp-hotfix-5-5-2-cve-2024-22088
add security update for CVE-2025-22088 in CE/SP 5.5.2 hotfix

GitOrigin-RevId: 6c61e0a120b82d5f5edb29b3a5f96c4dac6f1a68
2025-07-08 08:06:45 +00:00
Mathias Jakobsen
23403a7ef2 Merge pull request #26771 from overleaf/td-tooltip-click-trigger
Make OLTooltip with click trigger work

GitOrigin-RevId: e4b976255dd514af0cfa199b9bd6815b3a8a09ef
2025-07-08 08:06:41 +00:00
Mathias Jakobsen
c10b95ae06 Merge pull request #26757 from overleaf/mj-papers-notification-teardown
[web] Tear down papers-notification-banner

GitOrigin-RevId: c6cb0affe85147f34f3dc6c36041fe190faf7ff2
2025-07-08 08:06:36 +00:00
Mathias Jakobsen
b89951cf5d Merge pull request #26814 from overleaf/mj-review-panel-comment-collapse
[web] Fix review panel check for comments in active document

GitOrigin-RevId: fc0c35bc1d2f253c133dec5dcea7f81f68d723a9
2025-07-08 08:06:31 +00:00
Mathias Jakobsen
56232b48a7 Merge pull request #26827 from overleaf/mj-zip-download-name
[web] Sanitise project name in zip download

GitOrigin-RevId: 3b22da84002f57e3965c529c673344af04db9128
2025-07-08 08:06:26 +00:00
Mathias Jakobsen
bd3ef799f3 Merge pull request #26832 from overleaf/mj-system-messages
[web] Move system messages back to top of page

GitOrigin-RevId: 627a0e33e0cc49d75912621afc706da82aee7080
2025-07-08 08:06:21 +00:00
Mathias Jakobsen
913caca379 Merge pull request #26850 from overleaf/mj-chat-deleted-user
[web] Handle deleted users in chat threads

GitOrigin-RevId: 6593bf37e4f2339b40069b7cf4198166660852fb
2025-07-08 08:06:17 +00:00
Liangjun Song
c6b576b25a Merge pull request #26574 from overleaf/ls-group-plan-seats-adding-in-stripe
Support group plan seats adding in Stripe

GitOrigin-RevId: 9c46c167388c5578a1513f908e409ab5d940c1df
2025-07-08 08:06:12 +00:00
Jakob Ackermann
d7a0cbefea [history-v1] fix typo in metrics name in redis chunk store (#26865)
GitOrigin-RevId: 5b37e3b22a3250fcfbd7411e635cc11ed38dcb27
2025-07-08 08:05:52 +00:00
Jakob Ackermann
cf472f54d0 [history-v1] use POST requests for expiring redis buffer from cron (#26568)
* [history-v1] use POST requests for expiring redis buffer from cron

(cherry picked from commit 15780ac54e36b96e1aed9fd9eb6dfe9d4fbf842f)

* [history-v1] remove double claim of expire job

GitOrigin-RevId: 8b2eab07006a5819a47eed3f646b2a4d75f86e5b
2025-07-08 08:05:47 +00:00
Domagoj Kriskovic
d57d0ca738 Unselect files before deleting (#26810)
GitOrigin-RevId: 6bf22bc4983c96b7e2b45067aa0970c7fea293e2
2025-07-08 08:05:42 +00:00
Antoine Clausse
7d5bf2c0dd [web] Fix error: Cannot read properties of undefined (reading 'startsWith') (#26844)
https://overleaf.sentry.io/issues/6726737555/

GitOrigin-RevId: 488b64c5cb4a75ac4e77c7cdfb47cd3381a9c8eb
2025-07-07 08:05:49 +00:00
Brian Gough
0c462d45d1 Merge pull request #26815 from overleaf/bg-sp-hotfix-5-5-2
[CE/SP] Hotfix 5.5.2

GitOrigin-RevId: bcd409968ef0321dd1d8050553e7c9a02d3efdc4
2025-07-07 08:05:45 +00:00
Antoine Clausse
07b1701b72 [web] Convert EditorProviders and some test files to Typescript (#26512)
* Rename files to tsx

* Update types

* Remove props that aren't typed

* Add `LayoutContextOwnStates`

* Use `LayoutContextOwnStates`

* Ignore ts errors about `SocketIOMock`

* Address comments: remove `satisfies`, update `BroadcastChannel` fixture

* Add types to `makeEditorOpenDocProvider`. Update `openDocId`->`currentDocumentId`

* misc.

* Type sockets as `SocketIOMock & Socket`

* Fix remaining typing errors

* Fix type of `ideReactContextValue`

GitOrigin-RevId: 2734ac707517d56c452b0bf06ea3438f947a64be
2025-07-07 08:05:40 +00:00
Antoine Clausse
09a534f48b [web] Move scopes permissionsLevel, permissions and hasLintingError to React context (#26607)
* Move `hasLintingError` from scope to react state

* Move `permissionsLevel` to IdeReactContext states

* Get `permissionsLevel` from `useIdeReactContext()`

* Set `permissionsLevel` in mocked `IdeReactProvider`

* Replace `permissions` scope by React state

* Fixup `permission` changes

* Remove redundant type

GitOrigin-RevId: 6203c61f9ac429789624196bf67e508310f4577f
2025-07-07 08:05:36 +00:00
Antoine Clausse
bb5b9afd0e [web] Define loadPropensityScript before use (#26813)
This prevents the bug "ReferenceError: Cannot access uninitialized variable" for users who don't have `window.requestIdleCallback`.

Fixes https://overleaf.sentry.io/issues/6724866295

GitOrigin-RevId: 129dcb72f24dc901ad600253bab7c58673e44321
2025-07-07 08:05:32 +00:00
Antoine Clausse
3681be7a71 [web] Ignore Propensity Network errors (#26840)
* Test the scripts by adding fake ids

* Test Propensity errors

* Don't send Sentry event if `isPropensityNetworkError`

* Revert "Test Propensity errors"

This reverts commit 7052ca20d0bee3bb32b39fb90c473458a4375d7b.

* Revert "Test the scripts by adding fake ids"

This reverts commit 2ac797aadf24359917a10119155c5e41935a7482.

GitOrigin-RevId: 03c1e63e359d41ad83ce1ae5cc1063f1c59d0b4e
2025-07-07 08:05:27 +00:00
roo hutton
2b8a14c4d2 Merge pull request #26822 from overleaf/rh-current-plan-free-personal
Treat 'free - personal' plan as free in current plan widget

GitOrigin-RevId: 271aca9b1c97389357b7b7d107ed838ebbcada40
2025-07-07 08:05:23 +00:00
roo hutton
a7e3ce67ea Merge pull request #26809 from overleaf/rh-email-already-registered
Update 'email already registered' text

GitOrigin-RevId: aa8b7d0f83549f22a721f6e41a4a6cd51e287251
2025-07-07 08:05:19 +00:00
roo hutton
425344b40b Merge pull request #26806 from overleaf/rh-friendly-group-name-dash
Use friendly group plan name in project dash tooltip

GitOrigin-RevId: bb4e763c2fe0b8cb5d2f8ac0adf2a8cd956ddd0c
2025-07-07 08:05:14 +00:00
Eric Mc Sween
cbe96f21cb Merge pull request #26794 from overleaf/em-subscription-index
Add an index on recurlySubscription_id

GitOrigin-RevId: 06c20df8e94e4aebeb0f49acec5babad0f1c4031
2025-07-04 08:06:04 +00:00
Mathias Jakobsen
4e40f24a9e Merge pull request #26631 from overleaf/mj-tooltip-labs-new-survey
[web] Editor redesign: Add tooltip for filling out new survey

GitOrigin-RevId: 432201b6fbff085fcc8ccdeb70c3056043b50422
2025-07-04 08:06:00 +00:00
roo hutton
1b02a26d1f Merge pull request #26799 from overleaf/rh-resolve-deleted-email
Clear loading state after deleting email address

GitOrigin-RevId: 7422a7e223ba430459afa862f10c2b2fd9038306
2025-07-04 08:05:39 +00:00
roo hutton
8cd8d8239b Merge pull request #26779 from overleaf/rh-email-confirmation-logo
Use green OL logo in Interstitial and ODC components

GitOrigin-RevId: 8fee3f0758e22c4ebaea7d0cd01a408c16380a98
2025-07-04 08:05:35 +00:00
roo hutton
10b6f82677 Merge pull request #26764 from overleaf/rh-department-autocomplete
Use department institutions when adding email

GitOrigin-RevId: d82df795428f8545f22a64b55986d2bf5fff0037
2025-07-04 08:05:31 +00:00
Rebeka Dekany
b7032e925f Storybook for the Modal component (#26798)
GitOrigin-RevId: 679935722a8b8a96c55f60be16c0ac34f6e6fbcc
2025-07-04 08:05:26 +00:00
Mathias Jakobsen
9de32e1570 Merge pull request #26761 from overleaf/mj-mendeley-unselect-group
[web] Unify group selection for reference managers

GitOrigin-RevId: 606032624f60ed1c1aa14da237531d1277e94eab
2025-07-04 08:05:15 +00:00
Mathias Jakobsen
e660718c63 Merge pull request #26769 from overleaf/mj-review-mode-switch-focus
[web] Focus editor after changing reviewer mode

GitOrigin-RevId: d19ef178221579894620c5fd204f45c893c126ae
2025-07-04 08:05:08 +00:00
Brian Gough
d701b8ff9b Merge pull request #26783 from overleaf/bg-server-ce-ignore-mongo-check-failures
allow skipping checks requiring mongo admin privileges in check-mongodb script

GitOrigin-RevId: 0c7157a153457a97c92ea3eb5e8c2a4de7971bf6
2025-07-04 08:05:03 +00:00
Andrew Rumble
f5038b5de3 Switch eslint-plugin-n for eslint-plugin-node
GitOrigin-RevId: eec3cf3836556a5c035b1339548c724ab3cd0c43
2025-07-04 08:04:56 +00:00
Andrew Rumble
381a106b46 Remove @types/workerpool
This is a stub

GitOrigin-RevId: de776c11044c42bb191424f1d614442da22c3197
2025-07-04 08:04:51 +00:00
Andrew Rumble
90226043c7 Remove @types/react-bootstrap
GitOrigin-RevId: 0a410b82540b2b11bc4930753dbd650937ebba1e
2025-07-04 08:04:46 +00:00
Kristina
a74c0abdf5 Merge pull request #26793 from overleaf/mf-add-missing-public-key-on-purchase-addon
[web] Add missing publicKey to purchase add-on flow when user need to authenticate their payment via 3ds secure flow

GitOrigin-RevId: cc330cb8dad501479bbb3c5c5b4fc32ef9d36921
2025-07-03 08:06:25 +00:00
Kristina
4eee7cd6ef [web] rm annual-prices-monthly-rates split test (#26727)
* [web] rm annual-prices-monthly-rates split test

- rm monthly rates treatment
- rm unused translations
- rm unused supporting functions
- rm unused styles

GitOrigin-RevId: 5901853245cd9b01ee9e4774154d29ae8f5fcae5
2025-07-03 08:06:13 +00:00
Kristina
3f1a930046 [web] make SubscriptionController.cancelSubscription return a status (#26734)
* [web] make SubscriptionController.cancelSubscription return a status
* [web] update acceptance test to match cancel subscription behavior

GitOrigin-RevId: 507809dcb7fa645c2a69e38cdf4a9e3f736622e1
2025-07-03 08:06:09 +00:00
Alf Eaton
97863f62ca Upgrade TypeScript to 5.8.3 (#24900)
GitOrigin-RevId: 80937de3dde14e21e02af2ecb93350b1fedafc82
2025-07-03 08:05:57 +00:00
Alf Eaton
58303de9f4 Enable full project search in Community Edition and Server Pro (#25753)
GitOrigin-RevId: 1def9c3e190c907d41b7f822831e12c8609e9c7c
2025-07-03 08:05:52 +00:00
Alf Eaton
06153de0aa Fix Add Comment observer disconnect (#26565)
GitOrigin-RevId: bb84aa25d744a9b035a70c877c934156c2675cbd
2025-07-03 08:05:47 +00:00
Alf Eaton
d8d53f76ca Avoid highlighting the focused tracked change (#26681)
GitOrigin-RevId: fcc47f9d23ae870e781bb0f772e2604e630cf292
2025-07-03 08:05:43 +00:00
Alexandre Bourdin
d55cb6af5e Merge pull request #26699 from overleaf/ab-survey-exclude-labs-users-option
Add an option to hide a survey from Labs users

GitOrigin-RevId: d6f87bb31221d8db38f8506afa7cc3313ad235ce
2025-07-03 08:05:31 +00:00
Alexandre Bourdin
36c4c65609 Merge pull request #26683 from overleaf/ab-update-survey-form
Update survey form and preview + support custom button CTA

GitOrigin-RevId: 2b519ab1da1c8e7897b3135956f80619f4e901b4
2025-07-03 08:05:26 +00:00
Alexandre Bourdin
75d443934f Merge pull request #26674 from overleaf/ab-fix-stacking-tooltips
Lower default delayHide for tooltips to prevent stacking

GitOrigin-RevId: e13fa28f495e1b79aa552a236e1c9d161ab2ee0c
2025-07-03 08:05:22 +00:00
Domagoj Kriskovic
c538091fa8 Add script to check and fix duplicate collaborators in projects (#26572)
* [web] Add script to check and fix duplicate collaborators in projects

* use batchedUpdate

* project-id param and BATCH_RANGE_START,

GitOrigin-RevId: 451549eaff255dfae3e55515786d7a68184d557f
2025-07-03 08:05:17 +00:00
Andrew Rumble
747224ac10 Remove code that checks for index.js (now that we don't have any of these)
GitOrigin-RevId: c7ece8f01d1e8318ffe461e9ebe2cf0ed1b040ac
2025-07-03 08:05:12 +00:00
Andrew Rumble
af0c0e5bcd Convert server-ce-scripts index file to ES modules
GitOrigin-RevId: 5edfa16b4a77471f340c8bbc784a3833cfcaf490
2025-07-03 08:05:08 +00:00
Jakob Ackermann
7c92e0719c [web] small tweaks for display of deleted projects in admin panel (#26747)
* [web] display project expiry date and badge

Co-authored-by: Alex Bourdin <alex.bourdin@overleaf.com>

* [web] redirect admins to deleted project page

* Expiration badge tweaks

* [web] fix frontend tests

---------

Co-authored-by: Alex Bourdin <alex.bourdin@overleaf.com>
GitOrigin-RevId: 42dafb5e4e3e781c87fa26092ea9b3400f471bb8
2025-07-03 08:05:03 +00:00
Antoine Clausse
40136785dd [web] Move pdf.* scopes to react states (#26599)
* Move `pdf.logEntryAnnotations` to react state

* Remove unused scope `pdf.downloadUrl`

* Remove unused scope `pdf.url`

* Move `pdf.uncompiled` to react state

* Move `pdf.logEntries` to react state

* Remove `pdf` from `mockScope`

* Fix test: "renders annotations in the gutter"

GitOrigin-RevId: bf1d0ec30cc0ffcc1177871651483c296ed08baf
2025-07-03 08:04:58 +00:00
Jakob Ackermann
67342e9c33 [terraform] clsi: add pre-emp C2D capacity in zone b (#26755)
GitOrigin-RevId: aa52dec1f7135f53f8c887199c1d1e4e31ef70ff
2025-07-03 08:04:53 +00:00
Tim Down
ebb2cff2af Merge pull request #26697 from overleaf/td-custom-logo-sp
Restore custom logo feature on SP project dashboard

GitOrigin-RevId: c3ceafa8756968bfbb92f3fca22889e11a39dc40
2025-07-02 08:06:01 +00:00
Tim Down
affd1bea49 Merge pull request #26586 from overleaf/td-file-view-error-reset
Reset file view loading and error state when switching between files

GitOrigin-RevId: 44be9bf71fe9541ed78db3421bf356997850e6ec
2025-07-02 08:05:57 +00:00
Tim Down
904fac958d Merge pull request #26326 from overleaf/td-clean-up-scope-store
Create separate window.overleaf.unstable.store based on React context values

GitOrigin-RevId: 68f070a6fc5e2965a82720024d91b16fa622b28b
2025-07-02 08:05:53 +00:00
Rebeka Dekany
dc97da1276 Add accessible names to the editor editing field (#26678)
GitOrigin-RevId: 2ebed9db517c288450230675ae038d0cc3260a61
2025-07-02 08:05:25 +00:00
Rebeka Dekany
6a56c64d9a Use long month date format (#26666)
GitOrigin-RevId: 8a52bca6e13087f43d14ed1caffb7709ccee4e02
2025-07-02 08:05:17 +00:00
Rebeka Dekany
79e5a884f5 Use meta tags for user info and refactor syntax for conditional classes (#26617)
* Use meta tags for user info data

* Remove Back button

* Refactor syntax for conditional classes

* Inline meta tags

* Keep "Please go back and try again" text

* Shorthand classname

GitOrigin-RevId: 3b78bff04b4fb8dc7fdecf5b663d2a4f64c3218b
2025-07-02 08:05:07 +00:00
roo hutton
2a9d3bb168 Merge pull request #26566 from overleaf/rh-cio-event-segmentation
Include customer.io segmentation in recurly/stripe subscription events

GitOrigin-RevId: 54483e17eec5251ac7871d43a3aa1e074dcfe98d
2025-07-01 08:07:02 +00:00
Mathias Jakobsen
28c227157e Merge pull request #26616 from overleaf/mj-tooltip-labs-disabled-nudge
[web] Add nudge tooltip to try redesigned editor again

GitOrigin-RevId: 1db104adeee2225f24dd76df141daf145b6ec582
2025-07-01 08:06:37 +00:00
Andrew Rumble
fe5d6ddf5c Upgrade cross-env
The breaking changes here are just for node version for the most part.
The one other breaking change has a workaround and shouldn't affect us
anyway.

GitOrigin-RevId: beb192a38cfc04f6b321e5ab44770a9a64110c30
2025-07-01 08:05:48 +00:00
Andrew Rumble
8c8f4177d9 Remove unneeded overrides and pin remaining ones
GitOrigin-RevId: fff3a067728e313d0b3e7755c926e1eeba6562f6
2025-07-01 08:05:42 +00:00
Kristina
ffb7f23dfd Merge pull request #26661 from overleaf/kh-support-3ds-for-stripe-us
[web] support 3DS for Stripe US

GitOrigin-RevId: b798b59601f3fb0df54afbcfb19434fbb0b38cdf
2025-06-30 08:06:07 +00:00
Kristina
f7a68cb503 Merge pull request #26641 from overleaf/kh-use-stripe-us-client
[web] use Stripe US client

GitOrigin-RevId: 9b99ba8c7ac900c528526cf7e18fec48761e0091
2025-06-30 08:06:02 +00:00
Kristina
3bdc8316e9 Merge pull request #26639 from overleaf/kh-support-stripe-us
[web] support regional Stripe accounts

GitOrigin-RevId: d414d310d8db495635d8e0d3b057e3f56b2f044e
2025-06-30 08:05:57 +00:00
Antoine Clausse
00d5d879c5 [web] Add third-party tracking Propensity (#26638)
* Rename `suppressGoogleAnalytics` to `suppressAnalytics`

* Add Propensity script

* Add LinkedIn Insight Tag script

* Version the cookie to prevent adding unconsented tracking

* Move tracking loaders to Typescript, insert them in foot_scripts.pug

* Show the cookie-banner when tracking other than GA is set

* Revert `oa` cookie versioning

* Remove `async` from propensity script

* Use shared tracking loader for Hotjar, LinkedIn, and Propensity

* Reusable `insertScript`

* Remove tracking-linkedin

* Test the scripts by adding fake ids

* Revert "Test the scripts by adding fake ids"

This reverts commit 50759bb6b40fd2684d1b967d83dd71e8517c3de9.

GitOrigin-RevId: 2a7b36bfc70ac1fc983f837dd4693a19a385cbc6
2025-06-30 08:05:52 +00:00
Eric Mc Sween
735cc2272f Merge pull request #26505 from overleaf/em-persist-buffer-batch
Persist Redis buffer in batches

GitOrigin-RevId: 1de22807dae3554b3274ec103783b0868b1439d9
2025-06-30 08:05:25 +00:00
Eric Mc Sween
a38eefd2ab Merge pull request #26559 from overleaf/em-redis-buffer-delete
Delete project from redis buffer when expiring

GitOrigin-RevId: 66c48adc388a4a4e0b1b54b581dc945a38a41356
2025-06-30 08:05:20 +00:00
Domagoj Kriskovic
04e026904f Hide reviewer options for community edition (#25944)
GitOrigin-RevId: 7eba3d193e3a0ab37006cb42dd945ba40703136f
2025-06-27 08:56:35 +00:00
roo hutton
6d7b13ac18 Merge pull request #26349 from overleaf/rh-cio-dashboard-assignment
Assign customer.io split test on projects dashboard

GitOrigin-RevId: 78a21bce31262db15f9701abc0599b44b9023ad2
2025-06-27 08:56:30 +00:00
Rebeka Dekany
1950585514 Improve selectors to reduce flaky E2E tests (#26413)
* Use the leadingIcon prop instead of spacing

* Remove duplicated ID

* Make the alt text to be empty since image is decorative

* Make switcher input visually hidden

The switcher's input previously used 'pointer-events: none', which prevented proper interaction in the test. It replaces that hack.

* Add accessibilityLabel to the info icon that is actually a clickable link

* Use more specific selectors

* It should display

* Use more specific selectors

* Use more specific selectors

GitOrigin-RevId: a555d96cf972d06dd5432f44a23b02355cedcd94
2025-06-27 07:34:51 +00:00
Rebeka Dekany
99e580047c Improve green link colour contrast on the marketing pages (#26461)
* Fix visited link colour

* Udpdate green link colors for the marketing pages

* Use the semantic color variables

GitOrigin-RevId: c53240cbd6f3608031d6e98db8203fe7bb414a9b
2025-06-27 07:34:46 +00:00
M Fahru
6965618c34 Merge pull request #26605 from overleaf/mf-remove-for-teaching-and-overleaf-advisor-program
[web] Remove both "For teaching" and "Overleaf advisor programme" from our website navigation and pages

GitOrigin-RevId: 3189398e3f2fa9b19e828daeb890d89a336058b0
2025-06-27 07:34:41 +00:00
Domagoj Kriskovic
3b65a674d0 Allow switching reviewing mode for anonymous editors (#26426)
* Revert "Remove reference to track changes ofForGuests"

This reverts commit 675f3864e4bf0a07d24848223814768ab50bfd9b.

* handle track changes for guests

* only send on_for_guests

* update test

GitOrigin-RevId: 15308f0904b26d2ea6a2e57b3852cd2a9b3c886d
2025-06-26 08:05:43 +00:00
Mathias Jakobsen
13d3d0c552 Merge pull request #26269 from overleaf/ae-use-debounce-types
Remove JSDoc types from useDebounce

GitOrigin-RevId: d0504076aab4af94cd03c5f2a98853535979012a
2025-06-26 08:05:31 +00:00
Mathias Jakobsen
169e37cf31 Merge pull request #26567 from overleaf/ae-modal-onconfirm
Remove onConfirm from modal props

GitOrigin-RevId: 96c6456a0e893aeb544f346c0de3cb2c207f40d4
2025-06-26 08:05:23 +00:00
Mathias Jakobsen
77d5c8fa64 Merge pull request #26555 from overleaf/dp-error-logs-header-tweaks
Small fixes to new error log entry headers

GitOrigin-RevId: 1ed2fcc7ce1210b3bf4e330c079ba6d5166580d6
2025-06-26 08:05:18 +00:00
Mathias Jakobsen
9d267f0803 Merge pull request #26499 from overleaf/dp-pdf-couldnt-compile
Update handling of "suggest fix" in new editor

GitOrigin-RevId: 80d6fa479bc1d12d7e5b82a8c504830c9f4db182
2025-06-26 08:05:14 +00:00
Mathias Jakobsen
4fd9c6fd18 Merge pull request #26440 from overleaf/mj-ide-co-branding-submit
[web] Editor redesign: Add co-branded submit button to toolbar

GitOrigin-RevId: 45f7ba93de8b28868d88a4ad913f6543e0f7e0a6
2025-06-26 08:05:10 +00:00
Mathias Jakobsen
e562e3d1bf Merge pull request #26399 from overleaf/mj-ide-co-branding
[web] Editor redesign: Add cobranding logo to toolbar

GitOrigin-RevId: 9f9138bb4ebc2cc7d39e38f8bee77c7fbde8b781
2025-06-26 08:05:06 +00:00
Jakob Ackermann
73ae6f480f [web] change status page URL to HTTPS everywhere (#26587)
* [web] change status page URL to HTTPS everywhere

Also open all links to the status page or admin email in a new tab.

* [server-ce] explicit protocol matching

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: d7d12eef4efc737c5d70fc969c862acae9faf14c
2025-06-26 08:04:59 +00:00
Jakob Ackermann
886bad1071 [web] remove runtime migration for fixing collaborator lists on projects (#26581)
GitOrigin-RevId: f6a4c142e010e168c79b59cb96dddb147093d4a0
2025-06-26 08:04:54 +00:00
Jakob Ackermann
87de73333a Merge pull request #26575 from overleaf/jpa-archived-state
[web] remove runtime migration for project.archived/trashed state

GitOrigin-RevId: 69064878f3dfdcde3727a4e3eb555deb75c70588
2025-06-26 08:04:50 +00:00
Jakob Ackermann
19980b41b8 [web] switch migrations for fixing dates to batchedUpdate (#26582)
* [web] switch migration for fixing confirmedAt dates to batchedUpdate

* [web] switch migration for fixing assignedAt dates to batchedUpdate

* [web] make eslint happy

GitOrigin-RevId: d898d28dc2aa1084e8d3af20b98f49e3fda8a1c6
2025-06-26 08:04:46 +00:00
Jakob Ackermann
1543f0a53e Merge pull request #26580 from overleaf/jpa-fix-null-array
[web] add migration for fixing collaborator arrays on projects

GitOrigin-RevId: 73178b56501025bf23f463e8f9822fc33ecaaea0
2025-06-26 08:04:42 +00:00
Andrew Rumble
12a1a85a2f Make sure req.capabilitySet is defined
GitOrigin-RevId: 408dcb3463884d1bbdc56f409121728d1275f501
2025-06-25 08:07:12 +00:00
Andrew Rumble
4550cfc6a0 Use a context function to replicate the behaviour of done
This is slightly different than done because done would resolve but I
think it is safer for the purpose done was being used in these changes.

GitOrigin-RevId: e60a912b82a8e544444a2776ea6aab7d2ea83bdb
2025-06-25 08:07:08 +00:00
Andrew Rumble
d3d5674436 Remove resolve when passed as next
GitOrigin-RevId: 071ce6a4cab210f2db0d278aeb08d31fbba4cbfc
2025-06-25 08:07:03 +00:00
Andrew Rumble
e76a8ff267 Convert return new Promise to await new Promise
GitOrigin-RevId: 49404748cc90cb7bdef0460f7e9837196f81cae8
2025-06-25 08:06:59 +00:00
Liangjun Song
c7ae851d39 Merge pull request #26519 from overleaf/ls-group-plan-upgrade-in-stripe
Support group plan upgrade in Stripe

GitOrigin-RevId: 44ae35c6221bf96a0b91526178d6ab1aff80f2a3
2025-06-25 08:06:54 +00:00
Andrew Rumble
903277c222 Handle rangeHashes
GitOrigin-RevId: 9b9a67d8e45f17e948d003aed33cef6128a25744
2025-06-25 08:06:50 +00:00
Andrew Rumble
34b674aa6f Handle errors when converting lazyfiles to eagerfiles
GitOrigin-RevId: 6ada48e2f2b7ffee9c8560856436dc5e2076099d
2025-06-25 08:06:45 +00:00
Andrew Rumble
745043ca92 Add more detail for the modes
GitOrigin-RevId: 44b63b76b1edb8bfb78049c9c8560934e340ef96
2025-06-25 08:06:41 +00:00
Andrew Rumble
6ed488cc65 Change raw mode to just fetch all raw content from backup
GitOrigin-RevId: 397060d63c824dbe688d187312dd78d1f3e4bf5d
2025-06-25 08:06:36 +00:00
Andrew Rumble
f2b0a982ac Use BackupBlobStore to get chunk content
GitOrigin-RevId: 91de53101ea289b43bdb08352aecc09ae89d0f74
2025-06-25 08:06:32 +00:00
Andrew Rumble
797f29d40a Handle errors when processing command line arguments
GitOrigin-RevId: 7c1f011e705d6e4b6fbf0afee3dc3aab749f0de4
2025-06-25 08:06:27 +00:00
Andrew Rumble
b42b0a8d3e Make file related BlobStore type more specific
GitOrigin-RevId: d5e70b13cbdfe1faf133eb4c040b0bbf6fa47dea
2025-06-25 08:06:23 +00:00
Andrew Rumble
392037efd6 Improve types and export functions we want to use
GitOrigin-RevId: 25fd93214f88c425bee23d43de113cf754f89524
2025-06-25 08:06:18 +00:00
Andrew Rumble
3600aa4b75 Add script for restoring projects from backup
GitOrigin-RevId: b639d74989afa17638bbcba0f8ee34c978fcd5d9
2025-06-25 08:06:14 +00:00
Andrew Rumble
25a911d4cb Export loadChunk from verifier to allow code reuse
GitOrigin-RevId: fc5f2de50583ab2469e8ab3c86776c55501ba2e2
2025-06-25 08:06:09 +00:00
Andrew Rumble
4157f8ca00 Add a list directory method to the S3 persistor
GitOrigin-RevId: 6ecff3eb457dc2168ca49ff9409bb09fa932781c
2025-06-25 08:06:05 +00:00
Domagoj Kriskovic
48379a9d86 Refactor AI assist notification logic in project list page (#26613)
GitOrigin-RevId: 849ab62b814f321452e5d6e53d968943cec60417
2025-06-25 08:06:00 +00:00
roo hutton
50b5aa33b1 Merge pull request #26495 from overleaf/rh-prevent-pause-cancel-last-term
Redirect to support if trying to cancel in last month of pause

GitOrigin-RevId: d92f84c79482bb7c409f4e3070337b0ac958756a
2025-06-25 08:05:42 +00:00
Domagoj Kriskovic
fda96b2fdf Add promo notifications for AI assist (#26514)
* Add promo notifications for AI assist

* format pug

GitOrigin-RevId: 8895145e1e5dcd8e28f29bf2601a4bd21456a407
2025-06-25 08:05:37 +00:00
Lucie Germain
f53a13ae1e Merge pull request #26604 from overleaf/mf-resync-recurly-state-single-subscription
Add script to sync recurlyStatus.state for a single subscriptionId

GitOrigin-RevId: 69af89a44b4043d92853862baee65d8b7f84b88f
2025-06-25 08:05:29 +00:00
Brian Gough
f0c63b6ccd Merge pull request #26175 from overleaf/bg-fix-logging-in-project-deletion
test logging in user and project deletion

GitOrigin-RevId: ea51082aeada81f8e7ae356966cda0f57f7cd072
2025-06-25 08:05:24 +00:00
Antoine Clausse
e6d09ca748 [web] Fix Editor Stories (#26535)
* Fix storybook stories

* Add `chat` to `ol-capabilities` in Storybook

GitOrigin-RevId: 0816c82170ebc3bfe9ca2d7f02766364c693365a
2025-06-25 08:05:20 +00:00
Antoine Clausse
9e189e7d59 [web] Move UI scope to React states (#26403)
* Move `ui.view` to setState

* Move `openFile` to setState

* Move `ui.leftMenuShown` to setState

* Move `ui.miniReviewPanelVisible` to setState

* Move `ui.pdfLayout` to setState

* Move `ui.chatOpen` to setState

* Move `ui.reviewPanelOpen` to setState

* Cleanup: remove layout-context-adapter and imports

* Replace `ui` scope by mocked `LayoutProvider` in tests

* Update test

* Remove unnecessary `scopeStore.set('ui.chatOpen' ...`

GitOrigin-RevId: 81578bfdc958239eac492905f714a6074c81d0f5
2025-06-25 08:05:15 +00:00
Tim Down
ab140f578d Merge pull request #26244 from overleaf/td-limit-browser-translate-ide
Prevent browser translation of stuff that shouldn't be translated in IDE page

GitOrigin-RevId: 96a75b51c3c8efc4cbcec7eb17d9e331a03e2c96
2025-06-24 08:05:32 +00:00
Tim Down
de1ab31bfd Merge pull request #26469 from overleaf/td-bs5-sp-ce-register
Migrate SP/CE registration page to Bootstrap 5

GitOrigin-RevId: 5e99a6a091d725ea3ab54e7cf6a4d1ea4f6bfab6
2025-06-24 08:05:28 +00:00
Antoine Clausse
2d5a3efc12 [web] Add compilation indicator favicon (#25990)
* Import changes from Hackathon

https://github.com/overleaf/internal/pull/24501

* Update compile status: allow errors

* Update favicons. Use the ones from Figma

* Optimize and reuse path from favicon.svg

* Clear status favicon after 5s on active tab

* Rename hook from useCompileNotification to useStatusFavicon

* Add tests

* Revert changes to favicon.svg

* Query favicon on document.head

GitOrigin-RevId: 3972b1981abaf6c80273e0ed5b1bc05eb51bd689
2025-06-24 08:05:15 +00:00
Antoine Clausse
46555d27b0 [web] Add window. prefix to globals and add no-restricted-globals rule (#26422)
* Add `no-restricted-globals` eslint rule

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>

* Change `self` to `window.self`

* Change `innerWidth` to `window.innerWidth`

* Change `confirm` to `window.confirm`

* Change `location` to `window.location`

* Use `location` from `useLocation` hook

* Use location from useLocation hook
Co-authored-by: Antoine <antoine.clausse@overleaf.com>

* Disable no-restricted-globals eslint rule for use of 'self'

* Use `confusing-browser-globals` from npm

* Prevent unexpected globals in workers, using `no-undef`

* Use `self` as a global in workers

* Use unexpected globals in workers, using `no-restricted-globals` in workers

---------

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>
Co-authored-by: Rebeka <o.dekany@gmail.com>
GitOrigin-RevId: 526986799f5f2edf53c7d978fa85c1e98189565f
2025-06-24 08:05:10 +00:00
Rebeka Dekany
c40ab3234d Prettier for PUG templates (#26170)
* Setup prettier

* Ignore these pug templates by prettier

* Fix typo

* Fix prettier error

* Add prettier-ignore for quoting of event-segmentation attribute

* Manual tab indentation

* Interpolate

* Remove unbuffered if conditional

* Inline event-segmentation objects and remove prettier-ignore rule

* Fix spacing before interpolation

* Source format

* Source format

GitOrigin-RevId: c30e037f5caf8f91efc1bd9e75f81ae533b5a506
2025-06-24 08:05:06 +00:00
Tim Down
19dc71f414 Merge pull request #26456 from overleaf/td-limit-browser-translate-non-react-icons
Prevent browser translation of icons in Pug pages

GitOrigin-RevId: 97e4d3ba70a4c95bed2c9f52e66038911625613d
2025-06-23 08:05:06 +00:00
Miguel Serrano
069e42e763 Merge pull request #26556 from overleaf/add-chat-capability-sp
[web] Populate `chat` capability for CE/SP

GitOrigin-RevId: d9a3a9f6540552ad47b0c937115d0cf6318c49e9
2025-06-20 08:06:00 +00:00
Miguel Serrano
04fa5366ce Merge pull request #26070 from overleaf/msm-disable-dropbox
[web] Disable Dropbox Capability

GitOrigin-RevId: 5f91d2918bf3b88e52f4d27c828a4715f9b88629
2025-06-20 08:05:20 +00:00
David
edf4fdda50 Merge pull request #26491 from overleaf/dp-move-synctex
Move synctex controls lower to account for breadcrumbs in new editor

GitOrigin-RevId: 78ae0f6f1eb1384b8b3014ba4d1a0565ed3fd452
2025-06-20 08:05:16 +00:00
David
6e30a1a32d Merge pull request #26527 from overleaf/dp-errors-notification
Add promo for new error logs

GitOrigin-RevId: 68ce79653484dc018be302d753c572c39864c723
2025-06-20 08:05:11 +00:00
Eric Mc Sween
1042092144 Merge pull request #26547 from overleaf/em-revert-expiry-post
Revert "use POST requests for expiring redis buffer from cron"

GitOrigin-RevId: 95e9fd1be7b73699d6fac24035437d467c273d0a
2025-06-19 08:06:58 +00:00
Eric Mc Sween
150dfd6cba Merge pull request #26539 from overleaf/jpa-post
[history-v1] use POST requests for expiring redis buffer from cron

GitOrigin-RevId: 51c9a25b998e581ed20c0e113bd4989537a1e6ef
2025-06-19 08:06:50 +00:00
Eric Mc Sween
fd9fd9f0e7 Merge pull request #26545 from overleaf/jpa-fix-resync
[history-v1] use mongo projectId for initiating resync

GitOrigin-RevId: f93f2358695782fb222d23ba3720d98724b9a291
2025-06-19 08:06:45 +00:00
Jessica Lawshe
c9174cdecc Merge pull request #25965 from overleaf/jel-admin-ui-use-ukamf-settings
[web] Overleaf admin UI to toggle group SSO using UKAMF settings

GitOrigin-RevId: c4f976d8125c9a8e549c049841f5d7b58edf8192
2025-06-19 08:06:30 +00:00
Jessica Lawshe
a20a0923b7 Merge pull request #26207 from overleaf/jel-group-sso-ukamf-endpoints-tests
[web] Acceptance tests for option to use UKAMF path for group SSO

GitOrigin-RevId: 16d6669083c0e651adea755f1b24926838b0737a
2025-06-19 08:06:25 +00:00
Jessica Lawshe
91a308a62f Merge pull request #25868 from overleaf/jel-group-sso-ukamf-endpoints
[web] Option to use UKAMF path for group SSO

GitOrigin-RevId: 117fca5913682a02e9f8e8442eed13568f6551a1
2025-06-19 08:06:21 +00:00
Eric Mc Sween
7bdc4291fc Merge pull request #26533 from overleaf/jpa-queue
[history-v1] use POST requests for flushing history queues

GitOrigin-RevId: ae87a046a7844b25cc123d08ac6c8d1624608394
2025-06-19 08:06:16 +00:00
Rebeka Dekany
af99f736bd Create bug_report.md (#26525)
GitOrigin-RevId: 3795d1505d58bdbebc3d196e3a7709ba8ac05fd1
2025-06-19 08:06:08 +00:00
Domagoj Kriskovic
3a1ef872cd Check for existing reviewers when adding user to a project (#26463)
GitOrigin-RevId: 935335345461133fb8b08fa95f960f801b8775a7
2025-06-19 08:05:27 +00:00
Jakob Ackermann
4310d3ec88 [docstore] add runtime fix for mismatching comment vs thread ids (#26488)
GitOrigin-RevId: e7cefa88d125a73a26863e6fae8b49530efa2b4e
2025-06-19 08:05:22 +00:00
Jakob Ackermann
adf399fb95 [project-history] add support for resync of history-ot ranges (#26475)
* [project-history] add support for resync of history-ot ranges

* [project-history] avoid compressing sharejs and history-ot upgrades

* [document-updater] improve error message of some assertions

... by migrating the assertions like this:
```diff
-stub.calledWith().should.equal(true)
+stub.should.have.been.calledWith()
```
```diff
-stub.called.should.equal(false)
+stub.should.not.have.been.called
```

* [document-updater] move content field in resyncDocContent

* [document-updater] add support for resync of history-ot ranges

GitOrigin-RevId: e6104686a26934a5f25a8f095cbe00c163fbbaa7
2025-06-19 08:05:18 +00:00
Jakob Ackermann
5b39c76aa8 Merge pull request #26506 from overleaf/em-lazy-string-file-data-store
Fix lazy file data truncation on store()

GitOrigin-RevId: 2316a096e6a365178afbded58351359893a36312
2025-06-19 08:05:13 +00:00
Rebeka Dekany
8423829714 Migrate subscription related pages to Bootstrap 5 (#26372)
* Enable Bootstrap 5 for the subscription error pages

* Override contact modal on the plans page

* Convert AI Assist related styles to CSS

* Extend single layout-website-redesign.pug template for both Bootstrap 3 and 5

* Formatting to tab indentation

* Add the switcher for AI Assist

* Fix translations in heading

GitOrigin-RevId: 54ddc35602831f1ec1fa83c9f67a091eefda7a77
2025-06-19 08:05:05 +00:00
Kristina
cc7c01132b Merge pull request #26193 from overleaf/ls-consider-group-plan-when-get-next-subscription-items
Consider group plan when getting next subscription items

GitOrigin-RevId: cbf05c1a7de9e957739273b865c335807a58d739
2025-06-19 08:04:59 +00:00
Rebeka Dekany
bf8abb3181
Update ISSUE_TEMPLATE.md 2025-06-18 14:20:53 +02:00
Antoine Clausse
494f0a4b1a [web] Rename docRoot_id to docRootId in the frontend code (#26337)
* Rename `rootDoc_id` to `rootDocId` in the frontend

* Update types

* Fix frontend test

GitOrigin-RevId: b755a4ebf7b8c0b8ed800d713bbae8cfcfdd5046
2025-06-18 08:07:05 +00:00
Kristina
0dab9369ee Merge pull request #26434 from overleaf/kh-limit-trial-extentions
[web] limit trial extensions

GitOrigin-RevId: 57973190cdb57a04ce6a2585394bcb38321838f7
2025-06-18 08:07:00 +00:00
Kristina
b15758da97 Merge pull request #26494 from overleaf/kh-fix-trial-transitions
[web] fix upgrades/downgrades while on trial

GitOrigin-RevId: 4076befc5dbbee32b0cf2a4ff99db96a0cf3ad8b
2025-06-18 08:06:55 +00:00
Antoine Clausse
3ba002460e [web] Remove instances of $scope and _ide (#26297)
* Remove `$scope` from `getMockIde`

* Replace `...getMockIde()` by `_id: projectId`

* Simplify stories decorator scope.tsx: less reliance on `window`

* Update helper editor-providers.jsx: pass data instead directly instead of using `window`

* Remove `cleanUpContext`

* Remove unused prop `clsiServerId`

* Update types to reflect unused properties

* Remove comment

* Add `ol-chatEnabled` in Storybook

* Revert moving `getMeta` outside of the component

This causes issues in Storybook

GitOrigin-RevId: dc2558ce814c2d738fb39450c57c104f4419efb8
2025-06-18 08:06:42 +00:00
David
a559cbb590 Merge pull request #26493 from overleaf/dp-raw-logs
Improvements to raw logs log entry ui in new editor

GitOrigin-RevId: 516094fadfa4db7e82431c91b766dbe7e378b4a7
2025-06-18 08:06:33 +00:00
Jessica Lawshe
4648661ce6 Merge pull request #26449 from overleaf/jel-password-reset-err-msg
[web] Fix message check when managed user linked to SSO tries to reset password

GitOrigin-RevId: f271cd38484c48418f60c28eab2c4863d2984313
2025-06-18 08:06:21 +00:00
Eric Mc Sween
f68bf5a69f Merge pull request #26477 from overleaf/em-redis-buffer-resync
Handle invalid content hash when persisting changes

GitOrigin-RevId: 5259190396c8c261cad1abcd5de66314c1e871fb
2025-06-18 08:06:17 +00:00
David
90309f59ae Merge pull request #26471 from overleaf/dp-update-editor-switcher-modal
Add line about new error logs to editor switcher modal

GitOrigin-RevId: 13ca361060ab1e9144c3a3d4ebc1fc487e6a8895
2025-06-18 08:06:08 +00:00
David
89937d9635 Merge pull request #26487 from overleaf/dp-error-log-clickbox
Expand clickable area of log header in new editor

GitOrigin-RevId: dbb24ea84d04b41ce779f0490b34d51f44164f9e
2025-06-18 08:06:03 +00:00
David
3eeee3b983 Merge pull request #26470 from overleaf/dp-labs-survey
Launch new editor redesign labs survey

GitOrigin-RevId: a39b319aecde7fa9a00fb0f7f77814f6a277ab6c
2025-06-18 08:05:58 +00:00
David
4e03e0fbe1 Merge pull request #26468 from overleaf/dp-error-colors
Small style updates to new error logs

GitOrigin-RevId: fdfe7489bc87733b065d08c77353dce9ab940fc2
2025-06-18 08:05:53 +00:00
David
dc252fe772 Merge pull request #26472 from overleaf/dp-full-project-search-shortcut
Add mod-shift-f shortcut to open full-project-search to new editor

GitOrigin-RevId: a843c408cc8bd30228cbb7bc17309f4f9ff355b3
2025-06-18 08:05:48 +00:00
Jakob Ackermann
30143ead97 [web] migration fixes (#26443)
* [web] fix typo in ESM migration of a db migration

* [web] migrate old migration to ESM

* [web] use batchedUpdate for bulk updates in old migrations

GitOrigin-RevId: a984f785c577c2ac4125c947b8a3efffa57e1eb7
2025-06-18 08:05:44 +00:00
Jakob Ackermann
982f647845 [web] copy duplicated comment id into id field (#26481)
GitOrigin-RevId: accd6d9dc0165ff2cc9f8edd28c42d38b76ba909
2025-06-18 08:05:39 +00:00
David
39b4aed85f Merge pull request #26479 from overleaf/dp-synctex
Add synctex buttons to new editor

GitOrigin-RevId: 7790c848f96d9b12d95f2f01c5048da2ea17d8b4
2025-06-18 08:05:33 +00:00
Eric Mc Sween
6f461564d5 Merge pull request #26367 from overleaf/em-history-ot-undo
Fixes to TextOperation invert algorithm

GitOrigin-RevId: dd655660f6ecad7b6e9b2d4435dc9a5364d0fde2
2025-06-17 08:06:11 +00:00
Jakob Ackermann
0c2f79b0b8 [misc] make log level configurable when running tests in ESM services (#26465)
GitOrigin-RevId: 153fa99731b2fbff6dfd5edc80ce3e8acf9fc5ce
2025-06-17 08:06:04 +00:00
Eric Mc Sween
0f330ef6a3 Merge pull request #26393 from overleaf/bg-history-redis-gradual-rollout
add gradual rollout mechanism for history-v1 rollout

GitOrigin-RevId: 5fa69f5c3874bd5df1f31fdd3115e4ba6a0dab51
2025-06-17 08:06:00 +00:00
Eric Mc Sween
9cb4ef4d7d Merge pull request #26353 from overleaf/bg-history-redis-extend-persist-worker
extend persist worker to make parallel requests

GitOrigin-RevId: 8def7d5a8b5c9fcbe5fe45ac8f3ace503d31877a
2025-06-17 08:05:55 +00:00
Kristina
6b38336c7b Merge pull request #26397 from overleaf/kh-use-new-price-lookups
[web] use new price lookup keys

GitOrigin-RevId: f4c077d946100862aaea0288d5035a34d6188e83
2025-06-17 08:05:51 +00:00
Rebeka Dekany
9aa261eaf6 Hide tooltips on the Esc key (#26305)
* Hide the tooltip when Esc key is pressed

* Simplify ActionsDropdown

* Rename to tooltipDescription

* Use OLTooltip instead of Tooltip

GitOrigin-RevId: ee27cde2735ae3a0de5e37bfb8ab1dd99069742c
2025-06-17 08:05:47 +00:00
David
aa4d8f4925 Merge pull request #26389 from overleaf/dp-last-suggested-fix
Update ui for previous suggested ai fix in new editor

GitOrigin-RevId: 2f4edbcb0614d560bad28f862408ed73d39e988c
2025-06-17 08:05:39 +00:00
David
b6fe6ae062 Merge pull request #26407 from overleaf/dp-review-panel-gap
Allow comments to be positioned at top of review panel in new editor

GitOrigin-RevId: 581bbf85cc54b68b54235123b14b1564ed019e6d
2025-06-17 08:05:35 +00:00
David
b14a131b43 Merge pull request #26398 from overleaf/dp-premium-button
Add upgrade button to new editor toolbar

GitOrigin-RevId: 6c4832ccb6c32e72a842671c35d2315e3b792c15
2025-06-17 08:05:31 +00:00
David
7ca01dc925 Merge pull request #26303 from overleaf/dp-ai-troubleshooting-tip
Update UI of "Start at first error" tip to match designs

GitOrigin-RevId: fd745d1cce7b21847041614af7313768c26b5d08
2025-06-17 08:05:27 +00:00
David
e1a3037ffa Merge pull request #26162 from overleaf/dp-error-logs-ai-2
Update error logs AI UI

GitOrigin-RevId: 6f9783090797e6d7d2fe01178f6945aa364ff4ac
2025-06-17 08:05:22 +00:00
Tim Down
6bde3acc62 Merge pull request #25973 from overleaf/td-restricted-home-link
Use a single link for home link in restricted page

GitOrigin-RevId: 0220116c89845ad7704fb446e41abf99cfff3b45
2025-06-17 08:05:18 +00:00
Tim Down
d9914bf80a Merge pull request #25877 from overleaf/td-limit-browser-translate
Prevent browser translation of stuff that shouldn't be translated in project dashboard

GitOrigin-RevId: aba5d28d368277730d3bdc9aced6b9257cbd7950
2025-06-17 08:05:14 +00:00
Jakob Ackermann
7e9a33841d [project-history] migrate retry_failures script to ESM (#26444)
GitOrigin-RevId: 425e0e6c0a61ef7f8c8c3e07f2d16089f594eb32
2025-06-16 08:07:08 +00:00
Alf Eaton
afe146a620 Sort Storybook stories alphabetically (#26225)
GitOrigin-RevId: d7cf167a67ea24d7095fb27e6090ef735e966536
2025-06-16 08:07:04 +00:00
Jakob Ackermann
c7dd7208fb [document-updater] add flag for checking sync state of a single project (#26433)
GitOrigin-RevId: 504f607c652e59fa1305067f273db849d7923da2
2025-06-16 08:06:59 +00:00
Jakob Ackermann
8b937c91f4 [project-history] fix unit tests after merging multiple PRs (#26442)
GitOrigin-RevId: 9ccbadaa807da2f20010930477724e9370bf103e
2025-06-16 08:06:54 +00:00
Jakob Ackermann
22016ffef9 [clsi] adopt Server Pro env vars for sandboxed compiles (#26430)
GitOrigin-RevId: b7c0d9f4ff37d6cef77694a6a9ea4d50dcb148b2
2025-06-16 08:06:50 +00:00
Andrew Rumble
569e72a1c0 Downgrade outdated-ack message to debugConsole.warn
GitOrigin-RevId: 3537d4e3ee311cafc2956b2a9d3267e8184af48e
2025-06-16 08:06:45 +00:00
Jakob Ackermann
740b1d3f50 [project-history] add script for retrying failures (#26427)
GitOrigin-RevId: 265cec9719825613de01d7f476b20203bbff8d7f
2025-06-16 08:06:41 +00:00
Jakob Ackermann
0aa56fbe2c [project-history] fix callback signature when processing no updates (#26420)
* [project-history] fix tests and cover callback for processing updates

The before setup was hiding that some tests were not doing what the
assertions were expecting.

* [project-history] fix callback signature when processing no updates

GitOrigin-RevId: 4fa14d47b9a1afd998316b0c9024d49760785a47
2025-06-16 08:06:36 +00:00
Jakob Ackermann
6f516b25af [project-history] add metrics for compression of updates (#26307)
* [project-history] add metrics for compression of updates

* [project-history] sample compression metrics

GitOrigin-RevId: 1cd67dc4ec7b44285afb436c62392b464f007f97
2025-06-16 08:06:28 +00:00
Jimmy Domagala-Tang
a1591e8b0c feat: log error for support to investigate, and return 200 to recurly to prevent retries (#26317)
GitOrigin-RevId: 6f71fd4451e950a7bdbe1140a86a78bf8a04b039
2025-06-16 08:06:23 +00:00
Domagoj Kriskovic
b0c5d6fc5a Update font size and spacing in AI assist part of plans page (#26437)
GitOrigin-RevId: 2b0e3b68f73e72ef1024db9c1088d20b973f6245
2025-06-16 08:06:18 +00:00
Rebeka Dekany
0ac2ddd686 Migrate onboarding/bonus/beta program templates to Bootstrap 5 (#26344)
* Migrate the Try Premium for free page to Bootstrap 5

* Migrate the Overleaf Beta Program page to Bootstrap 5

* Fix buttons alignment on smaller screen size

* Migrate the Overleaf Bonus Program page to Bootstrap 5

GitOrigin-RevId: 811db783af6a86ab472aae95e075bfa301786a31
2025-06-16 08:06:14 +00:00
Kristina
53fc78d83e Merge pull request #25771 from overleaf/kh-pass-locale-to-checkout
[web] pass locale and currency to Stripe checkout

GitOrigin-RevId: 410cde4849226a70c5a6b295554d96984f48f9fb
2025-06-16 08:05:51 +00:00
roo hutton
980a8458d4 Merge pull request #26140 from overleaf/rh-cio-sub-status
Use analyticsId as primary identifier in customer.io and support best-subscription property

GitOrigin-RevId: d412f2edbff2e430d7fe3192b8843ad9ac2c226a
2025-06-16 08:05:39 +00:00
Jakob Ackermann
f025f1d0cb [web] let docstore determine a projects comment thread ids (#26364)
* [docstore] add endpoint for getting a projects comment thread ids

* [web] let docstore determine a projects comment thread ids

Also fetch the comment thread ids once when reverting project.

GitOrigin-RevId: c3ebab976821509c9627962e58918f9c6ebb0e1d
2025-06-13 08:08:00 +00:00
MoxAmber
e95b159edd Merge pull request #26395 from overleaf/as-compile-timeout-event-fix
[web] Rename time segmentation value to compileTime to prevent MixPanel errors

GitOrigin-RevId: 70ddfd5091e3f8d98849f09dc9d09adc8c0bf2c7
2025-06-13 08:07:48 +00:00
Davinder Singh
227f035c2e Merge pull request #26358 from overleaf/ds-bs5-customer-story-cern
[B2C] MIgrating CERN customer story page to Bootstrap 5

GitOrigin-RevId: dcffa5117c66438caeef3793e7f6a87055371f91
2025-06-13 08:07:40 +00:00
Davinder Singh
08ea0f270b Merge pull request #26268 from overleaf/ds-cms-bs5-customer-story-layout-2
[B2C] Bootstrap 5 migration of Customer story layout

GitOrigin-RevId: 6156d69f24be4818e68d044e44539ec3fc8b2595
2025-06-13 08:07:35 +00:00
Domagoj Kriskovic
fd1926a1c8 Preserve resolve state in history on file restore (#26302)
* Preserve resolve state in history when doing a restore

* added comment why is resovled property deleted

GitOrigin-RevId: fb1011cf98a658b302c6eef1da83fb1006bb2052
2025-06-13 08:07:26 +00:00
Tim Down
9c287ba36c Merge pull request #26390 from overleaf/td-logged-out-invite-layout
Use correct layout for logged-out user invite page

GitOrigin-RevId: f8b95e90068b3b18d937f56a4e5edba59e39d111
2025-06-13 08:07:21 +00:00
Tim Down
ef7cc20694 Merge pull request #26274 from overleaf/td-account-enrollment-error-fix
Prevent front-end errors in account enrollment page

GitOrigin-RevId: d05e295f70a8e9cb6d5e0da6800d7eaf4468cb39
2025-06-13 08:07:16 +00:00
Tim Down
cc21f42a14 Merge pull request #26023 from overleaf/td-remove-components-from-includes
Remove imports of react-bootstrap components from marketing pages

GitOrigin-RevId: 12a3446cc42f1438a52f49a893e53a02a1b5be4f
2025-06-13 08:07:12 +00:00
Antoine Clausse
5c7bef31ca [web] Fix donut chart in non-commons uni portal pages (#26379)
* Revert me: show fake data for donut chart

* Re-add `nvd3` styles in BS3

* Revert "Revert me: show fake data for donut chart"

This reverts commit b93e2aa5b0838571a5c4d96e85483b3d029038c7.

* Prettierignore nvd3.less

GitOrigin-RevId: 90702447244e7a2ddac495e9203c16c6bfc17bb0
2025-06-13 08:07:07 +00:00
Domagoj Kriskovic
fc050983c9 AI assist section for plans page (#26187)
* AI assist plans section

* fix merge issues, add tests

* translate img alt

* startInterval only if there are images found

* update casing for TeXGPT

* update mobile price font

* small design tweaks

GitOrigin-RevId: 87d993bb5da1929f99ab3b4721316961d78a46f5
2025-06-13 08:07:02 +00:00
Domagoj Kriskovic
92626393ec Check if AI assist standalone plan is used in shouldPlanChangeAtTermEnd (#26272)
GitOrigin-RevId: d6737ea28071d565109dba695876b6fbf3f5daa2
2025-06-13 08:06:57 +00:00
Domagoj Kriskovic
ce00213c4a Add permissions checks for AI assist addon purchase (#26355)
* Add permissions checks for AI assist when trying to buy the addon

* more explicit check for DuplicateAddOnError

* remove useCapabilities()

GitOrigin-RevId: 1979e27410981e2ef020cecc731e228483d3315a
2025-06-13 08:06:52 +00:00
Brian Gough
92731848ac Merge pull request #26352 from overleaf/bg-history-redis-add-flush-endpoint
add flush endpoint to history-v1

GitOrigin-RevId: b2ca60f7d040459f9c542e4e87147b9eecc9f596
2025-06-13 08:06:37 +00:00
Brian Gough
2f44a4eb5a Merge pull request #26351 from overleaf/bg-history-redis-convert-persist-worker-to-esm
history redis convert persist worker to esm

GitOrigin-RevId: edcbac6e3f1d3dde3fa8239378995f3ff3afcfdd
2025-06-13 08:06:32 +00:00
Brian Gough
d189c91c59 Merge pull request #26378 from overleaf/bg-history-redis-fix-misc
add type check to scan.js

GitOrigin-RevId: a306ec841b8801a2a5eab8c35f246180206f7231
2025-06-13 08:06:27 +00:00
Brian Gough
eed6a982f7 Merge pull request #26377 from overleaf/bg-history-redis-remove-unwanted-parameters
remove unwanted parameters in queueChangesFake and queueChangesFakeOnlyIfExists functions

GitOrigin-RevId: 5946cd1f81db7076eb545b5a0aca28b81fa19be4
2025-06-13 08:06:22 +00:00
Jakob Ackermann
ab0199f238 [misc] migrate remaining references to our GCR repositories to AR (#26370)
* [misc] migrate remaining references to our GCR repositories to AR

* [server-ce] fix retagging of texlive images

GitOrigin-RevId: 81f955ad4c4486ad42b29cbd6bcc9d5ef4b1a432
2025-06-13 08:06:18 +00:00
MoxAmber
0a79ac75ff Merge pull request #26312 from overleaf/as-10s-compile-timeout
[web] 10s Compile Timeout: Warning Phase

GitOrigin-RevId: 749baad646fa7ef0d3a8e14fbbb5edec7b227ed3
2025-06-13 08:06:13 +00:00
ilkin-overleaf
d49a9e9e80 Merge pull request #25843 from overleaf/ii-managed-users-make-unmanaged-terminate-subscription
[web] Terminate subscription when joining a managed group

GitOrigin-RevId: 2a4f2fd57e1319970780043a633fb8027593e5d4
2025-06-13 08:06:08 +00:00
ilkin-overleaf
0fc229dfc0 Merge pull request #25729 from overleaf/ii-managed-users-make-unmanaged-explanations-copy
[web] Managed users copy changes

GitOrigin-RevId: 2cbcdc80eafb2257302d11c179f7efd8742a3945
2025-06-13 08:06:03 +00:00
Kristina
02e7ac52e2 Merge pull request #26208 from overleaf/kh-extend-trial
[web] support extending trials for Stripe

GitOrigin-RevId: ae7d863f61ce5ec463509c590199c6e583300e8f
2025-06-13 08:05:55 +00:00
ilkin-overleaf
cfc6ff0759 Merge pull request #25983 from overleaf/ii-managed-users-make-unmanaged-roles-access
[web] Prevent managers from removing/deleting themselves

GitOrigin-RevId: 9287dc06bab8024bf03fecff678a4118a9456919
2025-06-13 08:05:46 +00:00
ilkin-overleaf
277e59fbd5 Merge pull request #25713 from overleaf/ii-managed-users-make-unmanaged-events
[web] Tracking events for offboarding managed users

GitOrigin-RevId: 12d0f178bab9f2f0923135ce3661738acdc85b82
2025-06-13 08:05:42 +00:00
ilkin-overleaf
272303cb58 Merge pull request #24907 from overleaf/ii-managed-users-make-unmanaged
[web] Release users from managed group

GitOrigin-RevId: 15921286af332d2294fb900ab3055991ca8b1673
2025-06-13 08:05:37 +00:00
Mathias Jakobsen
819cd85a0e Merge pull request #26310 from overleaf/mj-history-view-cut-off
[web] Editor redesign: Avoid cutting off history view

GitOrigin-RevId: ecffc404ef6c210c852edd13c99b742545b73b32
2025-06-13 08:05:25 +00:00
Rebeka Dekany
d2e784e11c Remove .text-centered and use .text-center instead (#26217)
GitOrigin-RevId: 75774d877e3d513574818afc517be815cb7201ae
2025-06-13 08:05:19 +00:00
Jakob Ackermann
8b91b3b749 [misc] wait for mongo before running acceptance tests (#26374)
GitOrigin-RevId: 1fde30c2b630a51f5eda9d318ac721a81cc23607
2025-06-13 08:05:08 +00:00
Jakob Ackermann
365af778b6 [web] fetch user details for chat messages/ranges in a single batch (#26342)
GitOrigin-RevId: 5a4238e30388bb7f58b7a93dda9e43338ab94f6e
2025-06-12 08:06:16 +00:00
Jakob Ackermann
3862826589 [web] let docstore determine user ids of tracked changes (#26333)
* [docstore] add endpoint for getting user ids of tracked changes

* [web] let docstore determine user ids of tracked changes

GitOrigin-RevId: 8d0a131555aa827f7ff80690fedc1aca26cf0817
2025-06-12 08:06:11 +00:00
Brian Gough
2e4b57bf81 Merge pull request #26357 from overleaf/bg-history-redis-fix-history-buffer-level
remove incorrect parameter from queueChanges call in queueChangesFake function

GitOrigin-RevId: 4567be5eb5634c0c419f7f8758f1a6f27586a9af
2025-06-12 08:05:58 +00:00
Jimmy Domagala-Tang
55295ece9c feat: allow for users on both free plans and premium plans to use the freemium ai assist (#26350)
GitOrigin-RevId: cef1051800abac3d4f7039ade2d79c75d5c15c8f
2025-06-12 08:05:49 +00:00
Brian Gough
8a90173aa7 Merge pull request #26271 from overleaf/bg-history-redis-deployment-refactor
introduce history-v1 buffering levels

GitOrigin-RevId: 7709935a5ceb19ef6c5723ded647217b7399759a
2025-06-12 08:05:39 +00:00
David
72ff927a52 Merge pull request #26311 from overleaf/dp-auto-compile-failure
Add a code check banner to the new editor

GitOrigin-RevId: 6ee01d8379247824f4ec0684809ad432c4617c96
2025-06-12 08:05:35 +00:00
Miguel Serrano
9601eeb7c9 [CE/SP] Hotfix 5.5.1 (#26091)
* [CE/SP] Hotfix 5.5.1

* [web] Fix License tab in CE/SP

* Added patch to improve logging

* Added patch to fix create-user.mjs

* Added check for `featureCompatibilityVersion` on CE/SP startup

* Patch with `multer` and `tar-fs` updates

* Install manually missing @paralleldrive/cuid2 on CE 5.1.1

GitOrigin-RevId: 0138dffdcb171382014a383bee13676fc873b1dd
2025-06-12 08:05:30 +00:00
Eric Mc Sween
91c1c6858a Merge pull request #26281 from overleaf/em-history-ot-undo
Fix undo in history OT

GitOrigin-RevId: 22e8da99abb3de70095539fd8acb5c7eb947fbd1
2025-06-12 08:05:25 +00:00
Eric Mc Sween
101c994fec Merge pull request #26279 from overleaf/em-compose-tracking-props
Merge tracked inserts and deletes during composition

GitOrigin-RevId: f8cfcf79aef7cb3e7acaecf7c3baa69d71a4efa9
2025-06-12 08:05:21 +00:00
Antoine Clausse
ab19b01d43 [web] Migrate metrics module Pug files to Bootstrap 5 (2) (#26199)
* Reapply "[web] Migrate metrics module Pug files to Bootstrap 5 (#25745)"

This reverts commit 0962383998f29313cc1fa33b98255a38896738a0.

* Remove foot-scripts from metricsApp.pug

* Fix loading-overlay position

* Hide carets on print display

* Fix Dropdown

* Fix Tooltips

GitOrigin-RevId: 754d9a004f7b476578ee20565203aef98b08bbf4
2025-06-12 08:05:16 +00:00
Antoine Clausse
b3dc0097fd Merge pull request #26188 from overleaf/ac-bs5-fix-redundant-carets
[web] Fix redundant carets in BS5 marketing pages

GitOrigin-RevId: 479687d982db23e4f5f2efcc3f5f39bb78f0eb24
2025-06-12 08:05:11 +00:00
Antoine Clausse
6a951e2ff0 [web] Migrate general Pug pages to BS5 (2) (#26121)
* Reapply "[web] Migrate general Pug pages to BS5 (#25937)"

This reverts commit c0afd7db2dde6a051043ab3e85a969c1eeb7d6a3.

* Fixup layouts in `404` and `closed` pages

Oversight from https://github.com/overleaf/internal/pull/25937

* Use `.container-custom-sm` and `.container-custom-md` instead of inconsistent page widths

* Copy error-pages.less

* Convert error-pages.lss to SCSS

* Revert changes to pug files

* Nest CSS in `.error-container` so nothing leaks to other pages

* Remove `font-family-serif`

* Use CSS variables

* Remove `padding: 0` from `.full-height`: it breaks the layout in BS5

* Fix error-actions buttons

* Revert changes to .container-custom...

* Update services/web/app/views/external/planned_maintenance.pug

Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com>

* Update services/web/app/views/general/closed.pug

Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com>

---------

Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com>
GitOrigin-RevId: 313f04782a72fae7cc66d36f9d6467bad135fd60
2025-06-12 08:05:06 +00:00
Brian Gough
b290e93441 Merge pull request #26270 from overleaf/bg-history-redis-commit-change-manager
replace redis logic in persistChanges with new commitChanges method

GitOrigin-RevId: e06f9477b9d5548fa92ef87fb6e1f4f672001a35
2025-06-11 08:07:45 +00:00
Andrew Rumble
5799d534a9 Ensure we wait after processing each subscription
GitOrigin-RevId: f6a184bc8a65934f24857cfc4f71f95574576b9d
2025-06-11 08:07:41 +00:00
Andrew Rumble
07b47606c1 Disable script in production
GitOrigin-RevId: 81fe077a5816a23fa20c78a6271fbdf62021e3b2
2025-06-11 08:07:36 +00:00
Brian Gough
b946c2abff Merge pull request #26304 from overleaf/bg-history-redis-clear-persist-time-on-persist
add persist time handling to setPersistedVersion method

GitOrigin-RevId: 5e115b49116ee4604e3e478c206c7e9cf147cbc8
2025-06-11 08:07:32 +00:00
Jakob Ackermann
25c3699862 [docstore] finish async/await migration (#26295)
* [docstore] DocManager.getDocLines returns flat content

* [docstore] peekDoc throws NotFoundError, skip check in HttpController

* [docstore] getFullDoc throws NotFoundError, skip check in HttpController

* [docstore] migrate HealthChecker to async/await

* [docstore] migrate HttpController to async/await

* [docstore] remove .promises/callbackify wrapper from all the modules

GitOrigin-RevId: a9938b03cdd2b5e80c2c999039e8f63b20d59dc5
2025-06-11 08:07:20 +00:00
Mathias Jakobsen
0397b02214 Merge pull request #26221 from overleaf/mj-history-dark-mode-entries
[web] Editor redesign: Add dark mode to history entries

GitOrigin-RevId: 16c9743bdee85dc3825ce6e9901a0107956205ca
2025-06-11 08:07:12 +00:00
Mathias Jakobsen
7c23655c79 Merge pull request #26177 from overleaf/mj-ide-history-file-tree
[web] Editor redesign: Update history view file tree

GitOrigin-RevId: bb0fe871837ffac6e1af6c18c7c1ae651dee7f81
2025-06-11 08:07:07 +00:00
Brian Gough
fdd0d95554 Merge pull request #26293 from overleaf/bg-history-redis-fix-persist-worker
add missing load global blobs from persist worker

GitOrigin-RevId: ae9393f2353fb4d5afe349aa7d0a26bab80c7f53
2025-06-11 08:06:59 +00:00
Brian Gough
2a833aa23a Merge pull request #26250 from overleaf/bg-history-redis-add-return-value-to-persistBuffer
provide return value from persistBuffer

GitOrigin-RevId: ba52ff42b91ffe9adc23ab0461fa836540735563
2025-06-11 08:06:54 +00:00
Brian Gough
fec6dde00f Merge pull request #26203 from overleaf/bg-history-redis-fix-loadAtVersion
Extend loadAtVersion to handle nonpersisted versions

GitOrigin-RevId: 22060605ea7bb89a8d4d61bafab8f63b94d59067
2025-06-11 08:06:50 +00:00
Brian Gough
c81cc4055e Merge pull request #26220 from overleaf/bg-history-redis-fix-loadAtVersion-startVersion
correct startVersion calculation in loadAtVersion

GitOrigin-RevId: b81c30dcab90b137169a4bddef3c22f44a957f68
2025-06-11 08:06:45 +00:00
Brian Gough
2d0706591b Merge pull request #26219 from overleaf/bg-history-redis-fix-loadAtTimestamp
correct startVersion calculation in loadAtTimestamp

GitOrigin-RevId: ad46aae47c0769943e787199d68e895cf139bb56
2025-06-11 08:06:41 +00:00
Brian Gough
f904933d68 Merge pull request #26180 from overleaf/bg-history-redis-add-queueChanges
add queueChanges method to history-v1

GitOrigin-RevId: fb6da79bd5ca40e7cbdcb077ad3a036cc5509ced
2025-06-11 08:06:36 +00:00
Andrew Rumble
c227c1e2d9 Remove some unused variables
These miseed the lint rule as they were merged between the last rebase
and deploy.

GitOrigin-RevId: 16b1117d56f2fc824509b9a0f340dba2ede9902f
2025-06-11 08:06:31 +00:00
Brian Gough
c23e84eb37 Merge pull request #26273 from overleaf/bg-history-redis-add-persist-worker-to-cron
modify existing run-chunk-lifecycle cron job to persist and expire redis queues

GitOrigin-RevId: afb94b3e2fba7368cfec11997dfd5b2bbd6321a9
2025-06-11 08:06:23 +00:00
David
637312e4f8 Merge pull request #26135 from overleaf/dp-error-logs-ai
Add AI paywall to new error logs

GitOrigin-RevId: 2d6dad11dfe3b27c8ff322a9778a53496cfe7277
2025-06-11 08:06:19 +00:00
Andrew Rumble
ce3054713f Remove unused variable
GitOrigin-RevId: 57b864aff3317513f981b101feafac28d3379403
2025-06-11 08:06:14 +00:00
Andrew Rumble
2c07fa1f77 Skip unused array members
GitOrigin-RevId: 5ea4dd880505e65fe7545e0c0d4301236ad103e7
2025-06-11 08:06:10 +00:00
andrew rumble
52280febf6 When filtering object members from rest use full name
GitOrigin-RevId: 0c21c70b2512931744f18e79c8d9e4bb85e83dfa
2025-06-11 08:06:05 +00:00
andrew rumble
f871130773 Disable lint warnings for stubbed class
GitOrigin-RevId: bcee2d1ea4fcb5543fa31fd2174641e55d6c4d39
2025-06-11 08:06:00 +00:00
andrew rumble
25675ce2ba Remove unused params from destructuring
GitOrigin-RevId: e47a16e2d99e923c314fd0fa2220c19b7b2c9b51
2025-06-11 08:05:56 +00:00
Andrew Rumble
c1f5d7c40c Ignore params that are needed for type integrity
These params are either used in a descendent or ancestor of the relevant
file and form part of the interface of the method even if they are not
directly used.

GitOrigin-RevId: 8bf64cecc69a9ae9e6c50797de5ce8db86757440
2025-06-11 08:05:51 +00:00
andrew rumble
4960569648 Remove unused full arguments
As distinct from removing destructured props.

GitOrigin-RevId: d02ad8d36fb532559ed2899268d7b699f2f2fa37
2025-06-11 08:05:46 +00:00
andrew rumble
eb60d364f6 Fix instances of ...rest filtering
GitOrigin-RevId: 9f2889b08ffed20466d7022a5aba69d3e87c5ed9
2025-06-11 08:05:42 +00:00
andrew rumble
542008c61d Remove unused event arguments
GitOrigin-RevId: 25858d07865d6b9a7caa4997d031586a248d8e8b
2025-06-11 08:05:37 +00:00
andrew rumble
3da4dc71f1 Modify no-unused-vars behaviour
using @typescript-eslint/no-unused-vars reduces the number of false
positives in TS code. The changes:
1. Allow the arguments to a function to be checked (reporting only after
the last used variable)
2. Allow rest siblings to be checked
3. Allow these rules to be skipped with an _ prefix to a variable

GitOrigin-RevId: 1f6eac4109859415218248d5b2068a22b34cfd7e
2025-06-11 08:05:33 +00:00
Davinder Singh
312664bd2d Merge pull request #26265 from overleaf/ds-cms-bs5-customer-stories-2
[B2C] Bootstrap 5 migration of Customer stories page

GitOrigin-RevId: cca0d00412ab4ec5da15e26e4e7eb3c40de9e47c
2025-06-11 08:05:14 +00:00
ilkin-overleaf
69e2a57769 Merge pull request #26141 from overleaf/ii-managed-users-consent-screen
[web] Joining managed group from projects page

GitOrigin-RevId: 191203559fba94cad45f35de1af2427b2abb9326
2025-06-11 08:05:09 +00:00
Eric Mc Sween
6d202432ff Merge pull request #26209 from overleaf/em-multiple-edit-ops
Support multiple ops in the history OT ShareJS type

GitOrigin-RevId: fad1e9081ed1978de414c5130692d3b23fcd13d8
2025-06-10 08:06:13 +00:00
Miguel Serrano
5b08adc4ff Merge pull request #26218 from overleaf/msm-bump-tar-fs-multer
[clsi/web/history-v1] Bump `tar-fs` and `multer`

GitOrigin-RevId: c76b964224c8367d68dc1190ff29627cc6919ade
2025-06-10 08:06:05 +00:00
Davinder Singh
86626ca44e Merge pull request #25856 from overleaf/ds-cms-bs5-migration-universities-2
[B2C] Bootstrap 5 migration of Universities page

GitOrigin-RevId: b069c04131531e9f9774a9a53aaa53858ba568c7
2025-06-10 08:06:00 +00:00
Davinder Singh
45c6ce2219 Merge pull request #25842 from overleaf/ds-cms-bs5-migration-enterprises-2
[B2C] Bootstrap 5 migration of Enterprises page

GitOrigin-RevId: 63c4095ddb2ee688bc1780883b86f5a994b262c0
2025-06-10 08:05:55 +00:00
David
ff63215d73 Merge pull request #26155 from overleaf/dp-content-info
Add content-info and content-info-dark to standard colours and use in editor redesign logs

GitOrigin-RevId: 40c026a9ccfe511cab2bf4e28fbfbed7cf218642
2025-06-10 08:05:51 +00:00
Mathias Jakobsen
d3a9b4943a Merge pull request #26257 from overleaf/mj-ide-breadcrumbs-crash
[web] Avoid editor crash when breadcrumbs can't find open entity

GitOrigin-RevId: 7c7f198c82e102ee9f8e2a59ca1755c3550bdf37
2025-06-10 08:05:46 +00:00
Mathias Jakobsen
e0f6ee8b20 Merge pull request #26133 from overleaf/mj-ide-keyboard-shortcuts
[web] Editor redesign: Add keyboard shortcuts to menu bar

GitOrigin-RevId: 8fe844389de70a919ba836d03f0390f585532bb1
2025-06-10 08:05:42 +00:00
Andrew Rumble
edc7634007 Update bootstrap process to use vitest chai
GitOrigin-RevId: 5576223019c0e2b4554707f0025e82ab3a7ca514
2025-06-10 08:05:23 +00:00
Andrew Rumble
c0b7efea10 Change imports that use chai to use vitest
GitOrigin-RevId: 59d780f754adbb5160a2de8e5eca1def6968584b
2025-06-10 08:05:18 +00:00
Brian Gough
2eb695f4c3 Merge pull request #26122 from overleaf/bg-history-redis-make-persist-buffer-consistent
make persistBuffer export consistent with other methods

GitOrigin-RevId: 24536e521e1d20ef63cc74bd9ba40e095025d512
2025-06-09 08:05:39 +00:00
Brian Gough
d280f40885 Merge pull request #26116 from overleaf/bg-history-redis-show-buffer
add script to display redis buffer for a given history ID

GitOrigin-RevId: 71c2e79480c0873d30801ed3c13aa9a7fc7873f6
2025-06-09 08:05:35 +00:00
Kristina
a9923fed4e Merge pull request #26198 from overleaf/jpa-recurly-metrics
[web] add metrics for recurly API usage

GitOrigin-RevId: 89840829f86ce1ff750d57f3445f279f4b151d6f
2025-06-09 08:05:24 +00:00
Kristina
7a449f4686 Merge pull request #26014 from overleaf/kh-remaining-references-to-recurly-fields
[web] update remaining references to `recurlyStatus` and `recurlySubscription_id`

GitOrigin-RevId: f5e905eba598cfcd146803c6ccc36a2304021544
2025-06-09 08:05:17 +00:00
Kristina
a8df91e91b Merge pull request #26087 from overleaf/mf-change-to-stripe-uk
[web] Configure to use Stripe UK account

GitOrigin-RevId: 0856f6da2caae8caf9887ec2acea8e7f0972e598
2025-06-09 08:05:09 +00:00
CloudBuild
9e9ad3c005 auto update translation
GitOrigin-RevId: 52a28c6823536ef916c656128dbcdff1da80635b
2025-06-06 08:06:46 +00:00
Eric Mc Sween
e5d828673e Merge pull request #26128 from overleaf/em-no-tracked-deletes-in-cm
History OT: Remove tracked deletes from CodeMirror

GitOrigin-RevId: 4e7f30cf2ed90b0c261eaa4ba51a2f54fe6e3cef
2025-06-06 08:06:34 +00:00
Andrew Rumble
df233f3e5e Add commands for running just mocha tests
GitOrigin-RevId: 6cd5c6aedd4fb2f222a758d6aca130f178a4acf3
2025-06-06 08:06:18 +00:00
Rebeka Dekany
784559f1b8 Add video caption track if captionFile is available (#25997)
GitOrigin-RevId: fefcce66fe573385dfec34cc0f8697220fe418a3
2025-06-06 08:06:06 +00:00
Rebeka Dekany
ae51e57c75 Migrate user email confirmation page to Bootstrap 5 (#26026)
GitOrigin-RevId: 8e12b19fb941c0adfeaa16089bfe229e8816ad8d
2025-06-06 08:06:01 +00:00
Rebeka Dekany
24e12bfbd4 Migrate institutional account linking pages to Bootstrap 5 (#25900)
GitOrigin-RevId: 75734bdbde52e90305ae759789acaf4203ec49b4
2025-06-06 08:05:57 +00:00
Andrew Rumble
1386ca1669 Add migration for drop projectHistoryMetaData collection
GitOrigin-RevId: 1ebfc60ee9591837f37e507fb1dcb059c09a7f3b
2025-06-06 08:05:52 +00:00
Andrew Rumble
f7fcf4c23f Remove projectHistoryMetaData from mongo db interface
GitOrigin-RevId: dbbc2218c7b1ff8b7907248f86b03189e9e4006d
2025-06-06 08:05:47 +00:00
Jakob Ackermann
3b684e08ca [web] fetch token users in a single db query per access mode (#26078)
* [web] skip db query when getting empty list of users

* [web] fetch token users in a single db query per access mode

GitOrigin-RevId: fa5d9edcb761bd5d5e5ea07d137a5a86efdbdd5c
2025-06-06 08:05:42 +00:00
Brian Gough
d7833afd35 Merge pull request #26173 from overleaf/bg-fix-typo-in-project-deletion
fix deleted project owner ID in expireDeletedProject function

GitOrigin-RevId: 7e427bf9877865752f259a75b99354597d2e0a7f
2025-06-06 08:05:38 +00:00
Brian Gough
af7bcfc96a Merge pull request #25486 from overleaf/bg-add-logging-when-projects-are-expired
add logging when projects are expired

GitOrigin-RevId: 5107f9f3d2f35aac1ee3f02a9a92c5f625d47f7a
2025-06-06 08:05:33 +00:00
Jakob Ackermann
842f6c289f [document-updater] make setDoc aware of tracked deletes in history-ot (#26126)
GitOrigin-RevId: efa1a94f2f435058b553f639e43832454c58591d
2025-06-06 08:05:23 +00:00
Brian Gough
1e6112d5b0 Merge pull request #25467 from overleaf/bg-fix-error-handling-when-accounts-are-deleted
improve logging deleted when user data is expired

GitOrigin-RevId: ac85b66c503184a815348a11a730fb68a504d80a
2025-06-05 08:06:27 +00:00
Antoine Clausse
11e410c9c0 Merge pull request #26163 from overleaf/revert-25745-ac-bs5-metrics-module
Revert "[web] Migrate metrics module Pug files to Bootstrap 5 (#25745)"

GitOrigin-RevId: b97eecc2232f56833391fb789902f9a85936c365
2025-06-05 08:06:16 +00:00
CloudBuild
0037b0b3fc auto update translation
GitOrigin-RevId: f0b783bc74dc2212d330305600c8f3d16d27eef3
2025-06-05 08:06:11 +00:00
Jakob Ackermann
cd10a31a16 [server-ce] fix direct invocation of create-user.mjs script in web (#26152)
GitOrigin-RevId: 9c7917e489dc8f3651f4ccf88a740ad60b6b4437
2025-06-05 08:06:06 +00:00
M Fahru
ca10904484 Merge pull request #26027 from overleaf/mf-admin-panel-stripe
[web] Update admin panel with Stripe subscription data

GitOrigin-RevId: fc4f773c5d6d2eae206a791c1ad40d8ccbf766e7
2025-06-05 08:05:58 +00:00
M Fahru
e3310e2358 Merge pull request #26117 from overleaf/sg-money-back-wording
Update en.json

GitOrigin-RevId: 5b02970e6344b65e37c49c196c9e3c89b1555c75
2025-06-05 08:05:54 +00:00
Domagoj Kriskovic
62714d995d Revert "Reinitialise Writefull toolbar after buying AI assist (#25741)" (#26144)
This reverts commit 7247ae45ca7de7f1f3778b1b22f49e2ff840a7ef.

GitOrigin-RevId: c6dc1a073ce3d0f9703e426df1c12fa1c7ffac5c
2025-06-05 08:05:28 +00:00
David
a8a21e05af Merge pull request #26100 from overleaf/dp-compile-timeout-paywall
Add compile timeout paywall to new editor

GitOrigin-RevId: 9742ae67b4103c72cc9d87852801ae8751f85d6d
2025-06-05 08:05:20 +00:00
David
08316442cf Merge pull request #26067 from overleaf/dp-separate-rail-sizes
Separate rail size storage for different rail tabs

GitOrigin-RevId: dd97215de9ea4e4a932d10dabb234e343f5e3fa5
2025-06-05 08:05:15 +00:00
David
db98f5132b Merge pull request #25939 from overleaf/dp-error-logs
Update error logs designs for new editor

GitOrigin-RevId: 0de3a54446a0ff114a1debb7b5f274d3a8f19c42
2025-06-05 08:05:11 +00:00
Kristina
a134a2b799 [web] support purchasing/removing add-ons for Stripe subscriptions (#26081)
GitOrigin-RevId: 01c2eaccc7c34bc37be43120de83270490e5e6da
2025-06-05 08:05:06 +00:00
Eric Mc Sween
7a556cf1fd Merge pull request #26041 from overleaf/em-history-ot-type-serialize
History OT type: operate on parsed EditOperations

GitOrigin-RevId: dbb35789736958d4ef398e566400d6e9a0e49e8b
2025-06-04 08:07:54 +00:00
Eric Mc Sween
f11ea06c1a Merge pull request #25910 from overleaf/em-track-changes-sharejs
Track changes in the history OT sharejs doc

GitOrigin-RevId: 17365219f24a25790eac611dbde9681eb73d0961
2025-06-04 08:07:50 +00:00
M Fahru
d173bdf8e2 Merge pull request #25355 from overleaf/mf-whitelist-staging-url-stripe-test
[web] Bypass country requirement for Stripe if user is on staging or dev environment to ease the testing process

GitOrigin-RevId: 0924a57d3a1b7b530a3822fb8f9056a1dd7119e9
2025-06-04 08:07:35 +00:00
M Fahru
832f9923b9 Merge pull request #25998 from overleaf/mf-update-stripe-email-from-subscription-dashboard
[web] Make user able to sync their email address in subscription dashboard for Stripe subscription

GitOrigin-RevId: 9abdc0e18ebea29b18c2041130946b9e50fa43db
2025-06-04 08:07:27 +00:00
M Fahru
ef810a9f36 Merge pull request #25967 from overleaf/mf-sync-email-update-to-stripe-account
[web] Sync Stripe customer email when user update their primary email in account setting

GitOrigin-RevId: a5f4b4e960d2c9d4ba96a2b3036329f4868e1bb8
2025-06-04 08:07:23 +00:00
Brian Gough
54c0eb7fdc Merge pull request #25958 from overleaf/bg-history-redis-check-persisted-version-on-update
prevent setPersistedVersion from setting an out of bounds version

GitOrigin-RevId: 9561b7b96399bed901db5c2ac20a0cdbf4c67395
2025-06-04 08:07:19 +00:00
Antoine Clausse
edacb9ec0b Merge pull request #26111 from overleaf/revert-25937-ac-bs5-general-pug-pages
Revert "[web] Migrate general Pug pages to BS5"

GitOrigin-RevId: fcc42ee28004aa55c09ecbd5f5e96c6067e717e9
2025-06-04 08:07:07 +00:00
Jakob Ackermann
b84d23564b [web] remove spurious cleanup of project audit log entries (#26102)
GitOrigin-RevId: 32693f89b417b357588d059500ab51c3a9dd46dd
2025-06-04 08:07:01 +00:00
Mathias Jakobsen
d5ba2e3f1c Merge pull request #26094 from overleaf/mj-ide-fps-update
[web] Add full project search to redesign switcher modal

GitOrigin-RevId: 3f494ddc3bf94d9f7c2d6de62183b1805b110601
2025-06-04 08:06:51 +00:00
Alf Eaton
385f5706d8 Add doc and file counts to the admin info page for a project (#26076)
GitOrigin-RevId: afa7fa4e562962a4c7c88f6d3d5f13c0f1feb2e3
2025-06-04 08:06:45 +00:00
Antoine Clausse
2226594ade [web] Migrate 4 simple user pages to BS5 (#25947)
* Migrate email-preferences.pug to BS5

https://www.dev-overleaf.com/user/email-preferences

* Migrate sessions.pug to BS5

https://www.dev-overleaf.com/user/sessions

* Migrate one_time_login.pug to BS5

https://www.dev-overleaf.com/read-only/one-time-login

* Fix positions in back-to-btns mixin

* Migrate accountSuspended.pug to BS5

https://www.dev-overleaf.com/account-suspended

* Set max-width of 400px in account-suspended page

* Fix column widths in sessions.pug

GitOrigin-RevId: 8ec6100fb230cf532049fcc9aba7c00def20ea0e
2025-06-04 08:06:40 +00:00
Antoine Clausse
a210a7b14d [web] Migrate general Pug pages to BS5 (#25937)
* Revert me! Temporarily update code to test updates

* Update layout-no-js.pug to use BS5

* Migrate pages to BS5

* Revert "Revert me! Temporarily update code to test updates"

This reverts commit 03d980939dcbdc3f73ddf1e673acbc3fbfdfe2ec.

* Use `.error-container` class instead of BS5 utility

* Fix breakbpoints

* Use `.error-container` instead of utility class

GitOrigin-RevId: fd39c4f7278f175bbdeee24826f7a2226b1d7c70
2025-06-04 08:06:36 +00:00
Antoine Clausse
25d3972810 [web] Migrate post-gateway.pug to BS5 (#25860)
* Remove `data-ol-auto-submit`, to test the page

* Migrate post-gateway.pug to BS5

* Revert "Remove `data-ol-auto-submit`, to test the page"

This reverts commit ee728b0bdda80d739bd09b2e4e9419303f7053db.

* Fix breakbpoints

* Use `layout-marketing`

GitOrigin-RevId: 73aa4da1e4ddae03d9c8e6671c6a8ccb89ecf0b0
2025-06-04 08:06:32 +00:00
Antoine Clausse
397016744e [web] Migrate metrics module Pug files to Bootstrap 5 (#25745)
* Remove `bootstrap5PageStatus = 'disabled'`

* Update from 'col-xs-' to 'col-'

* Rename LESS files to SCSS

* Rename local vars

* Refactor color variables to use SCSS variables in stylesheets

* Remove unused `.superscript`

It was added in 6696ffdd50

* Remove -moz and -webkit properties

* Remove unused(?) `.hub-circle img`

* Fix selector specificity for calendar display in daterange-picker

* Fix space/tab indents

* Fixup btn-link classes: fixes some borders

* Add support for svg.nvd3-iddle alongside svg.nvd3-svg in styles

* Add dropdown-item classes (improves styles)

* Replace `data-toggle` by `data-bs-toggle`

* Fixup table: remove .card class, add scope="col", add tbody

* Update dropdown caret icon

* Update icons to material symbols

* Remove green color override for links

* Remove/rearrange CSS unrelated to metrics module

* Add space after "by" in lags-container (by Day/Week/Month)

* Fix SCSS linting

* Re-add CSS that belongs in portals module

* Use `layout-react`

* Put table in Card. It still overflows but looks slightly better

* Fix columns breakbpoints

* Revert "Use `layout-react`"

This reverts commit a9e0d8f5c19d1dfd7417bf67b90799ad199a5913.

* Use css variables, use breakpoint mixins

* Add `.py-0` on subscriptions table card, so overflows appear less bad

GitOrigin-RevId: 55295ad76c112609baf43de4aa606d0c3da7a91f
2025-06-04 08:06:27 +00:00
Antoine Clausse
4dbc70b745 [web] Replace action button to "Go to Account Settings" link in group-settings alert for email confirmation (#25672)
* Replace action button to "Go to Account Settings" link in group-settings alert for email confirmation

* `bin/run web npm run extract-translations` & `make cleanup_unused_locales`

* Fix test capitalization

* Update "Go to account settings" to lowercase and link-styling

* `bin/run web npm run extract-translations`

* Fix test

GitOrigin-RevId: d66ce34556bdfc2a37f12900055640cc995ac140
2025-06-04 08:06:23 +00:00
Brian Gough
393cee7af5 Merge pull request #25993 from overleaf/bg-history-refactor-persist-buffer-limits
refactor persist buffer to add limits

GitOrigin-RevId: 4a40a7a8812acf5bb7f98bfd7b94d81ebe19fc57
2025-06-04 08:06:19 +00:00
Brian Gough
50df3862e9 Merge pull request #25954 from overleaf/bg-history-expire-worker-fix
fix expire_redis_chunks to only clear job on error

GitOrigin-RevId: f7ec435edda95958b453fba501686dcfd84426f7
2025-06-04 08:06:14 +00:00
Brian Gough
a80203f748 Merge pull request #25909 from overleaf/bg-history-persist-worker
add history persist worker

GitOrigin-RevId: b9e31e7bdd84570efc0b87b9f5e90b4078551a8c
2025-06-04 08:06:10 +00:00
Brian Gough
cb350ecc65 Merge pull request #25907 from overleaf/bg-history-redis-persist-buffer
add a `persistBuffer` method to history-v1

GitOrigin-RevId: 71a34e48e9ebe378e2f765f3216023e505a58a5d
2025-06-04 08:06:06 +00:00
Brian Gough
b2b676249d Merge pull request #25928 from overleaf/bg-history-redis-move-test-script-helpers
move test script helpers in history-v1

GitOrigin-RevId: cc2e5d8b1baea7396f948883a12a91846f77836c
2025-06-04 08:06:02 +00:00
Miguel Serrano
ee23e8f49f Merge pull request #26093 from overleaf/msm-e2e-fix
[CE/SP] Force build of docker compose containers

GitOrigin-RevId: 0605fcdcaf670e3d8435f1e180d2bfc34a29ed81
2025-06-04 08:05:57 +00:00
Jakob Ackermann
4aaf411cd2 [misc] improve logging in history system (#26086)
* [project-history] tag all the errors

* [history-v1] log warnings for unexpected cases

GitOrigin-RevId: 3189fa487eee88985688ff990ec101daad0d13b1
2025-06-04 08:05:50 +00:00
roo hutton
a63e25953f Merge pull request #25896 from overleaf/rh-load-odc-data
Load ODC data when revisiting onboarding form

GitOrigin-RevId: 506df5d58a8b0305d83b9f43986a55fd309a2720
2025-06-04 08:05:42 +00:00
Mathias Jakobsen
48337b2e2c Merge pull request #25808 from overleaf/mj-ide-full-project-search
[web] Editor redesign: Add full project search

GitOrigin-RevId: b4327c4ba0ddd7387ec8d6640e31200ca0fe4a6e
2025-06-03 08:06:52 +00:00
Brian Gough
3a96df4623 Merge pull request #26050 from overleaf/em-saml-user-query
Improve index usage for SAML user query

GitOrigin-RevId: 189aba60a12c8369a0062e7df4c57bef8a16c98c
2025-06-03 08:06:47 +00:00
Brian Gough
4b9963757f Merge pull request #26047 from overleaf/bg-web-api-is-leaking-disk-space
clean up temporary files in GitBridgeHandler operations

GitOrigin-RevId: b4a202f4f4c563a020fed8a47da1a84417ccbd2d
2025-06-03 08:06:43 +00:00
M Fahru
35500cc72b Merge pull request #25607 from overleaf/mf-free-trial-limit-stripe-handler
[web] Limit user free trial on stripe subscription

GitOrigin-RevId: b3d978ed598d20451a99cf811fcae9ba2e3b23f0
2025-06-03 08:06:35 +00:00
Jakob Ackermann
3fbbb50ef7 [web] use correct term in setPublicAccessLevel API wrapper (#25848)
GitOrigin-RevId: 022c59d6d5c6f239438ed8e91f3ca47954198a0c
2025-06-03 08:06:26 +00:00
Jakob Ackermann
0aae5c48b4 [web] skip fetching members and invites for restricted users (#25673)
* [web] hide sensitive data from joinProject when building project view

* [web] skip fetching members and invites for restricted users

* [web] fix owner features in joinProject view

* [web] separate invited members from owner

* [web] skip fetching users with empty members  list

* [web] split await chain

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>

* [web] remove spurious parentheses

* [web] remove dead code

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>

---------

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>
GitOrigin-RevId: 5b4d874f974971e9c14d7412620805f8ebf63541
2025-06-03 08:06:22 +00:00
Jakob Ackermann
6cbacc8cb7 [web] fetch project once for joinProject (#25667)
* [web] fetch project once for joinProject

* [web] await all the nested helpers for getting privilege levels

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>

---------

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: f0280c36ef995b417ccdab15014f05954e18c5f0
2025-06-03 08:06:13 +00:00
Jakob Ackermann
2e50e0ffa1 [web] add ProjectAccess helper class (#25663)
* [web] add ProjectAccess helper class

* [web] remove ts-ignore for calling OError.tag with try/catch error

GitOrigin-RevId: e097a95b4d929a3927a3eeb70635590680c93007
2025-06-03 08:06:01 +00:00
Mathias Jakobsen
da449f9f5f Merge pull request #26015 from overleaf/mj-ide-breadcrumbs-setting
[web] Add setting to control editor breadcrumbs

GitOrigin-RevId: 6e0a4bb97eba63a1df43d85840f8962bf0238b7c
2025-06-03 08:05:49 +00:00
Mathias Jakobsen
1b15dc3854 Merge pull request #26003 from overleaf/mj-ide-duplicate-project
[web] Editor redesign: Add project duplication button

GitOrigin-RevId: 93e5aa66a7ccc13650e07fda041394811874dafa
2025-06-03 08:05:44 +00:00
Mathias Jakobsen
86e13b088a Merge pull request #25938 from overleaf/mj-core-pug-teardown
[web] Tear down core-pug-bs5 feature flag

GitOrigin-RevId: 875417ca02d8212940b4782bc3016778344116ba
2025-06-03 08:05:39 +00:00
Liangjun Song
26a77e739d Merge pull request #25852 from overleaf/ls-sync-stripe-subscription-logic
Replicate syncing logic for Stripe subscription

GitOrigin-RevId: 9422a3e193160409eddd4c5f2c80e8578bd88559
2025-06-02 08:05:35 +00:00
Eric Mc Sween
c6f4229147 Merge pull request #25952 from overleaf/em-split-editor-facade
Split EditorFacade functionality for history OT (2nd attempt)

GitOrigin-RevId: 2bc6d6c54a9f336fd4a69f0eb548dd06b9f06f5f
2025-06-02 08:05:30 +00:00
Christopher Hoskin
fe64856be7 Merge pull request #26021 from overleaf/csh-issue-25976-dev-env-ci
Upgrade to Redis 7.4 in dev and CI

GitOrigin-RevId: 068e54899bf50a247fedd0243d66f1545bc7cf01
2025-06-02 08:05:21 +00:00
Kristina
9ba772b18f [web] handle 3DS challenges for Stripe (#25918)
* handle 3DS challenges on the subscription dashboard
* add `/user/subscription/sync` endpoint
* upgrade `stripe-js` & rm `react-stripe-js`
* group related unit tests together
* add modules `SubscriptionController` unit tests and convert to async/await
* add `StripeClient` unit tests for 3DS failure

GitOrigin-RevId: 9da4758703f6ef4ec08248b328abddbbdd8e44ad
2025-06-02 08:05:16 +00:00
CloudBuild
efa20c26c9 auto update translation
GitOrigin-RevId: 410e63cee274ad03fc9f64b277ff0cd8aa8c1995
2025-05-30 08:05:46 +00:00
Mathias Jakobsen
97f8149a2b Merge pull request #25955 from overleaf/mj-ide-editing-session
[analytics+web] Add editor redesign status to editing session segmentation

GitOrigin-RevId: 8f2a05a6851d41712a592952c18b845b77115f47
2025-05-30 08:05:35 +00:00
Mathias Jakobsen
393e738ce6 Merge pull request #25978 from overleaf/mj-rail-active-indicator-overflow
[web] Avoid showing active rail indicator overflow

GitOrigin-RevId: a81d97bde6dfa22102374f13b8d372d61e08180e
2025-05-30 08:05:23 +00:00
Mathias Jakobsen
102b59a641 Merge pull request #25984 from overleaf/mj-breadcrumbs-filename-refresh
[web] Update breadcrumbs file name on renames

GitOrigin-RevId: 8d2f176b14880bec512a9b37c15148e10f29a758
2025-05-30 08:05:18 +00:00
Mathias Jakobsen
f40eb50264 Merge pull request #25987 from overleaf/mj-ide-review-panel-overview
[web] Editor redesign: Align review panel overview to top

GitOrigin-RevId: d713d07b1e4eba76164fd29bce696288cca1d63c
2025-05-30 08:05:14 +00:00
David
ba53ea3306 Merge pull request #25999 from overleaf/dp-eq-preview-fix
Move rendering of equation preview math into codemirror extension to fix zoomed in issue

GitOrigin-RevId: 66bf9120191da236d88213d16b457c0a676f38ac
2025-05-30 08:05:09 +00:00
David
28c5d777a4 Merge pull request #25846 from overleaf/dp-themed-style-variables
Create themed colour variables and use them in new editor rail

GitOrigin-RevId: 48719f1b29170bcb95d34ecd538554bdf4fad2bb
2025-05-30 08:05:05 +00:00
Miguel Serrano
b8816848a0 Merge pull request #25972 from overleaf/msm-unvendor-envsubst
[git-bridge] Un-vendor `envsubst`

GitOrigin-RevId: 02abdd20aede8b6fd90013f4841ad3375997335c
2025-05-30 08:05:00 +00:00
Miguel Serrano
1ea7a6f33f Merge pull request #25968 from overleaf/msm-git-bridge-bump-async-handler
[git-bridge] Bump `async-http-client` to 3.0.2

GitOrigin-RevId: 659e997b0403e9eb5af03ce398a84730661ff66a
2025-05-30 08:04:55 +00:00
Jimmy Domagala-Tang
aee3909a5f prevent attempting to set headers after we already sent respone (#25994)
GitOrigin-RevId: be9f63f4c6d86ccd7f55850d71f5f2564eab2f12
2025-05-29 08:06:51 +00:00
Andrew Rumble
a06ae82b56 Remove esmock from web
GitOrigin-RevId: 32aa3f23da8bb135d41f2e305662f157094d4936
2025-05-29 08:06:46 +00:00
Andrew Rumble
de4a80ef93 Update unit test script to remove mocha module tests
GitOrigin-RevId: 3bcc265e32486a179dd473233bed27ed798fba47
2025-05-29 08:06:34 +00:00
Jimmy Domagala-Tang
d49a8f83df Revert Recurly based subscription upgrades on failed payments (#25824)
* feat: add ability to set restore point for subscriptions

* feat: update recurly client with ability to get past due invoices and fail invoices

* utility to retrieve last valid subscription

* create revert requests and fail invoices, revert subscriptions to previous valid states on failed upgrade payments

* add restore point and call to revert plans on failed payments

* code style for PaymentProviderEntities

* moving subs restore point check to SubscriptionController, and removing unecessary error

* adding ability to stop sub restores without a deploy

* ensure that subs restore point is set before changing plan

* changing reverted flag on subscription to count, and only reverting automatic invoices

* updating tests with restorepoint functions

* rethrow error after voiding restore point, and ensure that recurly failed_payment always gets a 200 response

* only void restore point if the changeRequest fails

GitOrigin-RevId: cf3074c13db22d1cf680b59c4d57817c390db23e
2025-05-29 08:06:11 +00:00
Brian Gough
3296fc15da Merge pull request #25905 from overleaf/bg-history-redis-fix-import-path
fix import path for Job errors in history-v1

GitOrigin-RevId: f5f88bd34e713cd2ed78185ed4ce917e10d09caf
2025-05-29 08:06:06 +00:00
Brian Gough
b525a80d28 Merge pull request #25470 from overleaf/bg-history-redis-downgrade-job-related-errors
downgrade expected job errors in scanAndProcessDueItems

GitOrigin-RevId: 0a2689699bfc6512c5017c7f5e51ac4f80c409fe
2025-05-29 08:06:01 +00:00
Rebeka Dekany
9f821b4cfa Add landmark for the cookie banner and update its links color (#25823)
* Update cookie banner link color

* Add landmark for the cookie banner

GitOrigin-RevId: 9500cdfd7ddacbc2442680ed477ca1ac793720f7
2025-05-29 08:05:42 +00:00
Rebeka Dekany
c8d4b644bf Update the Labs button's content and border colour (#25942)
GitOrigin-RevId: 36de10a13ff5d8721ffcac25c5c002fe25f7a125
2025-05-29 08:05:37 +00:00
Andrew Rumble
18c0634011 Disable test isolation
Isolation isn't required and it takes the setup contribution to our
tests down from over 60 seconds to single figures, greatly speeding up
the tests.

GitOrigin-RevId: 72516e420583fa2dfcef13f2cc50b0769a100baf
2025-05-29 08:05:29 +00:00
Andrew Rumble
b35b54cb80 Use vi for logger mocks
GitOrigin-RevId: aeff4a82f96300ec3f81c8418e8373e923b8c4d4
2025-05-29 08:05:24 +00:00
Andrew Rumble
ee8044d162 Update script to handle multiple directories and no vitest tests scenarios
GitOrigin-RevId: 92a394387c2326d350b64c6a25e3b34c92e342aa
2025-05-29 08:05:19 +00:00
Andrew Rumble
5b764953c0 Add eslint rules for skipped/focused tests (and fix issues)
GitOrigin-RevId: 01735e0805a28609a68df667cd2a4c3d89c5b968
2025-05-29 08:05:11 +00:00
Andrew Rumble
873068a187 Update test files with vitest compat changes
GitOrigin-RevId: 494f906089d250268a5ff8c8a2150ff2692c37e2
2025-05-29 08:05:06 +00:00
Andrew Rumble
51dcc88f27 Rename test files for vitest
GitOrigin-RevId: f8792c0ce5eeb4843a534d3ff83e011d25fb65e0
2025-05-29 08:05:00 +00:00
Andrew Rumble
0d3025b8cf Add vitest and configuration
GitOrigin-RevId: 1262f9f32a0db6a29d3feedd8158b8dd04e48b6a
2025-05-29 08:04:55 +00:00
Jessica Lawshe
ce67a27c97 Merge pull request #25556 from overleaf/jel-group-audit-log-remove-from-group
[web] Log when user leaves or is removed from group

GitOrigin-RevId: 8a5042b21cbf4eb622d5ca35cc095d94fe5a8539
2025-05-28 08:05:53 +00:00
Jessica Lawshe
dcd520d7eb Merge pull request #25360 from overleaf/jel-group-audit-log-join
[web] Update group audit log when user joins

GitOrigin-RevId: 81c0d5003cdde384cb5ff90b57f6aa8b8dae0ee2
2025-05-28 08:05:46 +00:00
Jessica Lawshe
881db9b472 Merge pull request #25011 from overleaf/jel-group-audit-logs-part-2
[web] Update group audit log when user enrolls in managed users

GitOrigin-RevId: 15d79854007ac3334a2bb66bcf73230bf42c68ce
2025-05-28 08:05:42 +00:00
Domagoj Kriskovic
93a1996491 Show add-on list for non-personal subscription (#25901)
GitOrigin-RevId: ba23158f51a7183fabc61c16b19809f58cf15323
2025-05-28 08:05:34 +00:00
Eric Mc Sween
25adb7e303 Merge pull request #25949 from overleaf/revert-25869-em-split-editor-facade
Revert "Split EditorFacade functionality for history OT"

GitOrigin-RevId: a55328e08776fa0f59071fca955ba73ef130984d
2025-05-28 08:05:30 +00:00
Eric Mc Sween
13fa735da0 Merge pull request #25869 from overleaf/em-split-editor-facade
Split EditorFacade functionality for history OT

GitOrigin-RevId: 1e415e1d058c0de0b27271a9a5d7208b4a8a689b
2025-05-28 08:05:26 +00:00
Miguel Serrano
4315777638 Merge pull request #25916 from overleaf/msm-git-bridge-bump-jgit
[git-bridge] bump `jgit` to `6.10.1`

GitOrigin-RevId: a1ffaa68a2eaca278c48acaf8e9d72b06c0cf29a
2025-05-28 08:05:19 +00:00
Antoine Clausse
344405cdcb Revert case-insensitivity in e2e tests (#25828)
* Revert case-insensitivity in e2e tests

* Use `{ exact: false }` to filter createProject type

* Update server-ce/test/helpers/project.ts

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

---------

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: b8b2f8439a55e9527358b13d9292779dc3509e9d
2025-05-28 08:05:05 +00:00
Antoine Clausse
f7b6246d41 [web] Use 6-digits verification in project-list notifications (bis) (#25847)
* Pull email context outside of `ResendConfirmationCodeModal`

* Use `loading` prop of button instead of deprecated Icon

* Swap notification order to clarify priority (no change in behaviour)

* Replace confirmation link action by confirmationCodeModal, and simplify code

* Change to secondary button variant in the Notification

* Display errors within the modal

* Increase ratelimit for resend-confirmation

* Copy changes

* Add stories on email confirmation notifications

* Fix other Notification stories

* Update tests

* Update services/web/frontend/js/features/settings/components/emails/confirm-email-form.tsx

Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com>

* Remove placeholder on 6-digit code input

---------

Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com>
GitOrigin-RevId: dad8bfd79505a2e7d065fd48791fd57c8a31e071
2025-05-28 08:05:01 +00:00
David
9000a3b70c Merge pull request #25923 from overleaf/dp-view-dropdown
Update UI of view dropdown

GitOrigin-RevId: 2d689a73886e0821eaa21e6666092e9414528e55
2025-05-28 08:04:57 +00:00
David
43563158d3 Merge pull request #25779 from overleaf/dp-recompile-button
Update Recompile button to match figma designs

GitOrigin-RevId: c3614fe2e621a64eb35dd4989b86c68a89bea342
2025-05-28 08:04:53 +00:00
CloudBuild
1c6ee3f930 auto update translation
GitOrigin-RevId: 4e2e3d1e7ca70f76f13f905753ba1ca2c945b72f
2025-05-27 08:05:55 +00:00
1313 changed files with 55115 additions and 34329 deletions

View file

@ -1,10 +1,19 @@
---
name: Bug report
about: Report a bug
title: ''
labels: type:bug
assignees: ''
---
<!--
Note: If you are using www.overleaf.com and have a problem,
Note: If you are using www.overleaf.com and have a problem,
or if you would like to request a new feature please contact
the support team at support@overleaf.com
This form should only be used to report bugs in the
This form should only be used to report bugs in the
Community Edition release of Overleaf.
-->

1021
README.md

File diff suppressed because it is too large Load diff

View file

@ -42,7 +42,7 @@ To do this, use the included `bin/dev` script:
bin/dev
```
This will start all services using `nodemon`, which will automatically monitor the code and restart the services as necessary.
This will start all services using `node --watch`, which will automatically monitor the code and restart the services as necessary.
To improve performance, you can start only a subset of the services in development mode by providing a space-separated list to the `bin/dev` script:

View file

@ -6,15 +6,18 @@ DOCUMENT_UPDATER_HOST=document-updater
FILESTORE_HOST=filestore
GRACEFUL_SHUTDOWN_DELAY_SECONDS=0
HISTORY_V1_HOST=history-v1
HISTORY_REDIS_HOST=redis
LISTEN_ADDRESS=0.0.0.0
MONGO_HOST=mongo
MONGO_URL=mongodb://mongo/sharelatex?directConnection=true
NOTIFICATIONS_HOST=notifications
PROJECT_HISTORY_HOST=project-history
QUEUES_REDIS_HOST=redis
REALTIME_HOST=real-time
REDIS_HOST=redis
REFERENCES_HOST=references
SESSION_SECRET=foo
V1_HISTORY_HOST=history-v1
WEBPACK_HOST=webpack
WEB_API_PASSWORD=overleaf
WEB_API_USER=overleaf

View file

@ -124,7 +124,7 @@ services:
- ../services/references/app.js:/overleaf/services/references/app.js
web:
command: ["node", "--watch", "app.js", "--watch-locales"]
command: ["node", "--watch", "app.mjs", "--watch-locales"]
environment:
- NODE_OPTIONS=--inspect=0.0.0.0:9229
ports:

View file

@ -25,10 +25,10 @@ services:
env_file:
- dev.env
environment:
- DOCKER_RUNNER=true
- TEXLIVE_IMAGE=texlive-full # docker build texlive -t texlive-full
- COMPILES_HOST_DIR=${PWD}/compiles
- OUTPUT_HOST_DIR=${PWD}/output
- SANDBOXED_COMPILES=true
- SANDBOXED_COMPILES_HOST_DIR_COMPILES=${PWD}/compiles
- SANDBOXED_COMPILES_HOST_DIR_OUTPUT=${PWD}/output
user: root
volumes:
- ${PWD}/compiles:/overleaf/services/clsi/compiles

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
access-token-encryptor
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
fetch-utils
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
logger
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
metrics
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
mongo-utils
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
o-error
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
object-persistor
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -33,6 +33,10 @@ const AES256_KEY_LENGTH = 32
* @property {() => Promise<Array<RootKeyEncryptionKey>>} getRootKeyEncryptionKeys
*/
/**
* @typedef {import('./types').ListDirectoryResult} ListDirectoryResult
*/
/**
* Helper function to make TS happy when accessing error properties
* AWSError is not an actual class, so we cannot use instanceof.
@ -391,9 +395,9 @@ class PerProjectEncryptedS3Persistor extends S3Persistor {
* A general "cache" for project keys is another alternative. For now, use a helper class.
*/
class CachedPerProjectEncryptedS3Persistor {
/** @type SSECOptions */
/** @type SSECOptions */
#projectKeyOptions
/** @type PerProjectEncryptedS3Persistor */
/** @type PerProjectEncryptedS3Persistor */
#parent
/**
@ -424,6 +428,16 @@ class CachedPerProjectEncryptedS3Persistor {
return await this.#parent.getObjectSize(bucketName, path)
}
/**
*
* @param {string} bucketName
* @param {string} path
* @return {Promise<ListDirectoryResult>}
*/
async listDirectory(bucketName, path) {
return await this.#parent.listDirectory(bucketName, path)
}
/**
* @param {string} bucketName
* @param {string} path

View file

@ -20,6 +20,18 @@ const { URL } = require('node:url')
const { WriteError, ReadError, NotFoundError } = require('./Errors')
const zlib = require('node:zlib')
/**
* @typedef {import('aws-sdk/clients/s3').ListObjectsV2Output} ListObjectsV2Output
*/
/**
* @typedef {import('aws-sdk/clients/s3').Object} S3Object
*/
/**
* @typedef {import('./types').ListDirectoryResult} ListDirectoryResult
*/
/**
* Wrapper with private fields to avoid revealing them on console, JSON.stringify or similar.
*/
@ -266,26 +278,12 @@ class S3Persistor extends AbstractPersistor {
* @return {Promise<void>}
*/
async deleteDirectory(bucketName, key, continuationToken) {
let response
const options = { Bucket: bucketName, Prefix: key }
if (continuationToken) {
options.ContinuationToken = continuationToken
}
try {
response = await this._getClientForBucket(bucketName)
.listObjectsV2(options)
.promise()
} catch (err) {
throw PersistorHelper.wrapError(
err,
'failed to list objects in S3',
{ bucketName, key },
ReadError
)
}
const objects = response.Contents?.map(item => ({ Key: item.Key || '' }))
const { contents, response } = await this.listDirectory(
bucketName,
key,
continuationToken
)
const objects = contents.map(item => ({ Key: item.Key || '' }))
if (objects?.length) {
try {
await this._getClientForBucket(bucketName)
@ -316,6 +314,36 @@ class S3Persistor extends AbstractPersistor {
}
}
/**
*
* @param {string} bucketName
* @param {string} key
* @param {string} [continuationToken]
* @return {Promise<ListDirectoryResult>}
*/
async listDirectory(bucketName, key, continuationToken) {
let response
const options = { Bucket: bucketName, Prefix: key }
if (continuationToken) {
options.ContinuationToken = continuationToken
}
try {
response = await this._getClientForBucket(bucketName)
.listObjectsV2(options)
.promise()
} catch (err) {
throw PersistorHelper.wrapError(
err,
'failed to list objects in S3',
{ bucketName, key },
ReadError
)
}
return { contents: response.Contents ?? [], response }
}
/**
* @param {string} bucketName
* @param {string} key

View file

@ -0,0 +1,6 @@
import type { ListObjectsV2Output, Object } from 'aws-sdk/clients/s3'
export type ListDirectoryResult = {
contents: Array<Object>
response: ListObjectsV2Output
}

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
overleaf-editor-core
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -13,7 +13,7 @@ const V2DocVersions = require('./v2_doc_versions')
/**
* @import Author from "./author"
* @import { BlobStore, RawChange } from "./types"
* @import { BlobStore, RawChange, ReadonlyBlobStore } from "./types"
*/
/**
@ -219,7 +219,7 @@ class Change {
* If this Change contains any File objects, load them.
*
* @param {string} kind see {File#load}
* @param {BlobStore} blobStore
* @param {ReadonlyBlobStore} blobStore
* @return {Promise<void>}
*/
async loadFiles(kind, blobStore) {

View file

@ -1,7 +1,7 @@
// @ts-check
/**
* @import { ClearTrackingPropsRawData } from '../types'
* @import { ClearTrackingPropsRawData, TrackingDirective } from '../types'
*/
class ClearTrackingProps {
@ -11,12 +11,27 @@ class ClearTrackingProps {
/**
* @param {any} other
* @returns {boolean}
* @returns {other is ClearTrackingProps}
*/
equals(other) {
return other instanceof ClearTrackingProps
}
/**
* @param {TrackingDirective} other
* @returns {other is ClearTrackingProps}
*/
canMergeWith(other) {
return other instanceof ClearTrackingProps
}
/**
* @param {TrackingDirective} other
*/
mergeWith(other) {
return this
}
/**
* @returns {ClearTrackingPropsRawData}
*/

View file

@ -11,7 +11,7 @@ const EditOperation = require('../operation/edit_operation')
const EditOperationBuilder = require('../operation/edit_operation_builder')
/**
* @import { BlobStore, ReadonlyBlobStore, RangesBlob, RawFileData, RawLazyStringFileData } from '../types'
* @import { BlobStore, ReadonlyBlobStore, RangesBlob, RawHashFileData, RawLazyStringFileData } from '../types'
*/
class LazyStringFileData extends FileData {
@ -159,11 +159,11 @@ class LazyStringFileData extends FileData {
/** @inheritdoc
* @param {BlobStore} blobStore
* @return {Promise<RawFileData>}
* @return {Promise<RawHashFileData>}
*/
async store(blobStore) {
if (this.operations.length === 0) {
/** @type RawFileData */
/** @type RawHashFileData */
const raw = { hash: this.hash }
if (this.rangesHash) {
raw.rangesHash = this.rangesHash
@ -171,9 +171,11 @@ class LazyStringFileData extends FileData {
return raw
}
const eager = await this.toEager(blobStore)
const raw = await eager.store(blobStore)
this.hash = raw.hash
this.rangesHash = raw.rangesHash
this.operations.length = 0
/** @type RawFileData */
return await eager.store(blobStore)
return raw
}
}

View file

@ -8,7 +8,7 @@ const CommentList = require('./comment_list')
const TrackedChangeList = require('./tracked_change_list')
/**
* @import { StringFileRawData, RawFileData, BlobStore, CommentRawData } from "../types"
* @import { StringFileRawData, RawHashFileData, BlobStore, CommentRawData } from "../types"
* @import { TrackedChangeRawData, RangesBlob } from "../types"
* @import EditOperation from "../operation/edit_operation"
*/
@ -139,7 +139,7 @@ class StringFileData extends FileData {
/**
* @inheritdoc
* @param {BlobStore} blobStore
* @return {Promise<RawFileData>}
* @return {Promise<RawHashFileData>}
*/
async store(blobStore) {
const blob = await blobStore.putString(this.content)

View file

@ -84,6 +84,21 @@ class TrackedChange {
)
)
}
/**
* Return an equivalent tracked change whose extent is limited to the given
* range
*
* @param {Range} range
* @returns {TrackedChange | null} - the result or null if the intersection is empty
*/
intersectRange(range) {
const intersection = this.range.intersect(range)
if (intersection == null) {
return null
}
return new TrackedChange(intersection, this.tracking)
}
}
module.exports = TrackedChange

View file

@ -2,9 +2,11 @@
const Range = require('../range')
const TrackedChange = require('./tracked_change')
const TrackingProps = require('../file_data/tracking_props')
const { InsertOp, RemoveOp, RetainOp } = require('../operation/scan_op')
/**
* @import { TrackingDirective, TrackedChangeRawData } from "../types"
* @import TextOperation from "../operation/text_operation"
*/
class TrackedChangeList {
@ -58,6 +60,22 @@ class TrackedChangeList {
return this._trackedChanges.filter(change => range.contains(change.range))
}
/**
* Returns tracked changes that overlap with the given range
* @param {Range} range
* @returns {TrackedChange[]}
*/
intersectRange(range) {
const changes = []
for (const change of this._trackedChanges) {
const intersection = change.intersectRange(range)
if (intersection != null) {
changes.push(intersection)
}
}
return changes
}
/**
* Returns the tracking props for a given range.
* @param {Range} range
@ -89,6 +107,8 @@ class TrackedChangeList {
/**
* Collapses consecutive (and compatible) ranges
*
* @private
* @returns {void}
*/
_mergeRanges() {
@ -117,12 +137,28 @@ class TrackedChangeList {
}
/**
* Apply an insert operation
*
* @param {number} cursor
* @param {string} insertedText
* @param {{tracking?: TrackingProps}} opts
*/
applyInsert(cursor, insertedText, opts = {}) {
this._applyInsert(cursor, insertedText, opts)
this._mergeRanges()
}
/**
* Apply an insert operation
*
* This method will not merge ranges at the end
*
* @private
* @param {number} cursor
* @param {string} insertedText
* @param {{tracking?: TrackingProps}} [opts]
*/
_applyInsert(cursor, insertedText, opts = {}) {
const newTrackedChanges = []
for (const trackedChange of this._trackedChanges) {
if (
@ -171,15 +207,29 @@ class TrackedChangeList {
newTrackedChanges.push(newTrackedChange)
}
this._trackedChanges = newTrackedChanges
this._mergeRanges()
}
/**
* Apply a delete operation to the list of tracked changes
*
* @param {number} cursor
* @param {number} length
*/
applyDelete(cursor, length) {
this._applyDelete(cursor, length)
this._mergeRanges()
}
/**
* Apply a delete operation to the list of tracked changes
*
* This method will not merge ranges at the end
*
* @private
* @param {number} cursor
* @param {number} length
*/
_applyDelete(cursor, length) {
const newTrackedChanges = []
for (const trackedChange of this._trackedChanges) {
const deletedRange = new Range(cursor, length)
@ -205,15 +255,31 @@ class TrackedChangeList {
}
}
this._trackedChanges = newTrackedChanges
}
/**
* Apply a retain operation to the list of tracked changes
*
* @param {number} cursor
* @param {number} length
* @param {{tracking?: TrackingDirective}} [opts]
*/
applyRetain(cursor, length, opts = {}) {
this._applyRetain(cursor, length, opts)
this._mergeRanges()
}
/**
* Apply a retain operation to the list of tracked changes
*
* This method will not merge ranges at the end
*
* @private
* @param {number} cursor
* @param {number} length
* @param {{tracking?: TrackingDirective}} opts
*/
applyRetain(cursor, length, opts = {}) {
_applyRetain(cursor, length, opts = {}) {
// If there's no tracking info, leave everything as-is
if (!opts.tracking) {
return
@ -269,6 +335,31 @@ class TrackedChangeList {
newTrackedChanges.push(newTrackedChange)
}
this._trackedChanges = newTrackedChanges
}
/**
* Apply a text operation to the list of tracked changes
*
* Ranges are merged only once at the end, for performance and to avoid
* problematic edge cases where intermediate ranges get incorrectly merged.
*
* @param {TextOperation} operation
*/
applyTextOperation(operation) {
// this cursor tracks the destination document that gets modified as
// operations are applied to it.
let cursor = 0
for (const op of operation.ops) {
if (op instanceof InsertOp) {
this._applyInsert(cursor, op.insertion, { tracking: op.tracking })
cursor += op.insertion.length
} else if (op instanceof RemoveOp) {
this._applyDelete(cursor, op.length)
} else if (op instanceof RetainOp) {
this._applyRetain(cursor, op.length, { tracking: op.tracking })
cursor += op.length
}
}
this._mergeRanges()
}
}

View file

@ -62,6 +62,35 @@ class TrackingProps {
this.ts.getTime() === other.ts.getTime()
)
}
/**
* Are these tracking props compatible with the other tracking props for merging
* ranges?
*
* @param {TrackingDirective} other
* @returns {other is TrackingProps}
*/
canMergeWith(other) {
if (!(other instanceof TrackingProps)) {
return false
}
return this.type === other.type && this.userId === other.userId
}
/**
* Merge two tracking props
*
* Assumes that `canMerge(other)` returns true
*
* @param {TrackingDirective} other
*/
mergeWith(other) {
if (!this.canMergeWith(other)) {
throw new Error('Cannot merge with incompatible tracking props')
}
const ts = this.ts <= other.ts ? this.ts : other.ts
return new TrackingProps(this.type, this.userId, ts)
}
}
module.exports = TrackingProps

View file

@ -7,7 +7,7 @@ const Change = require('./change')
const Snapshot = require('./snapshot')
/**
* @import { BlobStore } from "./types"
* @import { BlobStore, ReadonlyBlobStore } from "./types"
*/
class History {
@ -85,7 +85,7 @@ class History {
* If this History contains any File objects, load them.
*
* @param {string} kind see {File#load}
* @param {BlobStore} blobStore
* @param {ReadonlyBlobStore} blobStore
* @return {Promise<void>}
*/
async loadFiles(kind, blobStore) {

View file

@ -13,7 +13,7 @@ let EditFileOperation = null
let SetFileMetadataOperation = null
/**
* @import { BlobStore } from "../types"
* @import { ReadonlyBlobStore } from "../types"
* @import Snapshot from "../snapshot"
*/
@ -80,7 +80,7 @@ class Operation {
* If this operation references any files, load the files.
*
* @param {string} kind see {File#load}
* @param {BlobStore} blobStore
* @param {ReadOnlyBlobStore} blobStore
* @return {Promise<void>}
*/
async loadFiles(kind, blobStore) {}

View file

@ -175,7 +175,7 @@ class InsertOp extends ScanOp {
return false
}
if (this.tracking) {
if (!this.tracking.equals(other.tracking)) {
if (!other.tracking || !this.tracking.canMergeWith(other.tracking)) {
return false
}
} else if (other.tracking) {
@ -198,7 +198,10 @@ class InsertOp extends ScanOp {
throw new Error('Cannot merge with incompatible operation')
}
this.insertion += other.insertion
// We already have the same tracking info and commentIds
if (this.tracking != null && other.tracking != null) {
this.tracking = this.tracking.mergeWith(other.tracking)
}
// We already have the same commentIds
}
/**
@ -306,9 +309,13 @@ class RetainOp extends ScanOp {
return false
}
if (this.tracking) {
return this.tracking.equals(other.tracking)
if (!other.tracking || !this.tracking.canMergeWith(other.tracking)) {
return false
}
} else if (other.tracking) {
return false
}
return !other.tracking
return true
}
/**
@ -319,6 +326,9 @@ class RetainOp extends ScanOp {
throw new Error('Cannot merge with incompatible operation')
}
this.length += other.length
if (this.tracking != null && other.tracking != null) {
this.tracking = this.tracking.mergeWith(other.tracking)
}
}
/**

View file

@ -314,25 +314,18 @@ class TextOperation extends EditOperation {
str
)
}
file.trackedChanges.applyRetain(result.length, op.length, {
tracking: op.tracking,
})
result += str.slice(inputCursor, inputCursor + op.length)
inputCursor += op.length
} else if (op instanceof InsertOp) {
if (containsNonBmpChars(op.insertion)) {
throw new InvalidInsertionError(str, op.toJSON())
}
file.trackedChanges.applyInsert(result.length, op.insertion, {
tracking: op.tracking,
})
file.comments.applyInsert(
new Range(result.length, op.insertion.length),
{ commentIds: op.commentIds }
)
result += op.insertion
} else if (op instanceof RemoveOp) {
file.trackedChanges.applyDelete(result.length, op.length)
file.comments.applyDelete(new Range(result.length, op.length))
inputCursor += op.length
} else {
@ -352,6 +345,8 @@ class TextOperation extends EditOperation {
throw new TextOperation.TooLongError(operation, result.length)
}
file.trackedChanges.applyTextOperation(this)
file.content = result
}
@ -400,44 +395,36 @@ class TextOperation extends EditOperation {
for (let i = 0, l = ops.length; i < l; i++) {
const op = ops[i]
if (op instanceof RetainOp) {
// Where we need to end up after the retains
const target = strIndex + op.length
// A previous retain could have overriden some tracking info. Now we
// need to restore it.
const previousRanges = previousState.trackedChanges.inRange(
new Range(strIndex, op.length)
)
let removeTrackingInfoIfNeeded
if (op.tracking) {
removeTrackingInfoIfNeeded = new ClearTrackingProps()
}
// Where we need to end up after the retains
const target = strIndex + op.length
// A previous retain could have overriden some tracking info. Now we
// need to restore it.
const previousChanges = previousState.trackedChanges.intersectRange(
new Range(strIndex, op.length)
)
for (const trackedChange of previousRanges) {
if (strIndex < trackedChange.range.start) {
inverse.retain(trackedChange.range.start - strIndex, {
tracking: removeTrackingInfoIfNeeded,
for (const change of previousChanges) {
if (strIndex < change.range.start) {
inverse.retain(change.range.start - strIndex, {
tracking: new ClearTrackingProps(),
})
strIndex = change.range.start
}
inverse.retain(change.range.length, {
tracking: change.tracking,
})
strIndex = trackedChange.range.start
strIndex += change.range.length
}
if (trackedChange.range.end < strIndex + op.length) {
inverse.retain(trackedChange.range.length, {
tracking: trackedChange.tracking,
if (strIndex < target) {
inverse.retain(target - strIndex, {
tracking: new ClearTrackingProps(),
})
strIndex = trackedChange.range.end
strIndex = target
}
if (trackedChange.range.end !== strIndex) {
// No need to split the range at the end
const [left] = trackedChange.range.splitAt(strIndex)
inverse.retain(left.length, { tracking: trackedChange.tracking })
strIndex = left.end
}
}
if (strIndex < target) {
inverse.retain(target - strIndex, {
tracking: removeTrackingInfoIfNeeded,
})
strIndex = target
} else {
inverse.retain(op.length)
strIndex += op.length
}
} else if (op instanceof InsertOp) {
inverse.remove(op.insertion.length)

View file

@ -86,10 +86,32 @@ class Range {
}
/**
* @param {Range} range
* Does this range overlap another range?
*
* Overlapping means that the two ranges have at least one character in common
*
* @param {Range} other - the other range
*/
overlaps(range) {
return this.start < range.end && this.end > range.start
overlaps(other) {
return this.start < other.end && this.end > other.start
}
/**
* Does this range overlap the start of another range?
*
* @param {Range} other - the other range
*/
overlapsStart(other) {
return this.start <= other.start && this.end > other.start
}
/**
* Does this range overlap the end of another range?
*
* @param {Range} other - the other range
*/
overlapsEnd(other) {
return this.start < other.end && this.end >= other.end
}
/**
@ -227,6 +249,26 @@ class Range {
)
return [rangeUpToCursor, rangeAfterCursor]
}
/**
* Returns the intersection of this range with another range
*
* @param {Range} other - the other range
* @return {Range | null} the intersection or null if the intersection is empty
*/
intersect(other) {
if (this.contains(other)) {
return other
} else if (other.contains(this)) {
return this
} else if (other.overlapsStart(this)) {
return new Range(this.pos, other.end - this.start)
} else if (other.overlapsEnd(this)) {
return new Range(other.pos, this.end - other.start)
} else {
return null
}
}
}
module.exports = Range

View file

@ -193,4 +193,13 @@ describe('LazyStringFileData', function () {
expect(fileData.getStringLength()).to.equal(longString.length)
expect(fileData.getOperations()).to.have.length(1)
})
it('truncates its operations after being stored', async function () {
const testHash = File.EMPTY_FILE_HASH
const fileData = new LazyStringFileData(testHash, undefined, 0)
fileData.edit(new TextOperation().insert('abc'))
const stored = await fileData.store(this.blobStore)
expect(fileData.hash).to.equal(stored.hash)
expect(fileData.operations).to.deep.equal([])
})
})

View file

@ -1,4 +1,3 @@
// @ts-check
'use strict'
const { expect } = require('chai')
@ -449,4 +448,44 @@ describe('Range', function () {
expect(() => range.insertAt(16, 3)).to.throw()
})
})
describe('intersect', function () {
it('should handle partially overlapping ranges', function () {
const range1 = new Range(5, 10)
const range2 = new Range(3, 6)
const intersection1 = range1.intersect(range2)
expect(intersection1.pos).to.equal(5)
expect(intersection1.length).to.equal(4)
const intersection2 = range2.intersect(range1)
expect(intersection2.pos).to.equal(5)
expect(intersection2.length).to.equal(4)
})
it('should intersect with itself', function () {
const range = new Range(5, 10)
const intersection = range.intersect(range)
expect(intersection.pos).to.equal(5)
expect(intersection.length).to.equal(10)
})
it('should handle nested ranges', function () {
const range1 = new Range(5, 10)
const range2 = new Range(7, 2)
const intersection1 = range1.intersect(range2)
expect(intersection1.pos).to.equal(7)
expect(intersection1.length).to.equal(2)
const intersection2 = range2.intersect(range1)
expect(intersection2.pos).to.equal(7)
expect(intersection2.length).to.equal(2)
})
it('should handle disconnected ranges', function () {
const range1 = new Range(5, 10)
const range2 = new Range(20, 30)
const intersection1 = range1.intersect(range2)
expect(intersection1).to.be.null
const intersection2 = range2.intersect(range1)
expect(intersection2).to.be.null
})
})
})

View file

@ -107,7 +107,7 @@ describe('RetainOp', function () {
expect(op1.equals(new RetainOp(3))).to.be.true
})
it('cannot merge with another RetainOp if tracking info is different', function () {
it('cannot merge with another RetainOp if the tracking user is different', function () {
const op1 = new RetainOp(
4,
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
@ -120,14 +120,14 @@ describe('RetainOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
it('can merge with another RetainOp if tracking info is the same', function () {
it('can merge with another RetainOp if the tracking user is the same', function () {
const op1 = new RetainOp(
4,
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
)
const op2 = new RetainOp(
4,
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:01.000Z'))
)
op1.mergeWith(op2)
expect(
@ -310,7 +310,7 @@ describe('InsertOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
it('cannot merge with another InsertOp if tracking info is different', function () {
it('cannot merge with another InsertOp if tracking user is different', function () {
const op1 = new InsertOp(
'a',
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
@ -323,7 +323,7 @@ describe('InsertOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
it('can merge with another InsertOp if tracking and comment info is the same', function () {
it('can merge with another InsertOp if tracking user and comment info is the same', function () {
const op1 = new InsertOp(
'a',
new TrackingProps(
@ -338,7 +338,7 @@ describe('InsertOp', function () {
new TrackingProps(
'insert',
'user1',
new Date('2024-01-01T00:00:00.000Z')
new Date('2024-01-01T00:00:01.000Z')
),
['1', '2']
)

View file

@ -322,6 +322,47 @@ describe('TextOperation', function () {
new TextOperation().retain(4).remove(4).retain(3)
)
})
it('undoing a tracked delete restores the tracked changes', function () {
expectInverseToLeadToInitialState(
new StringFileData(
'the quick brown fox jumps over the lazy dog',
undefined,
[
{
range: { pos: 5, length: 5 },
tracking: {
ts: '2023-01-01T00:00:00.000Z',
type: 'insert',
userId: 'user1',
},
},
{
range: { pos: 12, length: 3 },
tracking: {
ts: '2023-01-01T00:00:00.000Z',
type: 'delete',
userId: 'user1',
},
},
{
range: { pos: 18, length: 5 },
tracking: {
ts: '2023-01-01T00:00:00.000Z',
type: 'insert',
userId: 'user1',
},
},
]
),
new TextOperation()
.retain(7)
.retain(13, {
tracking: new TrackingProps('delete', 'user1', new Date()),
})
.retain(23)
)
})
})
describe('compose', function () {

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
promise-utils
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
ranges-tracker
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
redis-wrapper
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
settings
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -1,10 +1,10 @@
stream-utils
--dependencies=None
--docker-repos=gcr.io/overleaf-ops
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -145,6 +145,24 @@ class LoggerStream extends Transform {
}
}
class MeteredStream extends Transform {
#Metrics
#metric
#labels
constructor(Metrics, metric, labels) {
super()
this.#Metrics = Metrics
this.#metric = metric
this.#labels = labels
}
_transform(chunk, encoding, callback) {
this.#Metrics.count(this.#metric, chunk.byteLength, 1, this.#labels)
callback(null, chunk)
}
}
// Export our classes
module.exports = {
@ -153,6 +171,7 @@ module.exports = {
LoggerStream,
LimitedStream,
TimeoutStream,
MeteredStream,
SizeExceededError,
AbortError,
}

4824
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -8,8 +8,8 @@
"@types/chai": "^4.3.0",
"@types/chai-as-promised": "^7.1.8",
"@types/mocha": "^10.0.6",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"@typescript-eslint/eslint-plugin": "^8.30.1",
"@typescript-eslint/parser": "^8.30.1",
"eslint": "^8.15.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0",
@ -18,28 +18,24 @@
"eslint-plugin-cypress": "^2.15.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-mocha": "^10.1.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-n": "^15.7.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^6.0.0",
"eslint-plugin-unicorn": "^56.0.0",
"prettier": "3.3.3",
"typescript": "^5.5.4"
"prettier": "3.6.2",
"typescript": "^5.8.3"
},
"engines": {
"npm": "11.4.2"
},
"overrides": {
"cross-env": {
"cross-spawn": "^7.0.6"
},
"fetch-mock": {
"path-to-regexp": "3.3.0"
},
"google-gax": {
"protobufjs": "^7.2.5"
},
"swagger-tools": {
"body-parser": "1.20.3",
"multer": "2.0.0",
"swagger-tools@0.10.4": {
"path-to-regexp": "3.3.0",
"qs": "6.13.0"
"body-parser": "1.20.3",
"multer": "2.0.1"
},
"request@2.88.2": {
"tough-cookie": "5.1.2"
}
},
"scripts": {

View file

@ -115,9 +115,3 @@ ENV LOG_LEVEL="info"
EXPOSE 80
ENTRYPOINT ["/sbin/my_init"]
# Store the revision
# ------------------
# This should be the last step to optimize docker image caching.
ARG MONOREPO_REVISION
RUN echo "monorepo-server-ce,$MONOREPO_REVISION" > /var/www/revisions.txt

View file

@ -24,6 +24,7 @@ build-base:
--cache-from $(OVERLEAF_BASE_BRANCH) \
--tag $(OVERLEAF_BASE_TAG) \
--tag $(OVERLEAF_BASE_BRANCH) \
--network=host \
$(MONOREPO_ROOT)
@ -33,12 +34,13 @@ build-community:
--build-arg BUILDKIT_INLINE_CACHE=1 \
--progress=plain \
--build-arg OVERLEAF_BASE_TAG \
--build-arg MONOREPO_REVISION \
--label "com.overleaf.ce.revision=$(MONOREPO_REVISION)" \
--cache-from $(OVERLEAF_LATEST) \
--cache-from $(OVERLEAF_BRANCH) \
--file Dockerfile \
--tag $(OVERLEAF_TAG) \
--tag $(OVERLEAF_BRANCH) \
--network=host \
$(MONOREPO_ROOT)
SHELLCHECK_OPTS = \

View file

@ -184,7 +184,10 @@ const settings = {
siteUrl: (siteUrl = process.env.OVERLEAF_SITE_URL || 'http://localhost'),
// Status page URL as displayed on the maintenance/500 pages.
statusPageUrl: process.env.OVERLEAF_STATUS_PAGE_URL,
statusPageUrl: process.env.OVERLEAF_STATUS_PAGE_URL ?
// Add https:// protocol prefix if not set (Allow plain-text http:// for Server Pro/CE).
(process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('http://') || process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('https://')) ? process.env.OVERLEAF_STATUS_PAGE_URL : `https://${process.env.OVERLEAF_STATUS_PAGE_URL}`
: undefined,
// The name this is used to describe your Overleaf Community Edition Installation
appName: process.env.OVERLEAF_APP_NAME || 'Overleaf Community Edition',

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "-------------------------"
echo "Deactivating old projects"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "-------------------------"
echo "Expiring deleted projects"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "----------------------"
echo "Expiring deleted users"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "---------------------------------"
echo "Flush all project-history changes"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "--------------------------"
echo "Flush project-history queue"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "-----------------------------------"
echo "Retry project-history errors (hard)"

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
set -eux
set -eu
echo "-----------------------------------"
echo "Retry project-history errors (soft)"

View file

@ -0,0 +1,28 @@
FROM sharelatex/sharelatex:5.5.0
# fix tls configuration in redis for history-v1
COPY pr_25168.patch .
RUN patch -p1 < pr_25168.patch && rm pr_25168.patch
# improve logging in history system
COPY pr_26086.patch .
RUN patch -p1 < pr_26086.patch && rm pr_26086.patch
# fix create-user.mjs script
COPY pr_26152.patch .
RUN patch -p1 < pr_26152.patch && rm pr_26152.patch
# check mongo featureCompatibilityVersion
COPY pr_26091.patch .
RUN patch -p1 < pr_26091.patch && rm pr_26091.patch
# update multer and tar-fs
RUN sed -i 's/"multer": "2.0.0"/"multer": "2.0.1"/g' package.json
RUN sed -i 's/"dockerode": "^4.0.5"/"dockerode": "^4.0.7"/g' services/clsi/package.json
RUN sed -i 's/"tar-fs": "^3.0.4"/"tar-fs": "^3.0.9"/g' services/clsi/package.json
RUN sed -i 's/199c5ff05bd375c508f4074498237baead7f5148/4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23/g' services/web/package.json
COPY package-lock.json.diff .
RUN patch package-lock.json < package-lock.json.diff
RUN npm install --omit=dev
RUN npm install @paralleldrive/cuid2@2.2.2 -w services/history-v1

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,19 @@
--- a/services/history-v1/config/custom-environment-variables.json
+++ b/services/history-v1/config/custom-environment-variables.json
@@ -50,12 +50,14 @@
"history": {
"host": "OVERLEAF_REDIS_HOST",
"password": "OVERLEAF_REDIS_PASS",
- "port": "OVERLEAF_REDIS_PORT"
+ "port": "OVERLEAF_REDIS_PORT",
+ "tls": "OVERLEAF_REDIS_TLS"
},
"lock": {
"host": "OVERLEAF_REDIS_HOST",
"password": "OVERLEAF_REDIS_PASS",
- "port": "OVERLEAF_REDIS_PORT"
+ "port": "OVERLEAF_REDIS_PORT",
+ "tls": "OVERLEAF_REDIS_TLS"
}
}
}

View file

@ -0,0 +1,200 @@
--- a/services/history-v1/api/controllers/project_import.js
+++ b/services/history-v1/api/controllers/project_import.js
@@ -35,6 +35,7 @@ async function importSnapshot(req, res) {
try {
snapshot = Snapshot.fromRaw(rawSnapshot)
} catch (err) {
+ logger.warn({ err, projectId }, 'failed to import snapshot')
return render.unprocessableEntity(res)
}
@@ -43,6 +44,7 @@ async function importSnapshot(req, res) {
historyId = await chunkStore.initializeProject(projectId, snapshot)
} catch (err) {
if (err instanceof chunkStore.AlreadyInitialized) {
+ logger.warn({ err, projectId }, 'already initialized')
return render.conflict(res)
} else {
throw err
--- a/services/history-v1/api/controllers/projects.js
+++ b/services/history-v1/api/controllers/projects.js
@@ -34,6 +34,7 @@ async function initializeProject(req, res, next) {
res.status(HTTPStatus.OK).json({ projectId })
} catch (err) {
if (err instanceof chunkStore.AlreadyInitialized) {
+ logger.warn({ err, projectId }, 'failed to initialize')
render.conflict(res)
} else {
throw err
@@ -242,11 +243,15 @@ async function createProjectBlob(req, res, next) {
const sizeLimit = new StreamSizeLimit(maxUploadSize)
await pipeline(req, sizeLimit, fs.createWriteStream(tmpPath))
if (sizeLimit.sizeLimitExceeded) {
+ logger.warn(
+ { projectId, expectedHash, maxUploadSize },
+ 'blob exceeds size threshold'
+ )
return render.requestEntityTooLarge(res)
}
const hash = await blobHash.fromFile(tmpPath)
if (hash !== expectedHash) {
- logger.debug({ hash, expectedHash }, 'Hash mismatch')
+ logger.warn({ projectId, hash, expectedHash }, 'Hash mismatch')
return render.conflict(res, 'File hash mismatch')
}
@@ -343,6 +348,10 @@ async function copyProjectBlob(req, res, next) {
targetBlobStore.getBlob(blobHash),
])
if (!sourceBlob) {
+ logger.warn(
+ { sourceProjectId, targetProjectId, blobHash },
+ 'missing source blob when copying across projects'
+ )
return render.notFound(res)
}
// Exit early if the blob exists in the target project.
--- a/services/history-v1/app.js
+++ b/services/history-v1/app.js
@@ -100,11 +100,13 @@ function setupErrorHandling() {
})
}
if (err.code === 'ENUM_MISMATCH') {
+ logger.warn({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
message: 'invalid enum value: ' + err.paramName,
})
}
if (err.code === 'REQUIRED') {
+ logger.warn({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
message: err.message,
})
--- a/services/project-history/app/js/HistoryStoreManager.js
+++ b/services/project-history/app/js/HistoryStoreManager.js
@@ -35,7 +35,10 @@ class StringStream extends stream.Readable {
_mocks.getMostRecentChunk = (projectId, historyId, callback) => {
const path = `projects/${historyId}/latest/history`
logger.debug({ projectId, historyId }, 'getting chunk from history service')
- _requestChunk({ path, json: true }, callback)
+ _requestChunk({ path, json: true }, (err, chunk) => {
+ if (err) return callback(OError.tag(err))
+ callback(null, chunk)
+ })
}
/**
@@ -54,7 +57,10 @@ export function getChunkAtVersion(projectId, historyId, version, callback) {
{ projectId, historyId, version },
'getting chunk from history service for version'
)
- _requestChunk({ path, json: true }, callback)
+ _requestChunk({ path, json: true }, (err, chunk) => {
+ if (err) return callback(OError.tag(err))
+ callback(null, chunk)
+ })
}
export function getMostRecentVersion(projectId, historyId, callback) {
@@ -68,8 +74,10 @@ export function getMostRecentVersion(projectId, historyId, callback) {
_.sortBy(chunk.chunk.history.changes || [], x => x.timestamp)
)
// find the latest project and doc versions in the chunk
- _getLatestProjectVersion(projectId, chunk, (err1, projectVersion) =>
+ _getLatestProjectVersion(projectId, chunk, (err1, projectVersion) => {
+ if (err1) err1 = OError.tag(err1)
_getLatestV2DocVersions(projectId, chunk, (err2, v2DocVersions) => {
+ if (err2) err2 = OError.tag(err2)
// return the project and doc versions
const projectStructureAndDocVersions = {
project: projectVersion,
@@ -83,7 +91,7 @@ export function getMostRecentVersion(projectId, historyId, callback) {
chunk
)
})
- )
+ })
})
}
@@ -211,7 +219,10 @@ export function getProjectBlob(historyId, blobHash, callback) {
logger.debug({ historyId, blobHash }, 'getting blob from history service')
_requestHistoryService(
{ path: `projects/${historyId}/blobs/${blobHash}` },
- callback
+ (err, blob) => {
+ if (err) return callback(OError.tag(err))
+ callback(null, blob)
+ }
)
}
@@ -277,7 +288,10 @@ function createBlobFromString(historyId, data, fileId, callback) {
(fsPath, cb) => {
_createBlob(historyId, fsPath, cb)
},
- callback
+ (err, hash) => {
+ if (err) return callback(OError.tag(err))
+ callback(null, hash)
+ }
)
}
@@ -330,7 +344,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
try {
ranges = HistoryBlobTranslator.createRangeBlobDataFromUpdate(update)
} catch (error) {
- return callback(error)
+ return callback(OError.tag(error))
}
createBlobFromString(
historyId,
@@ -338,7 +352,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
`project-${projectId}-doc-${update.doc}`,
(err, fileHash) => {
if (err) {
- return callback(err)
+ return callback(OError.tag(err))
}
if (ranges) {
createBlobFromString(
@@ -347,7 +361,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
`project-${projectId}-doc-${update.doc}-ranges`,
(err, rangesHash) => {
if (err) {
- return callback(err)
+ return callback(OError.tag(err))
}
logger.debug(
{ fileHash, rangesHash },
@@ -415,7 +429,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
},
(err, fileHash) => {
if (err) {
- return callback(err)
+ return callback(OError.tag(err))
}
if (update.hash && update.hash !== fileHash) {
logger.warn(
@@ -447,7 +461,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
},
(err, fileHash) => {
if (err) {
- return callback(err)
+ return callback(OError.tag(err))
}
logger.debug({ fileHash }, 'created empty blob for file')
callback(null, { file: fileHash })
@@ -520,7 +534,10 @@ export function initializeProject(historyId, callback) {
export function deleteProject(projectId, callback) {
_requestHistoryService(
{ method: 'DELETE', path: `projects/${projectId}` },
- callback
+ err => {
+ if (err) return callback(OError.tag(err))
+ callback(null)
+ }
)
}

View file

@ -0,0 +1,60 @@
--- a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
+++ b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
@@ -7,6 +7,7 @@ import {
const { ObjectId } = mongodb
const MIN_MONGO_VERSION = [6, 0]
+const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0]
async function main() {
let mongoClient
@@ -18,6 +19,7 @@ async function main() {
}
await checkMongoVersion(mongoClient)
+ await checkFeatureCompatibilityVersion(mongoClient)
try {
await testTransactions(mongoClient)
@@ -53,6 +55,41 @@ async function checkMongoVersion(mongoClient) {
}
}
+async function checkFeatureCompatibilityVersion(mongoClient) {
+ const {
+ featureCompatibilityVersion: { version },
+ } = await mongoClient
+ .db()
+ .admin()
+ .command({ getParameter: 1, featureCompatibilityVersion: 1 })
+ const [major, minor] = version.split('.').map(v => parseInt(v))
+ const [minMajor, minMinor] = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION
+
+ if (major < minMajor || (major === minMajor && minor < minMinor)) {
+ const minVersion = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION.join('.')
+ console.error(`
+The MongoDB server has featureCompatibilityVersion=${version}, but Overleaf requires at least version ${minVersion}.
+
+Open a mongo shell:
+- Overleaf Toolkit deployments: $ bin/mongo
+- Legacy docker-compose.yml deployments: $ docker exec -it mongo mongosh localhost/sharelatex
+
+In the mongo shell:
+> db.adminCommand( { setFeatureCompatibilityVersion: "${minMajor}.${minMinor}" } )
+
+Verify the new value:
+> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
+ ...
+ {
+ featureCompatibilityVersion: { version: ${minMajor}.${minMinor}' },
+...
+
+Aborting.
+`)
+ process.exit(1)
+ }
+}
+
main()
.then(() => {
console.error('Mongodb is up.')

View file

@ -0,0 +1,16 @@
--- a/services/web/modules/server-ce-scripts/scripts/create-user.mjs
+++ b/services/web/modules/server-ce-scripts/scripts/create-user.mjs
@@ -48,3 +48,13 @@ Please visit the following URL to set a password for ${email} and log in:
)
})
}
+
+if (filename === process.argv[1]) {
+ try {
+ await main()
+ process.exit(0)
+ } catch (error) {
+ console.error({ error })
+ process.exit(1)
+ }
+}

View file

@ -0,0 +1,27 @@
FROM sharelatex/sharelatex:5.5.1
# https://github.com/overleaf/internal/pull/25944
# Removed changes to services/web/frontend/js/features/ide-redesign/components/rail.tsx due to incompatibility with 5.5.1
COPY pr_25944.patch .
RUN patch -p1 < pr_25944.patch && rm pr_25944.patch
# https://github.com/overleaf/internal/pull/26637
# Removed changes to server-ce/test/create-and-compile-project.spec.ts and server-ce/test/helpers/compile.ts due to incompatibility with 5.5.1
COPY pr_26637.patch .
RUN patch -p1 < pr_26637.patch && rm pr_26637.patch
# https://github.com/overleaf/internal/pull/26783
COPY pr_26783.patch .
RUN patch -p1 < pr_26783.patch && rm pr_26783.patch
# https://github.com/overleaf/internal/pull/26697
COPY pr_26697.patch .
RUN patch -p1 < pr_26697.patch && rm pr_26697.patch
# Apply security updates to base image
RUN apt update && apt install -y linux-libc-dev \
&& unattended-upgrade --verbose --no-minimal-upgrade-steps \
&& rm -rf /var/lib/apt/lists/*
# Recompile frontend assets
RUN node genScript compile | bash

View file

@ -0,0 +1,219 @@
diff --git a/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx b/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
index 20e157dfee9..ad943772d0d 100644
--- a/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
+++ b/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
@@ -4,10 +4,16 @@ import { ChangesUsersProvider } from './changes-users-context'
import { TrackChangesStateProvider } from './track-changes-state-context'
import { ThreadsProvider } from './threads-context'
import { ReviewPanelViewProvider } from './review-panel-view-context'
+import { useProjectContext } from '@/shared/context/project-context'
export const ReviewPanelProviders: FC<React.PropsWithChildren> = ({
children,
}) => {
+ const { features } = useProjectContext()
+ if (!features.trackChangesVisible) {
+ return children
+ }
+
return (
<ReviewPanelViewProvider>
<ChangesUsersProvider>
diff --git a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
index 8606fb11fad..e80fb037116 100644
--- a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
+++ b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
@@ -176,24 +176,34 @@ export default function AddCollaborators({ readOnly }: { readOnly?: boolean }) {
])
const privilegeOptions = useMemo(() => {
- return [
+ const options: {
+ key: string
+ label: string
+ description?: string | null
+ }[] = [
{
key: 'readAndWrite',
label: t('editor'),
},
- {
+ ]
+
+ if (features.trackChangesVisible) {
+ options.push({
key: 'review',
label: t('reviewer'),
description: !features.trackChanges
? t('comment_only_upgrade_for_track_changes')
: null,
- },
- {
- key: 'readOnly',
- label: t('viewer'),
- },
- ]
- }, [features.trackChanges, t])
+ })
+ }
+
+ options.push({
+ key: 'readOnly',
+ label: t('viewer'),
+ })
+
+ return options
+ }, [features.trackChanges, features.trackChangesVisible, t])
return (
<OLForm className="add-collabs">
diff --git a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
index 6d806968b12..9f24cddc4ad 100644
--- a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
+++ b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
@@ -244,14 +244,22 @@ function SelectPrivilege({
const { features } = useProjectContext()
const privileges = useMemo(
- (): Privilege[] => [
- { key: 'owner', label: t('make_owner') },
- { key: 'readAndWrite', label: t('editor') },
- { key: 'review', label: t('reviewer') },
- { key: 'readOnly', label: t('viewer') },
- { key: 'removeAccess', label: t('remove_access') },
- ],
- [t]
+ (): Privilege[] =>
+ features.trackChangesVisible
+ ? [
+ { key: 'owner', label: t('make_owner') },
+ { key: 'readAndWrite', label: t('editor') },
+ { key: 'review', label: t('reviewer') },
+ { key: 'readOnly', label: t('viewer') },
+ { key: 'removeAccess', label: t('remove_access') },
+ ]
+ : [
+ { key: 'owner', label: t('make_owner') },
+ { key: 'readAndWrite', label: t('editor') },
+ { key: 'readOnly', label: t('viewer') },
+ { key: 'removeAccess', label: t('remove_access') },
+ ],
+ [features.trackChangesVisible, t]
)
const downgradedPseudoPrivilege: Privilege = {
diff --git a/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx b/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
index c1808cbb301..4bdfe2682c8 100644
--- a/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
+++ b/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
@@ -18,6 +18,7 @@ import {
} from './codemirror-context'
import MathPreviewTooltip from './math-preview-tooltip'
import { useToolbarMenuBarEditorCommands } from '@/features/ide-redesign/hooks/use-toolbar-menu-editor-commands'
+import { useProjectContext } from '@/shared/context/project-context'
// TODO: remove this when definitely no longer used
export * from './codemirror-context'
@@ -67,6 +68,7 @@ function CodeMirrorEditor() {
function CodeMirrorEditorComponents() {
useToolbarMenuBarEditorCommands()
+ const { features } = useProjectContext()
return (
<ReviewPanelProviders>
@@ -83,8 +85,8 @@ function CodeMirrorEditorComponents() {
<CodeMirrorCommandTooltip />
<MathPreviewTooltip />
- <ReviewTooltipMenu />
- <ReviewPanelNew />
+ {features.trackChangesVisible && <ReviewTooltipMenu />}
+ {features.trackChangesVisible && <ReviewPanelNew />}
{sourceEditorComponents.map(
({ import: { default: Component }, path }) => (
diff --git a/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx b/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
index e70663683fc..c5d9f3d3e47 100644
--- a/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
+++ b/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
@@ -14,6 +14,7 @@ import { LegacyTableDropdown } from './table-inserter-dropdown-legacy'
import { withinFormattingCommand } from '@/features/source-editor/utils/tree-operations/formatting'
import { isSplitTestEnabled } from '@/utils/splitTestUtils'
import { isMac } from '@/shared/utils/os'
+import { useProjectContext } from '@/shared/context/project-context'
export const ToolbarItems: FC<{
state: EditorState
@@ -31,6 +32,7 @@ export const ToolbarItems: FC<{
const { t } = useTranslation()
const { toggleSymbolPalette, showSymbolPalette, writefullInstance } =
useEditorContext()
+ const { features } = useProjectContext()
const isActive = withinFormattingCommand(state)
const symbolPaletteAvailable = getMeta('ol-symbolPaletteAvailable')
@@ -127,13 +129,15 @@ export const ToolbarItems: FC<{
command={commands.wrapInHref}
icon="add_link"
/>
- <ToolbarButton
- id="toolbar-add-comment"
- label={t('add_comment')}
- disabled={state.selection.main.empty}
- command={commands.addComment}
- icon="add_comment"
- />
+ {features.trackChangesVisible && (
+ <ToolbarButton
+ id="toolbar-add-comment"
+ label={t('add_comment')}
+ disabled={state.selection.main.empty}
+ command={commands.addComment}
+ icon="add_comment"
+ />
+ )}
<ToolbarButton
id="toolbar-ref"
label={t('toolbar_insert_cross_reference')}
diff --git a/services/web/test/frontend/features/review-panel/review-panel.spec.tsx b/services/web/test/frontend/features/review-panel/review-panel.spec.tsx
index d6677878108..58ac3e443da 100644
--- a/services/web/test/frontend/features/review-panel/review-panel.spec.tsx
+++ b/services/web/test/frontend/features/review-panel/review-panel.spec.tsx
@@ -181,6 +181,7 @@ describe('<ReviewPanel />', function () {
removeChangeIds,
},
},
+ projectFeatures: { trackChangesVisible: true },
})
cy.wrap(scope).as('scope')
@@ -626,7 +627,7 @@ describe('<ReviewPanel /> for free users', function () {
function mountEditor(ownerId = USER_ID) {
const scope = mockScope(undefined, {
permissions: { write: true, trackedWrite: false, comment: true },
- projectFeatures: { trackChanges: false },
+ projectFeatures: { trackChanges: false, trackChangesVisible: true },
projectOwner: {
_id: ownerId,
},
diff --git a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
index b86207fb0f7..dfce8134d1c 100644
--- a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
+++ b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
@@ -694,6 +694,7 @@ describe('<ShareProjectModal/>', function () {
features: {
collaborators: 0,
compileGroup: 'standard',
+ trackChangesVisible: true,
},
},
},
@@ -723,6 +724,7 @@ describe('<ShareProjectModal/>', function () {
...project,
features: {
collaborators: 1,
+ trackChangesVisible: true,
},
members: [
{

View file

@ -0,0 +1,86 @@
diff --git a/services/clsi/app/js/LocalCommandRunner.js b/services/clsi/app/js/LocalCommandRunner.js
index ce274733585..aa62825443c 100644
--- a/services/clsi/app/js/LocalCommandRunner.js
+++ b/services/clsi/app/js/LocalCommandRunner.js
@@ -54,6 +54,7 @@ module.exports = CommandRunner = {
cwd: directory,
env,
stdio: ['pipe', 'pipe', 'ignore'],
+ detached: true,
})
let stdout = ''
diff --git a/services/clsi/test/acceptance/js/StopCompile.js b/services/clsi/test/acceptance/js/StopCompile.js
new file mode 100644
index 00000000000..103a70f37d7
--- /dev/null
+++ b/services/clsi/test/acceptance/js/StopCompile.js
@@ -0,0 +1,47 @@
+const Client = require('./helpers/Client')
+const ClsiApp = require('./helpers/ClsiApp')
+const { expect } = require('chai')
+
+describe('Stop compile', function () {
+ before(function (done) {
+ this.request = {
+ options: {
+ timeout: 100,
+ }, // seconds
+ resources: [
+ {
+ path: 'main.tex',
+ content: `\
+\\documentclass{article}
+\\begin{document}
+\\def\\x{Hello!\\par\\x}
+\\x
+\\end{document}\
+`,
+ },
+ ],
+ }
+ this.project_id = Client.randomId()
+ ClsiApp.ensureRunning(() => {
+ // start the compile in the background
+ Client.compile(this.project_id, this.request, (error, res, body) => {
+ this.compileResult = { error, res, body }
+ })
+ // wait for 1 second before stopping the compile
+ setTimeout(() => {
+ Client.stopCompile(this.project_id, (error, res, body) => {
+ this.stopResult = { error, res, body }
+ setTimeout(done, 1000) // allow time for the compile request to terminate
+ })
+ }, 1000)
+ })
+ })
+
+ it('should force a compile response with an error status', function () {
+ expect(this.stopResult.error).to.be.null
+ expect(this.stopResult.res.statusCode).to.equal(204)
+ expect(this.compileResult.res.statusCode).to.equal(200)
+ expect(this.compileResult.body.compile.status).to.equal('terminated')
+ expect(this.compileResult.body.compile.error).to.equal('terminated')
+ })
+})
diff --git a/services/clsi/test/acceptance/js/helpers/Client.js b/services/clsi/test/acceptance/js/helpers/Client.js
index a0bdce734f3..49bf7390c6f 100644
--- a/services/clsi/test/acceptance/js/helpers/Client.js
+++ b/services/clsi/test/acceptance/js/helpers/Client.js
@@ -42,6 +42,16 @@ module.exports = Client = {
)
},
+ stopCompile(projectId, callback) {
+ if (callback == null) {
+ callback = function () {}
+ }
+ return request.post(
+ { url: `${this.host}/project/${projectId}/compile/stop` },
+ callback
+ )
+ },
+
clearCache(projectId, callback) {
if (callback == null) {
callback = function () {}

View file

@ -0,0 +1,172 @@
diff --git a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
index 8f3b3a8e5d0..f8c8014e1c0 100644
--- a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
+++ b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
@@ -55,7 +55,11 @@ export function ProjectListDsNav() {
return (
<div className="project-ds-nav-page website-redesign">
- <DefaultNavbar {...navbarProps} customLogo={overleafLogo} showCloseIcon />
+ <DefaultNavbar
+ {...navbarProps}
+ overleafLogo={overleafLogo}
+ showCloseIcon
+ />
<main className="project-list-wrapper">
<SidebarDsNav />
<div className="project-ds-nav-content-and-messages">
diff --git a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
index 2480b7f061f..8e5429dbde6 100644
--- a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
+++ b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
@@ -1,4 +1,4 @@
-import { useState } from 'react'
+import React, { useState } from 'react'
import { sendMB } from '@/infrastructure/event-tracking'
import { useTranslation } from 'react-i18next'
import { Button, Container, Nav, Navbar } from 'react-bootstrap'
@@ -13,9 +13,15 @@ import MaterialIcon from '@/shared/components/material-icon'
import { useContactUsModal } from '@/shared/hooks/use-contact-us-modal'
import { UserProvider } from '@/shared/context/user-context'
import { X } from '@phosphor-icons/react'
+import overleafWhiteLogo from '@/shared/svgs/overleaf-white.svg'
+import overleafBlackLogo from '@/shared/svgs/overleaf-black.svg'
+import type { CSSPropertiesWithVariables } from '../../../../../../../types/css-properties-with-variables'
-function DefaultNavbar(props: DefaultNavbarMetadata) {
+function DefaultNavbar(
+ props: DefaultNavbarMetadata & { overleafLogo?: string }
+) {
const {
+ overleafLogo,
customLogo,
title,
canDisplayAdminMenu,
@@ -49,10 +55,20 @@ function DefaultNavbar(props: DefaultNavbarMetadata) {
className="navbar-default navbar-main"
expand="lg"
onToggle={expanded => setExpanded(expanded)}
+ style={
+ {
+ '--navbar-brand-image-default-url': `url("${overleafWhiteLogo}")`,
+ '--navbar-brand-image-redesign-url': `url("${overleafBlackLogo}")`,
+ } as CSSPropertiesWithVariables
+ }
>
<Container className="navbar-container" fluid>
<div className="navbar-header">
- <HeaderLogoOrTitle title={title} customLogo={customLogo} />
+ <HeaderLogoOrTitle
+ title={title}
+ overleafLogo={overleafLogo}
+ customLogo={customLogo}
+ />
{enableUpgradeButton ? (
<Button
as="a"
diff --git a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/header-logo-or-title.tsx b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/header-logo-or-title.tsx
index 44500f1b826..3eefc8e2d1c 100644
--- a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/header-logo-or-title.tsx
+++ b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/header-logo-or-title.tsx
@@ -2,11 +2,13 @@ import type { DefaultNavbarMetadata } from '@/features/ui/components/types/defau
import getMeta from '@/utils/meta'
export default function HeaderLogoOrTitle({
+ overleafLogo,
customLogo,
title,
-}: Pick<DefaultNavbarMetadata, 'customLogo' | 'title'>) {
+}: Pick<DefaultNavbarMetadata, 'customLogo' | 'title'> & {
+ overleafLogo?: string
+}) {
const { appName } = getMeta('ol-ExposedSettings')
-
if (customLogo) {
return (
// eslint-disable-next-line jsx-a11y/anchor-has-content
@@ -24,9 +26,16 @@ export default function HeaderLogoOrTitle({
</a>
)
} else {
+ const style = overleafLogo
+ ? {
+ style: {
+ backgroundImage: `url("${overleafLogo}")`,
+ },
+ }
+ : null
return (
// eslint-disable-next-line jsx-a11y/anchor-has-content
- <a href="/" aria-label={appName} className="navbar-brand" />
+ <a href="/" aria-label={appName} className="navbar-brand" {...style} />
)
}
}
diff --git a/services/web/frontend/js/shared/svgs/overleaf-black.svg b/services/web/frontend/js/shared/svgs/overleaf-black.svg
new file mode 100644
index 00000000000..ea0678438ba
--- /dev/null
+++ b/services/web/frontend/js/shared/svgs/overleaf-black.svg
@@ -0,0 +1,9 @@
+<svg width="129" height="38" viewBox="0 0 129 38" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_2579_355" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="72" height="38">
+<path d="M71.7643 37.6327H0.0244141V0.0717773H71.7643V37.6327Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_2579_355)">
+<path d="M47.2509 26.4555C47.3948 27.7507 47.8985 28.7821 48.81 29.5257C49.6974 30.2692 50.8487 30.653 52.2638 30.653C53.1993 30.653 54.0387 30.4611 54.7823 30.0773C55.5258 29.6696 56.1255 29.1419 56.5572 28.4223H61.0664C60.2989 30.3891 59.1716 31.9002 57.6365 33.0035C56.1255 34.0829 54.3506 34.6345 52.3598 34.6345C51.0166 34.6345 49.7934 34.3947 48.666 33.915C47.5387 33.4352 46.5314 32.7397 45.6199 31.8043C44.7804 30.9168 44.1089 29.9094 43.6531 28.7341C43.1974 27.5589 42.9576 26.3836 42.9576 25.1603C42.9576 23.9131 43.1734 22.7138 43.6052 21.6105C44.0369 20.5072 44.6605 19.4998 45.5 18.6124C46.4114 17.629 47.4668 16.8854 48.6181 16.3817C49.7694 15.8541 50.9686 15.5902 52.1919 15.5902C53.7509 15.5902 55.214 15.95 56.5572 16.6456C57.9004 17.3651 59.0517 18.3485 60.0111 19.6437C60.5867 20.4113 61.0185 21.2747 61.3063 22.2581C61.5941 23.2175 61.714 24.3209 61.714 25.5681C61.714 25.664 61.714 25.8079 61.69 26.0238C61.69 26.2397 61.6661 26.3836 61.6661 26.4795H47.2509V26.4555ZM57.2048 23.1216C56.845 21.9223 56.2454 21.0109 55.4059 20.3873C54.5664 19.7637 53.4871 19.4519 52.2159 19.4519C51.0886 19.4519 50.1052 19.7876 49.2177 20.4592C48.3303 21.1308 47.7306 22.0183 47.4188 23.1216H57.2048ZM71.7638 19.7637C70.1328 19.8836 69.0055 20.3153 68.3579 21.0349C67.7103 21.7544 67.3985 23.0496 67.3985 24.9205V34.1068H63.2011V16.1179H67.1347V18.2046C67.7583 17.3891 68.4539 16.8135 69.2214 16.4297C69.9649 16.0459 70.8284 15.8541 71.7638 15.8541V19.7637ZM32.428 1.24705C27.3432 -0.743722 8.9465 -1.46328 8.92251 9.52196C3.54982 12.9519 0 18.5404 0 24.5367C0 31.7803 5.87638 37.6567 13.1199 37.6567C20.3635 37.6567 26.2399 31.7803 26.2399 24.5367C26.2399 18.9482 22.738 14.1511 17.797 12.2803C16.8376 11.9205 14.7749 11.2729 13.1439 11.4168C10.7934 12.9039 7.91513 15.974 6.57196 19.0441C8.58672 16.6216 11.7288 15.5662 14.5351 16.022C18.6365 16.6936 21.7786 20.2434 21.7786 24.5607C21.7786 29.3338 17.917 33.1954 13.1439 33.1954C10.5055 33.1954 8.15498 32.0201 6.57196 30.1733C4.19742 27.415 3.59779 24.4408 4.07749 21.5386C5.73247 11.3688 17.797 5.58838 26.7675 3.35775C23.8413 4.9168 18.5646 7.45923 14.8708 10.2175C25.6402 14.391 27.3911 5.30056 32.428 1.24705ZM36.7934 34.1308H33.5074L26.6716 16.1179H31.1328L35.3303 28.0865L39.6476 16.1179H43.9889L36.7934 34.1308Z" fill="#1B222C"/>
+</g>
+<path d="M83.6127 26.4556C83.7567 27.7508 84.2843 28.7822 85.1718 29.5257C86.0592 30.2692 87.2105 30.653 88.6257 30.653C89.5611 30.653 90.4006 30.4611 91.1441 30.0774C91.8877 29.6696 92.4873 29.1419 92.919 28.4224H97.4282C96.6607 30.3892 95.5334 31.9002 93.9984 33.0036C92.4873 34.0829 90.7124 34.6346 88.7216 34.6346C87.3784 34.6346 86.1552 34.3947 85.0279 33.915C83.9006 33.4353 82.8932 32.7397 81.9817 31.8043C81.1423 30.9168 80.4707 29.9095 80.015 28.7342C79.5353 27.5829 79.3194 26.3836 79.3194 25.1604C79.3194 23.9131 79.5353 22.7139 79.967 21.6106C80.3987 20.5072 81.0223 19.4999 81.8618 18.6124C82.7733 17.629 83.8286 16.8855 84.9799 16.3818C86.1312 15.8541 87.3305 15.5903 88.5537 15.5903C90.1128 15.5903 91.5758 15.95 92.919 16.6456C94.2622 17.3652 95.4135 18.3486 96.3729 19.6438C96.9485 20.4113 97.3803 21.2748 97.6681 22.2582C97.9559 23.2176 98.0758 24.3209 98.0758 25.5681C98.0758 25.6641 98.0758 25.808 98.0519 26.0238C98.0519 26.2397 98.0279 26.3836 98.0279 26.4796H83.6127V26.4556ZM93.5426 23.1216C93.1829 21.9224 92.5832 21.0109 91.7437 20.3873C90.9043 19.7637 89.8249 19.4519 88.5537 19.4519C87.4264 19.4519 86.443 19.7877 85.5556 20.4593C84.6681 21.1309 84.0685 22.0183 83.7567 23.1216H93.5426ZM114.698 34.1309V31.9242C114.194 32.8117 113.498 33.4833 112.587 33.915C111.675 34.3467 110.5 34.5626 109.085 34.5626C106.423 34.5626 104.192 33.6512 102.417 31.8283C100.642 30.0054 99.7308 27.7508 99.7308 25.0644C99.7308 23.7932 99.9467 22.594 100.402 21.4667C100.858 20.3393 101.482 19.332 102.321 18.4685C103.209 17.5091 104.216 16.8135 105.295 16.3578C106.375 15.9021 107.622 15.6862 108.989 15.6862C110.308 15.6862 111.436 15.9021 112.371 16.3338C113.306 16.7655 114.074 17.4371 114.65 18.3246V16.1419H118.727V34.1548H114.698V34.1309ZM104.024 24.9685C104.024 26.4796 104.528 27.7508 105.535 28.7822C106.543 29.8135 107.766 30.3172 109.229 30.3172C110.548 30.3172 111.699 29.8135 112.707 28.7822C113.714 27.7508 114.218 26.5515 114.218 25.1844C114.218 23.7213 113.714 22.474 112.707 21.4187C111.699 20.3633 110.524 19.8357 109.157 19.8357C107.742 19.8357 106.543 20.3393 105.535 21.3227C104.528 22.3301 104.024 23.5294 104.024 24.9685ZM129.904 16.1179V19.8596H126.882V34.1309H122.829V19.8596H120.694V16.1179H122.709V15.6382C122.709 13.7434 123.236 12.3283 124.268 11.3929C125.323 10.4574 126.906 10.0017 129.041 10.0017C129.113 10.0017 129.257 10.0017 129.449 10.0257C129.64 10.0257 129.784 10.0497 129.904 10.0497V13.8154H129.616C128.657 13.8154 127.985 13.9833 127.578 14.2711C127.17 14.5829 126.954 15.0866 126.954 15.8301V16.1659H129.904V16.1179ZM73.5869 34.1309H77.6884V10.2895H73.5869V34.1309Z" fill="#1B222C"/>
+</svg>
diff --git a/services/web/frontend/js/shared/svgs/overleaf-white.svg b/services/web/frontend/js/shared/svgs/overleaf-white.svg
new file mode 100644
index 00000000000..2ced81aa46d
--- /dev/null
+++ b/services/web/frontend/js/shared/svgs/overleaf-white.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 542 157" enable-background="new 0 0 542 157"><style>.st0{filter:url(#Adobe_OpacityMaskFilter);} .st1{fill:#FFFFFF;} .st2{mask:url(#mask-2);fill:#FFFFFF;}</style><g id="Page-1"><g id="Overleaf"><g id="Group-3"><defs><filter id="Adobe_OpacityMaskFilter" filterUnits="userSpaceOnUse" x="0" y=".3" width="299.2" height="156.7"><feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"/></filter></defs><mask maskUnits="userSpaceOnUse" x="0" y=".3" width="299.2" height="156.7" id="mask-2"><g class="st0"><path id="path-1" class="st1" d="M299.2 156.9H.1V.3h299.1z"/></g></mask><path id="Fill-1" class="st2" d="M197 110.3c.6 5.4 2.7 9.7 6.5 12.8 3.7 3.1 8.5 4.7 14.4 4.7 3.9 0 7.4-.8 10.5-2.4 3.1-1.7 5.6-3.9 7.4-6.9h18.8c-3.2 8.2-7.9 14.5-14.3 19.1-6.3 4.5-13.7 6.8-22 6.8-5.6 0-10.7-1-15.4-3-4.7-2-8.9-4.9-12.7-8.8-3.5-3.7-6.3-7.9-8.2-12.8s-2.9-9.8-2.9-14.9c0-5.2.9-10.2 2.7-14.8 1.8-4.6 4.4-8.8 7.9-12.5 3.8-4.1 8.2-7.2 13-9.3 4.8-2.2 9.8-3.3 14.9-3.3 6.5 0 12.6 1.5 18.2 4.4 5.6 3 10.4 7.1 14.4 12.5 2.4 3.2 4.2 6.8 5.4 10.9 1.2 4 1.7 8.6 1.7 13.8 0 .4 0 1-.1 1.9 0 .9-.1 1.5-.1 1.9H197v-.1zm41.5-13.9c-1.5-5-4-8.8-7.5-11.4-3.5-2.6-8-3.9-13.3-3.9-4.7 0-8.8 1.4-12.5 4.2-3.7 2.8-6.2 6.5-7.5 11.1h40.8zm60.7-14c-6.8.5-11.5 2.3-14.2 5.3-2.7 3-4 8.4-4 16.2v38.3h-17.5v-75h16.4v8.7c2.6-3.4 5.5-5.8 8.7-7.4 3.1-1.6 6.7-2.4 10.6-2.4v16.3zm-164-77.2C114-3.1 37.3-6.1 37.2 39.7 14.8 54 0 77.3 0 102.3 0 132.5 24.5 157 54.7 157c30.2 0 54.7-24.5 54.7-54.7 0-23.3-14.6-43.3-35.2-51.1-4-1.5-12.6-4.2-19.4-3.6-9.8 6.2-21.8 19-27.4 31.8 8.4-10.1 21.5-14.5 33.2-12.6 17.1 2.8 30.2 17.6 30.2 35.6 0 19.9-16.1 36-36 36-11 0-20.8-4.9-27.4-12.6-9.9-11.5-12.4-23.9-10.4-36 6.9-42.4 57.2-66.5 94.6-75.8C99.4 20.5 77.4 31.1 62 42.6c44.9 17.4 52.2-20.5 73.2-37.4zm18.2 137.1h-13.7l-28.5-75.1h18.6l17.5 49.9 18-49.9h18.1l-30 75.1z"/></g><path id="Fill-4" class="st1" d="M348.6 110.3c.6 5.4 2.8 9.7 6.5 12.8 3.7 3.1 8.5 4.7 14.4 4.7 3.9 0 7.4-.8 10.5-2.4 3.1-1.7 5.6-3.9 7.4-6.9h18.8c-3.2 8.2-7.9 14.5-14.3 19.1-6.3 4.5-13.7 6.8-22 6.8-5.6 0-10.7-1-15.4-3-4.7-2-8.9-4.9-12.7-8.8-3.5-3.7-6.3-7.9-8.2-12.8-2-4.8-2.9-9.8-2.9-14.9 0-5.2.9-10.2 2.7-14.8 1.8-4.6 4.4-8.8 7.9-12.5 3.8-4.1 8.2-7.2 13-9.3 4.8-2.2 9.8-3.3 14.9-3.3 6.5 0 12.6 1.5 18.2 4.4 5.6 3 10.4 7.1 14.4 12.5 2.4 3.2 4.2 6.8 5.4 10.9 1.2 4 1.7 8.6 1.7 13.8 0 .4 0 1-.1 1.9 0 .9-.1 1.5-.1 1.9h-60.1v-.1zM390 96.4c-1.5-5-4-8.8-7.5-11.4-3.5-2.6-8-3.9-13.3-3.9-4.7 0-8.8 1.4-12.5 4.2-3.7 2.8-6.2 6.5-7.5 11.1H390zm88.2 45.9v-9.2c-2.1 3.7-5 6.5-8.8 8.3-3.8 1.8-8.7 2.7-14.6 2.7-11.1 0-20.4-3.8-27.8-11.4-7.4-7.6-11.2-17-11.2-28.2 0-5.3.9-10.3 2.8-15 1.9-4.7 4.5-8.9 8-12.5 3.7-4 7.9-6.9 12.4-8.8s9.7-2.8 15.4-2.8c5.5 0 10.2.9 14.1 2.7 3.9 1.8 7.1 4.6 9.5 8.3v-9.1h17v75.1h-16.8v-.1zm-44.5-38.2c0 6.3 2.1 11.6 6.3 15.9 4.2 4.3 9.3 6.4 15.4 6.4 5.5 0 10.3-2.1 14.5-6.4 4.2-4.3 6.3-9.3 6.3-15 0-6.1-2.1-11.3-6.3-15.7-4.2-4.4-9.1-6.6-14.8-6.6-5.9 0-10.9 2.1-15.1 6.2-4.2 4.2-6.3 9.2-6.3 15.2zm107.9-36.9v15.6H529v59.5h-16.9V82.8h-8.9V67.2h8.4v-2c0-7.9 2.2-13.8 6.5-17.7 4.4-3.9 11-5.8 19.9-5.8.3 0 .9 0 1.7.1.8 0 1.4.1 1.9.1v15.7h-1.2c-4 0-6.8.7-8.5 1.9-1.7 1.3-2.6 3.4-2.6 6.5v1.4h12.3v-.2zm-234.8 75.1h17.1V42.9h-17.1v99.4z"/></g></g></svg>
\ No newline at end of file
diff --git a/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss b/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
index 5d28341cf53..dd0600ed15d 100644
--- a/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
+++ b/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
@@ -8,7 +8,10 @@
--navbar-padding-h: var(--spacing-05);
--navbar-padding: 0 var(--navbar-padding-h);
--navbar-brand-width: 130px;
- --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-white.svg');
+ --navbar-brand-image-url: var(
+ --navbar-brand-image-default-url,
+ url('../../../../public/img/ol-brand/overleaf-white.svg')
+ );
// Title, when used instead of a logo
--navbar-title-font-size: var(--font-size-05);
diff --git a/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss b/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
index 3b984bb6f36..a8855ea1ca3 100644
--- a/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
+++ b/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
@@ -216,7 +216,10 @@
.website-redesign .navbar-default {
--navbar-title-color: var(--content-primary);
--navbar-title-color-hover: var(--content-secondary);
- --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-black.svg');
+ --navbar-brand-image-url: var(
+ --navbar-brand-image-redesign-url,
+ url('../../../../public/img/ol-brand/overleaf-black.svg')
+ );
--navbar-subdued-color: var(--content-primary);
--navbar-subdued-hover-bg: var(--bg-dark-primary);
--navbar-subdued-hover-color: var(--content-primary-dark);
diff --git a/services/web/types/css-properties-with-variables.tsx b/services/web/types/css-properties-with-variables.tsx
new file mode 100644
index 00000000000..fe0e85902a6
--- /dev/null
+++ b/services/web/types/css-properties-with-variables.tsx
@@ -0,0 +1,4 @@
+import { CSSProperties } from 'react'
+
+export type CSSPropertiesWithVariables = CSSProperties &
+ Record<`--${string}`, number | string>
--
2.43.0

View file

@ -0,0 +1,58 @@
diff --git a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
index 29f5e7ffd26..46be91a1d9c 100644
--- a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
+++ b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
@@ -9,6 +9,34 @@ const { ObjectId } = mongodb
const MIN_MONGO_VERSION = [6, 0]
const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0]
+// Allow ignoring admin check failures via an environment variable
+const OVERRIDE_ENV_VAR_NAME = 'ALLOW_MONGO_ADMIN_CHECK_FAILURES'
+
+function shouldSkipAdminChecks() {
+ return process.env[OVERRIDE_ENV_VAR_NAME] === 'true'
+}
+
+function handleUnauthorizedError(err, feature) {
+ if (
+ err instanceof mongodb.MongoServerError &&
+ err.codeName === 'Unauthorized'
+ ) {
+ console.warn(`Warning: failed to check ${feature} (not authorised)`)
+ if (!shouldSkipAdminChecks()) {
+ console.error(
+ `Please ensure the MongoDB user has the required admin permissions, or\n` +
+ `set the environment variable ${OVERRIDE_ENV_VAR_NAME}=true to ignore this check.`
+ )
+ process.exit(1)
+ }
+ console.warn(
+ `Ignoring ${feature} check failure (${OVERRIDE_ENV_VAR_NAME}=${process.env[OVERRIDE_ENV_VAR_NAME]})`
+ )
+ } else {
+ throw err
+ }
+}
+
async function main() {
let mongoClient
try {
@@ -18,8 +46,16 @@ async function main() {
throw err
}
- await checkMongoVersion(mongoClient)
- await checkFeatureCompatibilityVersion(mongoClient)
+ try {
+ await checkMongoVersion(mongoClient)
+ } catch (err) {
+ handleUnauthorizedError(err, 'MongoDB version')
+ }
+ try {
+ await checkFeatureCompatibilityVersion(mongoClient)
+ } catch (err) {
+ handleUnauthorizedError(err, 'MongoDB feature compatibility version')
+ }
try {
await testTransactions(mongoClient)

View file

@ -1,4 +1,4 @@
FROM node:22.15.1
FROM node:22.17.0
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \
&& echo \
"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \

View file

@ -6,8 +6,8 @@ all: test-e2e
# Notable the container labels com.docker.compose.project.working_dir and com.docker.compose.project.config_files need to match when creating containers from the docker host (how you started things) and from host-admin (how tests reconfigure the instance).
export PWD = $(shell pwd)
export TEX_LIVE_DOCKER_IMAGE ?= gcr.io/overleaf-ops/texlive-full:2023.1
export ALL_TEX_LIVE_DOCKER_IMAGES ?= gcr.io/overleaf-ops/texlive-full:2023.1,gcr.io/overleaf-ops/texlive-full:2022.1
export TEX_LIVE_DOCKER_IMAGE ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2023.1
export ALL_TEX_LIVE_DOCKER_IMAGES ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2023.1,us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2022.1
export IMAGE_TAG_PRO ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/pro:latest
export CYPRESS_SHARD ?=
export COMPOSE_PROJECT_NAME ?= test
@ -20,9 +20,12 @@ test-e2e-native:
npm run cypress:open
test-e2e:
docker compose build host-admin
docker compose up -d host-admin
docker compose up --no-log-prefix --exit-code-from=e2e e2e
test-e2e-open:
docker compose up -d host-admin
docker compose up --no-log-prefix --exit-code-from=e2e-open e2e-open
clean:
@ -45,7 +48,7 @@ prefetch_custom_compose_pull:
prefetch_custom: prefetch_custom_texlive
prefetch_custom_texlive:
echo "$$ALL_TEX_LIVE_DOCKER_IMAGES" | tr ',' '\n' | xargs -I% \
sh -exc 'tag=%; re_tag=quay.io/sharelatex/$${tag#*/*/}; docker pull $$tag; docker tag $$tag $$re_tag'
sh -exc 'tag=%; re_tag=quay.io/sharelatex/$${tag#*/*/*/}; docker pull $$tag; docker tag $$tag $$re_tag'
prefetch_custom: prefetch_old
prefetch_old:

View file

@ -179,6 +179,21 @@ describe('admin panel', function () {
cy.get('nav').findByText('Manage Users').click()
})
it('displays expected tabs', () => {
const tabs = ['Users', 'License Usage']
cy.get('[role="tab"]').each((el, index) => {
cy.wrap(el).findByText(tabs[index]).click()
})
cy.get('[role="tab"]').should('have.length', tabs.length)
})
it('license usage tab', () => {
cy.get('a').contains('License Usage').click()
cy.findByText(
'An active user is one who has opened a project in this Server Pro instance in the last 12 months.'
)
})
describe('create users', () => {
beforeEach(() => {
cy.get('a').contains('New User').click()

View file

@ -40,9 +40,15 @@ describe('Project creation and compilation', function () {
cy.get('.cm-line').should('have.length', 1)
cy.get('.cm-line').type(markdownContent)
cy.findByText('main.tex').click()
cy.get('.cm-content').should('contain.text', '\\maketitle')
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
'\\maketitle'
)
cy.findByText(fileName).click()
cy.get('.cm-content').should('contain.text', markdownContent)
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
markdownContent
)
})
it('can link and display linked image from other project', function () {

View file

@ -35,7 +35,7 @@ services:
MAILTRAP_PASSWORD: 'password-for-mailtrap'
mongo:
image: mongo:6.0
image: mongo:8.0.11
command: '--replSet overleaf'
volumes:
- ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
@ -91,6 +91,7 @@ services:
volumes:
- ./:/e2e
- /tmp/.X11-unix:/tmp/.X11-unix
- ${XAUTHORITY:-/dev/null}:/home/node/.Xauthority
user: "${DOCKER_USER:-1000:1000}"
environment:
CYPRESS_SHARD:
@ -131,7 +132,7 @@ services:
saml:
restart: always
image: gcr.io/overleaf-ops/saml-test
image: us-east1-docker.pkg.dev/overleaf-ops/ol-docker/saml-test
environment:
SAML_TEST_SP_ENTITY_ID: 'sharelatex-test-saml'
SAML_BASE_URL_PATH: 'http://saml/simplesaml/'

View file

@ -2,6 +2,7 @@ import {
createNewFile,
createProject,
openProjectById,
testNewFileUpload,
} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { ensureUserExists, login } from './helpers/login'
@ -104,7 +105,10 @@ describe('editor', () => {
force: true,
})
cy.get('button').contains('𝜉').click()
cy.get('.cm-content').should('contain.text', '\\xi')
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
'\\xi'
)
cy.log('recompile to force flush and avoid "unsaved changes" prompt')
recompile()
@ -116,24 +120,7 @@ describe('editor', () => {
cy.get('button').contains('New file').click({ force: true })
})
it('can upload file', () => {
const name = `${uuid()}.txt`
const content = `Test File Content ${name}`
cy.get('button').contains('Upload').click({ force: true })
cy.get('input[type=file]')
.first()
.selectFile(
{
contents: Cypress.Buffer.from(content),
fileName: name,
lastModified: Date.now(),
},
{ force: true }
)
// force: The file-tree pane is too narrow to display the full name.
cy.findByTestId('file-tree').findByText(name).click({ force: true })
cy.findByText(content)
})
testNewFileUpload()
it('should not display import from URL', () => {
cy.findByText('From external URL').should('not.exist')
@ -147,8 +134,9 @@ describe('editor', () => {
it('can download project sources', () => {
cy.get('a').contains('Source').click()
const zipName = projectName.replaceAll('-', '_')
cy.task('readFileInZip', {
pathToZip: `cypress/downloads/${projectName}.zip`,
pathToZip: `cypress/downloads/${zipName}.zip`,
fileToRead: 'main.tex',
}).should('contain', 'Your introduction goes here')
})

View file

@ -0,0 +1,104 @@
import { ensureUserExists, login } from './helpers/login'
import {
createProject,
openProjectById,
prepareFileUploadTest,
} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { prepareWaitForNextCompileSlot } from './helpers/compile'
import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
import { v4 as uuid } from 'uuid'
import { purgeFilestoreData, runScript } from './helpers/hostAdminClient'
describe('filestore migration', function () {
if (isExcludedBySharding('CE_CUSTOM_3')) return
startWith({ withDataDir: true, resetData: true, vars: {} })
ensureUserExists({ email: 'user@example.com' })
let projectName: string
let projectId: string
let waitForCompileRateLimitCoolOff: (fn: () => void) => void
const previousBinaryFiles: (() => void)[] = []
beforeWithReRunOnTestRetry(function () {
projectName = `project-${uuid()}`
login('user@example.com')
createProject(projectName, { type: 'Example project' }).then(
id => (projectId = id)
)
let queueReset
;({ waitForCompileRateLimitCoolOff, queueReset } =
prepareWaitForNextCompileSlot())
queueReset()
previousBinaryFiles.push(prepareFileUploadTest(true))
})
beforeEach(() => {
login('user@example.com')
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
})
function checkFilesAreAccessible() {
it('can upload new binary file and read previous uploads', function () {
previousBinaryFiles.push(prepareFileUploadTest(true))
for (const check of previousBinaryFiles) {
check()
}
})
it('renders frog jpg', () => {
cy.findByTestId('file-tree').findByText('frog.jpg').click()
cy.get('[alt="frog.jpg"]')
.should('be.visible')
.and('have.prop', 'naturalWidth')
.should('be.greaterThan', 0)
})
}
describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL not set', function () {
startWith({ withDataDir: true, vars: {} })
checkFilesAreAccessible()
})
describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=0', function () {
startWith({
withDataDir: true,
vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '0' },
})
checkFilesAreAccessible()
describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=1', function () {
startWith({
withDataDir: true,
vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '1' },
})
checkFilesAreAccessible()
describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=2', function () {
startWith({
withDataDir: true,
vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '1' },
})
before(async function () {
await runScript({
cwd: 'services/history-v1',
script: 'storage/scripts/back_fill_file_hash.mjs',
})
})
startWith({
withDataDir: true,
vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '2' },
})
checkFilesAreAccessible()
describe('purge filestore data', function () {
before(async function () {
await purgeFilestoreData()
})
checkFilesAreAccessible()
})
})
})
})
})

View file

@ -107,7 +107,7 @@ describe('git-bridge', function () {
cy.get('code').contains(`git clone ${gitURL(id.toString())}`)
})
cy.findByText('Generate token').should('not.exist')
cy.findByText(/generate a new one in Account settings/i)
cy.findByText(/generate a new one in Account settings/)
cy.findByText('Go to settings')
.should('have.attr', 'target', '_blank')
.and('have.attr', 'href', '/user/settings')

View file

@ -9,6 +9,14 @@ export function throttledRecompile() {
return recompile
}
export function stopCompile(options: { delay?: number } = {}) {
const { delay = 0 } = options
cy.wait(delay)
cy.log('Stop compile')
cy.findByRole('button', { name: 'Toggle compile options menu' }).click()
cy.findByRole('menuitem', { name: 'Stop compilation' }).click()
}
export function prepareWaitForNextCompileSlot() {
let lastCompile = 0
function queueReset() {

View file

@ -9,6 +9,7 @@ export function isExcludedBySharding(
| 'CE_DEFAULT'
| 'CE_CUSTOM_1'
| 'CE_CUSTOM_2'
| 'CE_CUSTOM_3'
| 'PRO_DEFAULT_1'
| 'PRO_DEFAULT_2'
| 'PRO_CUSTOM_1'

View file

@ -85,6 +85,12 @@ export async function getRedisKeys() {
return stdout.split('\n')
}
export async function purgeFilestoreData() {
await fetchJSON(`${hostAdminURL}/data/user_files`, {
method: 'DELETE',
})
}
async function sleep(ms: number) {
return new Promise(resolve => {
setTimeout(resolve, ms)

View file

@ -37,7 +37,8 @@ export function createProject(
}
cy.findAllByRole('button').contains(newProjectButtonMatcher).click()
// FIXME: This should only look in the left menu
cy.findAllByText(new RegExp(type, 'i')).first().click()
// The upgrading tests create projects in older versions of Server Pro which used different casing of the project type. Use case-insensitive match.
cy.findAllByText(type, { exact: false }).first().click()
cy.findByRole('dialog').within(() => {
cy.get('input').type(name)
cy.findByText('Create').click()
@ -215,3 +216,43 @@ export function createNewFile() {
return fileName
}
export function prepareFileUploadTest(binary = false) {
const name = `${uuid()}.txt`
const content = `Test File Content ${name}${binary ? ' \x00' : ''}`
cy.get('button').contains('Upload').click({ force: true })
cy.get('input[type=file]')
.first()
.selectFile(
{
contents: Cypress.Buffer.from(content),
fileName: name,
lastModified: Date.now(),
},
{ force: true }
)
// wait for the upload to finish
cy.findByRole('treeitem', { name })
return function check() {
cy.findByRole('treeitem', { name }).click()
if (binary) {
cy.findByText(content).should('not.have.class', 'cm-line')
} else {
cy.findByText(content).should('have.class', 'cm-line')
}
}
}
export function testNewFileUpload() {
it('can upload text file', () => {
const check = prepareFileUploadTest(false)
check()
})
it('can upload binary file', () => {
const check = prepareFileUploadTest(true)
check()
})
}

View file

@ -29,6 +29,17 @@ const IMAGES = {
PRO: process.env.IMAGE_TAG_PRO.replace(/:.+/, ''),
}
function defaultDockerComposeOverride() {
return {
services: {
sharelatex: {
environment: {},
},
'git-bridge': {},
},
}
}
let previousConfig = ''
function readDockerComposeOverride() {
@ -38,14 +49,7 @@ function readDockerComposeOverride() {
if (error.code !== 'ENOENT') {
throw error
}
return {
services: {
sharelatex: {
environment: {},
},
'git-bridge': {},
},
}
return defaultDockerComposeOverride
}
}
@ -77,12 +81,21 @@ app.use(bodyParser.json())
app.use((req, res, next) => {
// Basic access logs
console.log(req.method, req.url, req.body)
const json = res.json
res.json = body => {
console.log(req.method, req.url, req.body, '->', body)
json.call(res, body)
}
next()
})
app.use((req, res, next) => {
// Add CORS headers
const accessControlAllowOrigin =
process.env.ACCESS_CONTROL_ALLOW_ORIGIN || 'http://sharelatex'
res.setHeader('Access-Control-Allow-Origin', accessControlAllowOrigin)
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Access-Control-Max-Age', '3600')
res.setHeader('Access-Control-Allow-Methods', 'DELETE, GET, HEAD, POST, PUT')
next()
})
@ -133,6 +146,7 @@ const allowedVars = Joi.object(
'V1_HISTORY_URL',
'SANDBOXED_COMPILES',
'ALL_TEX_LIVE_DOCKER_IMAGE_NAMES',
'OVERLEAF_FILESTORE_MIGRATION_LEVEL',
'OVERLEAF_TEMPLATES_USER_ID',
'OVERLEAF_NEW_PROJECT_TEMPLATE_LINKS',
'OVERLEAF_ALLOW_PUBLIC_ACCESS',
@ -319,8 +333,19 @@ app.get('/redis/keys', (req, res) => {
)
})
app.delete('/data/user_files', (req, res) => {
runDockerCompose(
'exec',
['sharelatex', 'rm', '-rf', '/var/lib/overleaf/data/user_files'],
(error, stdout, stderr) => {
res.json({ error, stdout, stderr })
}
)
})
app.use(handleValidationErrors())
purgeDataDir()
writeDockerComposeOverride(defaultDockerComposeOverride())
app.listen(80)

View file

@ -44,8 +44,9 @@ describe('Project List', () => {
cy.findByRole('button', { name: 'Download .zip file' }).click()
)
const zipName = projectName.replaceAll('-', '_')
cy.task('readFileInZip', {
pathToZip: `cypress/downloads/${projectName}.zip`,
pathToZip: `cypress/downloads/${zipName}.zip`,
fileToRead: 'main.tex',
}).should('contain', 'Your introduction goes here')
})

View file

@ -55,8 +55,15 @@ describe('Project Sharing', function () {
function expectContentReadOnlyAccess() {
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
cy.get('.cm-content').should('contain.text', '\\maketitle')
cy.get('.cm-content').should('have.attr', 'contenteditable', 'false')
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
'\\maketitle'
)
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'have.attr',
'contenteditable',
'false'
)
}
function expectContentWriteAccess() {
@ -64,13 +71,23 @@ describe('Project Sharing', function () {
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
const recompile = throttledRecompile()
// wait for the editor to finish loading
cy.get('.cm-content').should('contain.text', '\\maketitle')
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
'\\maketitle'
)
// the editor should be writable
cy.get('.cm-content').should('have.attr', 'contenteditable', 'true')
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'have.attr',
'contenteditable',
'true'
)
cy.findByText('\\maketitle').parent().click()
cy.findByText('\\maketitle').parent().type(`\n\\section{{}${section}}`)
// should have written
cy.get('.cm-content').should('contain.text', `\\section{${section}}`)
cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
'contain.text',
`\\section{${section}}`
)
// check PDF
recompile()
cy.get('.pdf-viewer').should('contain.text', projectName)

View file

@ -1,7 +1,7 @@
import { ensureUserExists, login } from './helpers/login'
import { createProject } from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { throttledRecompile } from './helpers/compile'
import { throttledRecompile, stopCompile } from './helpers/compile'
import { v4 as uuid } from 'uuid'
import { waitUntilScrollingFinished } from './helpers/waitUntilScrollingFinished'
import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
@ -56,8 +56,40 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
checkStopCompile()
})
function checkStopCompile() {
it('users can stop a running compile', function () {
login('user@example.com')
createProject('test-project')
// create an infinite loop in the main document
// this will cause the compile to run indefinitely
cy.findByText('\\maketitle').parent().click()
cy.findByText('\\maketitle')
.parent()
.type('\n\\def\\x{{}Hello!\\par\\x}\\x')
cy.log('Start compile')
// We need to start the compile manually because we do not want to wait for it to finish
cy.findByText('Recompile').click()
// Now stop the compile and kill the latex process
stopCompile({ delay: 1000 })
cy.get('.logs-pane')
.invoke('text')
.should('match', /PDF Rendering Error|Compilation cancelled/)
// Check that the previous compile is not running in the background by
// disabling the infinite loop and recompiling
cy.findByText('\\def').parent().click()
cy.findByText('\\def').parent().type('{home}disabled loop% ')
cy.findByText('Recompile').click()
cy.get('.pdf-viewer').should('contain.text', 'disabled loop')
cy.get('.logs-pane').should(
'not.contain.text',
'A previous compile is still running'
)
})
}
function checkSyncTeX() {
// TODO(25342): re-enable
// eslint-disable-next-line mocha/no-skipped-tests
@ -129,7 +161,9 @@ describe('SandboxedCompiles', function () {
})
cy.log('navigate to Section A')
cy.get('.cm-content').within(() => cy.findByText('Section A').click())
cy.findByRole('textbox', { name: /Source Editor editing/i }).within(
() => cy.findByText('Section A').click()
)
cy.get('[aria-label="Go to code location in PDF"]').click()
cy.get('@title').then((title: any) => {
waitUntilScrollingFinished('.pdfjs-viewer-inner', title)
@ -138,7 +172,9 @@ describe('SandboxedCompiles', function () {
})
cy.log('navigate to Section B')
cy.get('.cm-content').within(() => cy.findByText('Section B').click())
cy.findByRole('textbox', { name: /Source Editor editing/i }).within(
() => cy.findByText('Section B').click()
)
cy.get('[aria-label="Go to code location in PDF"]').click()
cy.get('@sectionA').then((title: any) => {
waitUntilScrollingFinished('.pdfjs-viewer-inner', title)
@ -227,6 +263,7 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
checkStopCompile()
})
describe.skip('unavailable in CE', function () {
@ -241,5 +278,6 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
checkStopCompile()
})
})

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
FROM node:22.15.1 AS base
FROM node:22.17.0 AS base
WORKDIR /overleaf/services/chat

View file

@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.1 npm run --silent
RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.1 npm run --silent
RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \

View file

@ -4,6 +4,6 @@ chat
--env-add=
--env-pass-through=
--esmock-loader=False
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

View file

@ -24,10 +24,13 @@ services:
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
volumes:
- ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
condition: service_started
user: node
entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@ -39,7 +42,7 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
mongo:
image: mongo:7.0.20
image: mongo:8.0.11
command: --replSet overleaf
volumes:
- ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js

View file

@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
@ -21,11 +21,12 @@ services:
user: node
test_acceptance:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
- ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/chat
environment:
ELASTIC_SEARCH_DSN: es:9200
@ -39,10 +40,11 @@ services:
depends_on:
mongo:
condition: service_started
entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
mongo:
image: mongo:7.0.20
image: mongo:8.0.11
command: --replSet overleaf
volumes:
- ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js

View file

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
FROM node:22.15.1 AS base
FROM node:22.17.0 AS base
WORKDIR /overleaf/services/clsi
COPY services/clsi/install_deps.sh /overleaf/services/clsi/

Some files were not shown because too many files have changed in this diff Show more