Commit Graph
1839 Commits
Author SHA1 Message Date
ilkin-overleaf 0113c8ee9f Merge pull request #35936 from overleaf/ii-workspaces-subscription-admin-settings
Shared Workspace settings for subscription admins

GitOrigin-RevId: 61cc45a48aaf1709905e98b3cccf09b50e2afa84
2026-09-17 11:57:14 +00:00
Antoine Clausse b2139b170c [web] Remove SubscriptionFormatters, format subscription dates in the frontend (#36409) (#36476)
* Reapply "[web] Remove SubscriptionFormatters, format subscription dates in the…"

This reverts commit 2939e71e5b919529cbb8a602916d5f597d117792.

* Fixup after rename conflict: `nextPaymentDueDate`->`periodEnd`

GitOrigin-RevId: c024a3a2cd08c1f8f9d4c99f9ba6f018d334439e
2026-09-17 11:55:52 +00:00
Jakob Ackermann de0d1a7226 Merge pull request #36219 from overleaf/jpa-zod-web-platform
[web] platform: adopt strict zod schema and extend test coverage

GitOrigin-RevId: e3a0b7b4c52ac116f28be0d284284e3bd3994cda
2026-09-17 11:55:40 +00:00
Jakob Ackermann 55c23b6812 Merge pull request #36223 from overleaf/jpa-zod-web-core-2
[web] core-2: adopt strict zod schema and extend test coverage

GitOrigin-RevId: f26d349fefb6bf9e042cb39117395120c3f7c877
2026-09-17 11:55:37 +00:00
Jakob Ackermann e2564f356c Merge pull request #36222 from overleaf/jpa-zod-web-core-1
[web] core-1: adopt strict zod schema and extend test coverage

GitOrigin-RevId: 6dc74a100989e6eca1565480a9ecb5f24404ef96
2026-09-17 11:55:33 +00:00
Jakob Ackermann f26a48fc4c Merge pull request #36221 from overleaf/jpa-zod-web-b2c
[web] b2c: adopt strict zod schema and extend test coverage

GitOrigin-RevId: 5c612e3ce83b81cfff7b8f1c5bc4522d6feb665a
2026-09-17 11:55:30 +00:00
Jakob Ackermann 784b9c64ec Merge pull request #36220 from overleaf/jpa-zod-web-b2b
[web] b2b: adopt strict zod schema and extend test coverage

GitOrigin-RevId: ae9bb04cfe1034ff36dec33ba5e77aceecd71db7
2026-09-17 11:55:27 +00:00
Antoine Clausse 07835f92b3 Merge pull request #36475 from overleaf/revert-36409-ac-remove-subscription-formatters
Revert "[web] Remove SubscriptionFormatters, format subscription dates in the frontend"

GitOrigin-RevId: d4c6bb600f7315c27016a45a8250a61b46de0119
2026-09-17 11:52:51 +00:00
Antoine Clausse ba4f024f34 [web] Remove SubscriptionFormatters, format subscription dates in the frontend (#36409)
* [web] Remove SubscriptionFormatters, format subscription dates in the frontend

Replace the server-formatted nextPaymentDueAt/nextPaymentDueDate/
trialEndsAtFormatted fields with the raw periodEnd date and format in
the React dashboard (same strings as before, English + UTC). Also
consolidate hand-rolled trial checks onto isInFreeTrial /
SubscriptionHelper.isInTrial.

* [web] Remove the now-unused dateformat dependency

* [web] Address review: payment-dates unit test, UTC dates in acceptance test

Add a dedicated unit test asserting the exact formatted strings from
formatPaymentDate/formatPaymentDateTime, and use explicit UTC timestamps
in the SubscriptionDashboard acceptance fixtures instead of
local-timezone Date constructors.

GitOrigin-RevId: 16ac4f1098b14ef9f1478d22cf39c1357ead7dea
2026-09-17 11:52:44 +00:00
roo hutton dac6254831 Merge pull request #36320 from overleaf/rh-cio-split-tests
[web] require admin opt-in for split test assignments sent to customer.io

GitOrigin-RevId: 5a6f5c3726f3b65c2f432ab20720e6f8f5c53eb1
2026-09-17 11:51:56 +00:00
roo hutton 1681343782 Merge pull request #36024 from overleaf/rh-cio-group-support
Enable customer.io in-app messages on group management pages

GitOrigin-RevId: 0c30c4ccf219cdbc4dd48ea6940cc46a4c6964c3
2026-09-17 11:50:54 +00:00
Mathias Jakobsen f7de42f1d3 Merge pull request #36181 from overleaf/mj-offline-mode-feature
[web] Add offline mode to feature set

GitOrigin-RevId: 93d2ed373af5b46f5ead924c14605775826c46e3
2026-09-17 11:50:44 +00:00
Malik Glossop 42feabe643 Merge pull request #35907 from overleaf/mg-ai-usage-event
Fire a 'ai-usage-limit-reached' event in backend

GitOrigin-RevId: b43babdd2a0146086cee5ebd2bde83f8daaf1bb5
2026-09-17 11:50:38 +00:00
roo hutton ba589211ea Merge pull request #36314 from overleaf/revert-36194-rh-cio-split-tests
Revert "[web] send active split test assignments to customer.io"

GitOrigin-RevId: c3acb504be2ef003d6a103568ece3175f787e6d5
2026-09-17 11:50:08 +00:00
roo hutton 6b69ea7dc1 Merge pull request #36194 from overleaf/rh-cio-split-tests
[web] send active split test assignments to customer.io

GitOrigin-RevId: 3036d6442e8419326f4b641482d65bd5114fe3da
2026-09-17 11:49:59 +00:00
Brian Gough df7a9159c2 normalise image counts in compile-with-optimizable-pngs analytics events (#36308)
GitOrigin-RevId: 6049161196fab1b2e4c3d9aa811b97e3e529aca2
2026-09-17 11:49:54 +00:00
Antoine ClausseandMathias Jakobsen 87fd22cefc [web] Fix negative AI quota countdown after reset period elapses (#35690)
* Fix negative AI quota countdown after reset period elapses

Backend (`FeatureUsageRateLimiter`, `TokenUsageRateLimiter`): once the
24h period had lapsed, `remainingUsage`/`remainingTokens` reset to the
full allowance but `resetDate` kept pointing at the old `periodStart +
24h` (i.e. in the past). Advance to `now + 24h` in that case.

Frontend (`NewPlanPaywall`, `ErrorGetPremium`): the "wait X hours and Y
minutes" copy computed `restoreTime - now` without clamping, so a past
`restoreTime` produced negative hours/minutes (users saw "wait -118
hours and -35 minutes"). Clamp to 0.

* Address PR review on quota reset fix

- Keep `resetDate` tied to the stored `periodStart + PERIOD` rather
  than jumping to `now + PERIOD` when the period has lapsed. The
  moving-target variant unnecessarily reinterpreted a stable field
  (existing consumers such as `use-ai-access-gate` check whether the
  reset date is in the past).
- Clamp `remainingUsage` / `remainingTokens` at 0 so a concurrent
  over-usage never leaks a negative count.
- Align the boundary check with `_checkRateLimit` / `checkUsage`
  (inclusive `<=`).
- Cover the period boundary and the clamp in unit tests for both
  `FeatureUsageRateLimiter` and `WorkbenchRateLimiter`.

* Truncate test fixtures to whole seconds

`resetDate` is serialized with `Date.toString()`, which has second
resolution, so fixtures with a millisecond component failed the
boundary assertions.

* Revert code changes; keep tests that document the bug

The fixes masked the symptom (negative countdown) without addressing
the underlying issue, and it is not fully understood yet. Revert the
rate limiters and the writefull paywall components to their original
behaviour, and instead pin the current behaviour in tests:

- `it.fails` tests document that `remainingUsage`/`remainingTokens`
  go negative when usage exceeds the allowance — these flip red when
  the bug is fixed, at which point they should become plain `it`.
- The lapsed-period tests assert (with explanatory comments) that
  `resetDate` keeps pointing at the end of the lapsed period, which is
  the server-side ingredient of the negative-countdown support ticket.

* Reapply quota fixes

Restores the post-review state of the rate limiters (clamp remaining
counts at 0, inclusive period boundary, resetDate tied to periodStart)
and the writefull paywall components (clamp countdown at 0).

Tests intentionally untouched in this commit; the two `it.fails` tests
now need flipping to plain `it` in a follow-up.

* Flip bug-documenting tests to plain assertions

The clamp fixes are reapplied, so the `it.fails` tests now assert the
fixed behaviour directly. Trim the explanatory comments.

* Set resetDate to `Date.now() + PERIOD_IN_MILLISECONDS` instead of the expired/stale date.

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

* Update lapsed-period tests for the fresh resetDate

`resetDate` is now `Date.now() + PERIOD` once the period has lapsed, so
assert an approximately-fresh date instead of the stale period end.

---------

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: ad39627ab9e5ceccb2a61443b2b7d39c68600594
2026-09-17 11:49:47 +00:00
Brian Gough 6b3d95cea4 add optimisable png count and compile stats to compile-with-optimizable-pngs event (#36279)
* add count of optimisable pngs to HistoryResourceWriter

* add optimisable png count and compile stats to compile-with-optimizable-pngs event

GitOrigin-RevId: 5c528d727473ec2d3082845d8d5b60844f3434f6
2026-09-17 11:49:41 +00:00
roo hutton b886c0b266 Merge pull request #35836 from overleaf/rh-prices-split
[web] Update monthly plan prices for new subscriptions with split test

GitOrigin-RevId: 42d0adaf68647adc93f4c05d5ddeefb356753db2
2026-09-17 11:49:04 +00:00
Jakob Ackermann 6ca58edf72 [web] add infrastructure level zod change (#36190)
* [web] add infrastructure level zod change

* [web] set req validation mode for tests to 'enforce'

GitOrigin-RevId: 6dbc8bff7ed9f89045c398df93d84bca589de4e9
2026-09-17 11:48:19 +00:00
Jakob Ackermann eb36edac6d [project-history] report a resync that is still pending after a flush (#36122)
GitOrigin-RevId: ccd4390048c09f732531d2e02a40336fce88a952
2026-09-17 11:45:55 +00:00
Jimmy Domagala-TangandBrian Gough 35ba44f22b Adding project PNG optimization check to compile analytics (#35925)
* feat: adding in check for if the project could have had a png optimized as part of the compile-result-backend event

* feat: updating using new compile metrics to filter for only eligible project compiles

* move projectHasUnconvertedPngs to stats

* add e2e test for projectHasUnconvertedPngs

* add unit tests for compile-with-optimizable-pngs analytics event

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: 97e9d184420c34fc1d3e9f6cfe63f6b916f0202f
2026-09-17 11:44:29 +00:00
Jessica Lawshe 16a5c45b5f Merge pull request #35861 from overleaf/jel-email-notifications-domain-capture
[web] Use name in greeting for email notifications for domain capture

GitOrigin-RevId: 56e46bc6de031656e4e8c0a9332f6b94aa517506
2026-09-17 11:42:20 +00:00
Kate Crichton 281b5fe25c Merge pull request #34835 from overleaf/kc-email-member-limit-reached
[web] Email group admin when group reaches member limit

GitOrigin-RevId: 6b7b12a2c309e7d9b4314e8db51969d73864b7ed
2026-09-17 11:41:49 +00:00
Jimmy Domagala-Tang ba76fda37b Cleanup AiErrorAssistant todos post plans changes (#35067)
* feat: cleaning up ai quota leftovers

fix: removing more straggler invos

* fix: featureUpdater still need analyticsId in the user projection

* feat: updating cypress tests to also check for fair usage text

GitOrigin-RevId: 09c1167106c144084c111beea56867f6aa4a0906
2026-09-17 11:41:10 +00:00
Simon Gardner c40952813c [web] fix: Always unlink group SSO when a linked user leaves a group (#35895)
GitOrigin-RevId: f3a9cc5fec2b8950826aef02bdfe7ed72607f56b
2026-09-17 11:41:03 +00:00
Jakob Ackermann 00a2765d01 [document-updater] add track-changes support to setDoc (#35820)
GitOrigin-RevId: 5d39dd1945e710ec3f7068830fb2476e59f0f2a5
2026-09-17 11:39:12 +00:00
Brian Gough a46d987a51 Merge pull request #35695 from overleaf/copilot/close-graceful-shutdown-issue-35694
Handle graceful shutdown in project and user deletion batch expiry

GitOrigin-RevId: 43182850ad8e55b480ea0073c393222366d7e00a
2026-09-17 11:38:25 +00:00
Rebeka DekanyandCopilot Autofix powered by AI 0b574d2ccd Rename user-facing Papers reference manager to ReadCube (#35701)
* Rename user-facing Papers reference manager text to ReadCube

* Rename Papers component and files name to Readcube

* Update locales from Papers to ReadCube

* Rename ID name from papers to readcube

* Fix a chinese locale to use ReadCube

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
GitOrigin-RevId: ee89e3f5da5bcf9987c0ee3e558b9ae1dab9372c
2026-09-17 11:37:06 +00:00
Antoine ClausseandClaude Fable 5 59b4a67c2d [web] Remove redundant annualDividedByTwelve from pricing tables (#35507)
* [web] Add snapshot test for all annualDividedByTwelve values

Captures the 85 stored values into a JSON fixture and asserts the
effective value (stored field, or PlansHelper.roundedTwelfth(annual)
once the field is derived at runtime) matches. Verification harness for
the annualDividedByTwelve refactor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [web] Compute annualDividedByTwelve at runtime instead of hardcoding it

* [web] Update annualDividedByTwelve snapshot for the rounding rule

The runtime derivation reproduces 84 of the 85 historical values exactly.
The one difference is PEN assistant, which was historically stored
unrounded (350 / 12 = 29.1667) and now follows the round-up-to-0.05 rule
(29.20). The assistant add-on is unavailable, so this is not user-visible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Remove `localizedAddOnsPricing` from test

* Add more sanity tests

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
GitOrigin-RevId: e60e8b3e90360817d4be3732243d242dc0cbb69e
2026-09-17 11:36:17 +00:00
Brian Gough 8f5f86bce1 Merge pull request #35257 from overleaf/bg-png2pdf-premium
limit png2pdf to priority compiles

GitOrigin-RevId: a2b394efe6056ccbc6963d922f3e8b385645167b
2026-09-17 11:35:57 +00:00
Andrew Rumble da3adace36 Merge pull request #34850 from overleaf/acf-ar-yarn-pnp-redux
[monorepo] yarn pnp redux

GitOrigin-RevId: fb04cab879b04ead2665b5e985a44053ceea33f3
2026-09-17 11:35:26 +00:00
Miguel Serrano 44f053129f [web] Update @aws-sdk/client-ses to v2 (CE/SP only) (#35531)
This new version is compatible with the current nodemailer version.

GitOrigin-RevId: 8244fa8fc42edbc6aa7b702ec7975e9eee7f9879
2026-09-17 11:35:20 +00:00
Brian Gough 6c756eab73 Validate id types in LinkedFiles getSourceProject (#35748)
* Validate id types in LinkedFiles getSourceProject

Require source_project_id and v1_source_doc_id to be primitives before
querying Mongo, rejecting anything else with BadDataError.

* Validate refreshLinkedFile request params and body

Route refreshLinkedFile through parseReq with a schema requiring
project_id and file_id to be ObjectIds and typing the request body.

* Use well-formed ObjectIds in LinkedFilesController tests

Give the shared test setup valid ObjectId project_id/parent_folder_id
so parseReq passes and the controller logic is actually exercised, and
fail the tests if next is called unexpectedly.

* Use ObjectId file ids in v1 linked-file acceptance fixtures

The refresh route now validates file_id as an ObjectId, so the v1
not-imported fixtures need well-formed ids to reach the refuse-to-refresh
path (409) instead of failing id validation (404).

GitOrigin-RevId: d78b3664e825c6bb25ab2e363e5094b9212db307
2026-09-17 11:35:02 +00:00
Thomas 3fb3baf03a Merge pull request #34605 from overleaf/tm-request-access-redesign
[WEB] Request edit access in the new share modal

GitOrigin-RevId: d01cf4d038d5ce07c34deac0714b0cdad02136be
2026-09-17 11:34:55 +00:00
Thomas fc40c1f8a4 Merge pull request #35636 from overleaf/tm-fix-export-error-forwarding
[web] Forward v1 export errors to the publish modal instead of a 500

GitOrigin-RevId: 7cf69c4d6a954cd311ac64fff175156b300afabb
2026-09-17 11:34:52 +00:00
Brian Gough 41a1b639f6 Merge pull request #35734 from overleaf/bg-issue35720
add zod validation to ExportsController and TemplatesController

GitOrigin-RevId: 8f283999665d730d491160aabe75b2643b8c2178
2026-09-17 11:34:46 +00:00
Domagoj Kriskovic d8de261370 Add request validation to HistoryController endpoints (#35730)
* Add schemas for file restoration and label management in HistoryController

* Add request schemas for proxying to history API and resyncing project history

* prevent transforming version:null into version:0 with coerce

* move jsDoc comments above the handler

* check for undefined resyncProjectStructureOnly

* Add tests for restoreFileFromV2 and revertFile

* Set default value for resyncProjectStructureOnly in resyncProjectHistorySchema

GitOrigin-RevId: 7b8b8a4c3834b8c8a83f93052ab1f59e86c529a6
2026-09-17 11:34:33 +00:00
David 873bf5923d Merge pull request #35420 from overleaf/lo-stop-silently-dropping-large-bib-files
Lo stop silently dropping large bib files

GitOrigin-RevId: cba919227eb6d5c1f8100c6afba3076bd62a5797
2026-09-17 11:32:01 +00:00
Jakob Ackermann 68352783b0 [monorepo] clean up per-project queue migration (#35573)
GitOrigin-RevId: 988df4cdc7d929efc921e7e99d803c6ce6e52c57
2026-09-17 11:31:52 +00:00
Antoine ClausseandClaude Opus 4.8 a4da7a935c [web] Remove redundant monthlyTimesTwelve from pricing tables (#35506)
* [web] Remove redundant monthlyTimesTwelve from pricing tables

monthlyTimesTwelve was always exactly monthly * 12 in every pricing row,
and the value was only ever used to render the "billed monthly for a year"
strikethrough price in the compile-timeout paywall.

- Drop the stored field from the pricing tables
- Send raw monthly/annual numbers in ol-standardPlanPricing instead of
  pre-formatted strings
- Format the prices (and derive the strikethrough as monthly * 12) in the
  paywall modal via the frontend currency helper

No user-facing change: the displayed prices are identical.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Remove `monthlyTimesTwelve` from script

* Remove comments

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
GitOrigin-RevId: b637208540b3b96180b1a3cc4417b09944c5d158
2026-09-17 11:29:42 +00:00
roo hutton 90ab683992 Merge pull request #35516 from overleaf/rh-cio-commons-ai
[web] Send Commons AI attribute to customer.io

GitOrigin-RevId: de010cc34f4e1a854a730ec39212845e1c05d4b1
2026-09-17 11:28:57 +00:00
Jakob Ackermann 8270641b42 [web] optimize project lookup for tpds operations (#35466)
* [web] store ObjectIds in addUserToProject acceptance test helper

* [web] optimize project lookup for tpds operations

GitOrigin-RevId: 03db9fc450556072f177d56f640fcc6114b295d4
2026-09-17 11:28:44 +00:00
Eric Mc Sween 9b79ccea5b Merge pull request #35435 from overleaf/em-library-stop-main-cluster-writes
Stop writes to the main Mongo cluster for library collections

GitOrigin-RevId: 39c9ccc2a02e291befcf197fa806ee5aab900a8d
2026-09-17 11:27:53 +00:00
Eric Mc Sween 5dd86068c8 Merge pull request #35434 from overleaf/em-change-library-mongo-cluster-switch-reads
Switch library collection reads and authoritative writes to the auxiliary Mongo cluster

GitOrigin-RevId: 5bbaa30b50c4d98d70d5d310dcd1209837e3f921
2026-09-17 11:27:23 +00:00
Jakob Ackermann cdba372dfc [monorepo] prepare per-project queues (#35386)
GitOrigin-RevId: ab020603ec04c705d08be466563adac0ce30bc04
2026-09-17 11:26:50 +00:00
Jimmy Domagala-Tang dd53057708 feat: adding gating based on entitlement when calculating institutional features, and adding tests to ensure (#35351)
GitOrigin-RevId: 897ce7610cd08c77be6a90aad8b953d38213573a
2026-09-17 11:26:12 +00:00
Jakob Ackermann b68a013751 [web] add endpoint for resolving a project for writes from tpds (#35408)
* [web] add endpoint for resolving a project for writes from tpds

* [web] return historyId from new endpoint for resolving projects

* [web] add zod validation to new endpoint for resolving projects

GitOrigin-RevId: 0e607e56442117a4150a08373169c44b53dd4fdf
2026-09-17 11:26:03 +00:00
Eric Mc Sween 528e587038 Merge pull request #35377 from overleaf/em-change-library-mongo-cluster
Add auxiliary Mongo cluster support for library collections

GitOrigin-RevId: 1cfdbe4bbeb6c95f1158834ae60a4e34bef7bb87
2026-09-17 11:26:00 +00:00
ilkin-overleaf 6fd593ff86 Merge pull request #35312 from overleaf/ii-anonymous-project-access
[web] Restore anonymous read-only access for "Anyone with the link" sharing

GitOrigin-RevId: b17e30259f73d43f0febffeea8908eb47c98b7ee
2026-09-17 11:25:29 +00:00