Compare commits

...

253 commits

Author SHA1 Message Date
yu-i-i
016ec8c38d Refactor Sandboxed Compiles 2025-07-21 19:26:03 +02:00
yu-i-i
a64663190c Add 'poll' to clsi seccomp profile, fixes minted. Thanks, David. 2025-07-21 19:26:03 +02:00
yu-i-i
f56e00faeb Allow adding extra flags to LaTeX compiler through environment variable 2025-07-21 19:26:03 +02:00
yu-i-i
438a5d2930 Allow selecting a TeX Live image for a project 2025-07-21 19:26:03 +02:00
Sam Van den Vonder
7bad59fb14 Enable Sandboxed Compiles feature 2025-07-21 19:26:03 +02: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
854 changed files with 17079 additions and 13771 deletions

View file

@ -23,6 +23,11 @@
[Overleaf](https://www.overleaf.com) is an open-source online real-time collaborative LaTeX editor. We run a hosted version at [www.overleaf.com](https://www.overleaf.com), but you can also run your own local version, and contribute to the development of Overleaf.
> [!CAUTION]
> Overleaf Community Edition is intended for use in environments where **all** users are trusted. Community Edition is **not** appropriate for scenarios where isolation of users is required due to Sandbox Compiles not being available. When not using Sandboxed Compiles, users have full read and write access to the `sharelatex` container resources (filesystem, network, environment variables) when running LaTeX compiles.
For more information on Sandbox Compiles check out our [documentation](https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/server-pro-only-configuration/sandboxed-compiles).
## Enterprise
If you want help installing and maintaining Overleaf in your lab or workplace, we offer an officially supported version called [Overleaf Server Pro](https://www.overleaf.com/for/enterprises). It also includes more features for security (SSO with LDAP or SAML), administration and collaboration (e.g. tracked changes). [Find out more!](https://www.overleaf.com/for/enterprises)

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,14 +6,17 @@ 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
SESSION_SECRET=foo
V1_HISTORY_HOST=history-v1
WEBPACK_HOST=webpack
WEB_API_PASSWORD=overleaf
WEB_API_USER=overleaf

View file

@ -113,7 +113,7 @@ services:
- ../services/real-time/config:/overleaf/services/real-time/config
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:

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

@ -5,6 +5,6 @@ access-token-encryptor
--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

@ -5,6 +5,6 @@ fetch-utils
--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

@ -5,6 +5,6 @@ logger
--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

@ -5,6 +5,6 @@ metrics
--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

@ -5,6 +5,6 @@ mongo-utils
--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

@ -5,6 +5,6 @@ o-error
--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

@ -5,6 +5,6 @@ object-persistor
--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.
@ -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 { contents, response } = await this.listDirectory(
bucketName,
key,
continuationToken
)
}
const objects = response.Contents?.map(item => ({ Key: item.Key || '' }))
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

@ -5,6 +5,6 @@ overleaf-editor-core
--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

@ -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

@ -1 +1 @@
22.15.1
22.17.0

View file

@ -5,6 +5,6 @@ promise-utils
--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

@ -5,6 +5,6 @@ ranges-tracker
--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

@ -5,6 +5,6 @@ redis-wrapper
--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

@ -5,6 +5,6 @@ settings
--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

@ -5,6 +5,6 @@ stream-utils
--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,
}

2447
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,21 @@
"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.1",
"swagger-tools@0.10.4": {
"path-to-regexp": "3.3.0",
"qs": "6.13.0"
"body-parser": "1.20.3",
"multer": "2.0.1"
}
},
"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

@ -33,7 +33,7 @@ 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 \

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,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

@ -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

@ -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:

View file

@ -104,7 +104,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()
@ -147,8 +150,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

@ -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

@ -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

@ -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,7 +21,7 @@ services:
user: node
test_acceptance:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules

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/

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

@ -13,6 +13,7 @@ const {
const logger = require('@overleaf/logger')
const Metrics = require('@overleaf/metrics')
const Settings = require('@overleaf/settings')
const { MeteredStream } = require('@overleaf/stream-utils')
const { CACHE_SUBDIR } = require('./OutputCacheManager')
const { isExtraneousFile } = require('./ResourceWriter')
@ -204,7 +205,13 @@ async function downloadOutputDotSynctexFromCompileCache(
const dst = Path.join(outputDir, 'output.synctex.gz')
const tmp = dst + crypto.randomUUID()
try {
await pipeline(stream, fs.createWriteStream(tmp))
await pipeline(
stream,
new MeteredStream(Metrics, 'clsi_cache_egress', {
path: 'output.synctex.gz',
}),
fs.createWriteStream(tmp)
)
await fs.promises.rename(tmp, dst)
} catch (err) {
try {
@ -253,6 +260,7 @@ async function downloadLatestCompileCache(projectId, userId, compileDir) {
let abort = false
await pipeline(
stream,
new MeteredStream(Metrics, 'clsi_cache_egress', { path: 'output.tar.gz' }),
createGunzip(),
tarFs.extract(compileDir, {
// use ignore hook for counting entries (files+folders) and validation.

View file

@ -232,8 +232,8 @@ const DockerRunner = {
}
}
// set the path based on the image year
const match = image.match(/:([0-9]+)\.[0-9]+/)
const year = match ? match[1] : '2014'
const match = image.match(/:([0-9]+)\.[0-9]+|:TL([0-9]+)/)
const year = match ? match[1] || match[2] : '2014'
env.PATH = `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/texlive/${year}/bin/x86_64-linux/`
const options = {
Cmd: command,

View file

@ -54,6 +54,7 @@ module.exports = CommandRunner = {
cwd: directory,
env,
stdio: ['pipe', 'pipe', 'ignore'],
detached: true,
})
let stdout = ''

View file

@ -5,7 +5,7 @@ clsi
--env-add=ENABLE_PDF_CACHING="true",PDF_CACHING_ENABLE_WORKER_POOL="true",ALLOWED_IMAGES=quay.io/sharelatex/texlive-full:2017.1,TEXLIVE_IMAGE=quay.io/sharelatex/texlive-full:2017.1,TEX_LIVE_IMAGE_NAME_OVERRIDE=us-east1-docker.pkg.dev/overleaf-ops/ol-docker,TEXLIVE_IMAGE_USER="tex",SANDBOXED_COMPILES="true",SANDBOXED_COMPILES_HOST_DIR_COMPILES=$PWD/compiles,SANDBOXED_COMPILES_HOST_DIR_OUTPUT=$PWD/output
--env-pass-through=
--esmock-loader=False
--node-version=22.15.1
--node-version=22.17.0
--public-repo=True
--script-version=4.7.0
--use-large-ci-runner=True

View file

@ -107,7 +107,7 @@ if ((process.env.DOCKER_RUNNER || process.env.SANDBOXED_COMPILES) === 'true') {
CLSI: 1,
},
socketPath: '/var/run/docker.sock',
user: process.env.TEXLIVE_IMAGE_USER || 'tex',
user: process.env.TEXLIVE_IMAGE_USER || 'www-data',
},
optimiseInDocker: true,
expireProjectAfterIdleMs: 24 * 60 * 60 * 1000,

View file

@ -23,6 +23,7 @@
"@overleaf/o-error": "*",
"@overleaf/promise-utils": "*",
"@overleaf/settings": "*",
"@overleaf/stream-utils": "*",
"archiver": "5.3.2",
"async": "^3.2.5",
"body-parser": "^1.20.3",
@ -37,7 +38,6 @@
"workerpool": "^6.1.5"
},
"devDependencies": {
"@types/workerpool": "^6.1.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"mocha": "^11.1.0",

View file

@ -832,10 +832,16 @@
"name": "gettimeofday",
"action": "SCMP_ACT_ALLOW",
"args": []
}, {
},
{
"name": "epoll_pwait",
"action": "SCMP_ACT_ALLOW",
"args": []
},
{
"name": "poll",
"action": "SCMP_ACT_ALLOW",
"args": []
}
]
}

View file

@ -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')
})
})

View file

@ -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

@ -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/contacts

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 @@ contacts
--env-add=
--env-pass-through=
--esmock-loader=True
--node-version=22.15.1
--node-version=22.17.0
--public-repo=False
--script-version=4.7.0

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/contacts
- ../../node_modules:/overleaf/node_modules
@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/contacts
- ../../node_modules:/overleaf/node_modules

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/docstore

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 @@ docstore
--env-add=
--env-pass-through=
--esmock-loader=False
--node-version=22.15.1
--node-version=22.17.0
--public-repo=True
--script-version=4.7.0

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/docstore
- ../../node_modules:/overleaf/node_modules
@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/docstore
- ../../node_modules:/overleaf/node_modules

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/document-updater

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 @@ document-updater
--env-add=
--env-pass-through=
--esmock-loader=False
--node-version=22.15.1
--node-version=22.17.0
--public-repo=True
--script-version=4.7.0

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/document-updater
- ../../node_modules:/overleaf/node_modules
@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
image: node:22.15.1
image: node:22.17.0
volumes:
- .:/overleaf/services/document-updater
- ../../node_modules:/overleaf/node_modules

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/filestore
COPY services/filestore/install_deps.sh /overleaf/services/filestore/

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

@ -5,7 +5,7 @@ filestore
--env-add=ENABLE_CONVERSIONS="true",USE_PROM_METRICS="true",AWS_S3_USER_FILES_STORAGE_CLASS=REDUCED_REDUNDANCY,AWS_S3_USER_FILES_BUCKET_NAME=fake-user-files,AWS_S3_USER_FILES_DEK_BUCKET_NAME=fake-user-files-dek,AWS_S3_TEMPLATE_FILES_BUCKET_NAME=fake-template-files,GCS_USER_FILES_BUCKET_NAME=fake-gcs-user-files,GCS_TEMPLATE_FILES_BUCKET_NAME=fake-gcs-template-files
--env-pass-through=
--esmock-loader=False
--node-version=22.15.1
--node-version=22.17.0
--public-repo=True
--script-version=4.7.0
--test-acceptance-shards=SHARD_01_,SHARD_02_,SHARD_03_

View file

@ -64,7 +64,7 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
certs:
image: node:22.15.1
image: node:22.17.0
volumes:
- ./test/acceptance/certs:/certs
working_dir: /certs

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