25722 Commits
Author SHA1 Message Date
Jimmy Domagala-Tang 009668c224 Release TeX Live 2026.1 as the default image (#36382)
* feat: releasing 2026.1 texlive to general release and promoting to default image

* fix: update clsi image tests so their likeness calcs work locally on different archs

* feat: updating epstopdf fixture and adding note to texlive Dockerfile used for codespaces

* fix: use generated image-eps-convert instead of fixture version that drifts

GitOrigin-RevId: 13c4f6977dbf07ddd34c9a5ab3ea295cddcbe025
2026-09-17 11:59:26 +00:00
Olzhas Askar 6053781e57 Merge pull request #36496 from overleaf/oa-annual-events
[web] Subscription event segmentation

GitOrigin-RevId: fdc25ac7bc7320ed82617b7c27c12a17eb31d723
2026-09-17 11:59:20 +00:00
Mathias Jakobsen 1f9873e391 Merge pull request #36575 from overleaf/mj-generic-modals-themes
[web] Add dark mode to ide modals

GitOrigin-RevId: cd8e95e2286df46510a377ff9a69c4ab646ceabd
2026-09-17 11:59:00 +00:00
Mathias Jakobsen 8139638d9d Merge pull request #36570 from overleaf/mj-themed-labs-modal
[web] Add dark mode support for labs modal

GitOrigin-RevId: 18f9aff407ee5324c835f915419819b00d49bfb0
2026-09-17 11:58:57 +00:00
John Lees-MillerandClaude Opus 5 1ecdd122d0 Add Stripe migration features for stage 7 testing (part 2) (#35890)
* upsert: migrate US/CA PayPal without a payment method when flagged

getPaymentMethod no longer throws for a PayPal billing agreement destined for
Stripe US/CA when the account is flagged ignore_payment_method; instead it
returns null so the customer is migrated without a default payment method
(the send_invoice paymentMethodPending flow). Unflagged accounts still throw.

* finalize: expect the plan-code remap for legacy-plan subscriptions

When a subscription carries legacy_remap=1 metadata, compare the Stripe product's planCode against the recorded target plan code instead of the raw Recurly plan code, so the intentional remap is not misread as drift (the price is preserved, so the amount comparison is unchanged). Clear the legacy_remap metadata during post-migration cleanup.

* finalize: expect the assistant add-on reprice

When a subscription carries assist_addon_repriced=1 metadata, compare the assistant item against the recorded target amount (Stripe minor units) instead of the raw Recurly amount, so the intended reprice is not misread as drift. Clear the reprice metadata during post-migration cleanup.

* create_coupons: create migration coupons by name with amount_off, currency and product scope

Create the pipeline's per-region coupon_specs_<region>.csv coupons by name (idempotent, auto-paginated), supporting amount_off + currency (fixed) or percent_off, duration, and applies_to.products, with no promotion code. Region comes from the existing --region flag. The existing name-based percent-off + promotion-code path is unchanged.

* finalize: schedule the pending change as a phase 2

For a subscription flagged pending_change_scheduled, compare drift against the current Recurly state (not the pending change), then in Step 7 release the toolkit schedule and create a fresh two-phase subscription schedule (current until renewal; pending state from renewal with proration disabled and end_behavior release), clearing the scheduling metadata once the schedule exists.

* finalize: flag address-pending migrations and push the needs_to_update_address trait

When a migrated subscription carries metadata.addressPending, append -address-pending to the finalization status and push needs_to_update_address to customer.io (alongside the existing tax-info-pending handling), so the customer can be driven to add a billing address. The flag stays on the subscription so the customer.updated webhook can enable automatic_tax and clear it once the address resolves.

* webhook: heal address-pending migrations when the tax location resolves

On customer.updated (address/tax change), for a customer whose location is no longer unrecognized_location, enable automatic_tax on their migrated subscriptions still flagged metadata.addressPending and clear the flag. Enabling automatic_tax is rejected by Stripe while the location is still invalid, so the update is a safe idempotent no-op until the address is fixed; the cancellation state is never touched.

* cron: cancel unresolved address-pending subscriptions before they renew untaxed

Backstop for the address-pending cohort: searches the address-pending subscriptions in a region and, for any about to renew (within a configurable lead window) whose customer location is still unrecognized_location, cancels it at period end so it never renews untaxed. Skips subscriptions that are already cancelling and those whose location has resolved (healed by the webhook). Dry-run unless --commit.

* upsert: set tax.validate_location=auto on customer update

Conform PAN-copied customers to the account's default tax-location validation. Uses 'auto' rather than 'immediately' (which throws for country-only addresses and would break the address-pending migration flow).

* finalize-migration: send payment method info to customer.io

Add payment_method (card/paypal/none) and needs_to_add_payment_method
traits to the stripe_migration customer.io payload so the migration
email campaign can personalise per payment method without enumerating
the full cross-join. The payment method is read from the already-fetched
customer/subscription (default_payment_method now expanded on that fetch),
so no extra Stripe request is made. Also report a -payment-method-pending
status suffix in the CSV output.

* upsert: flag customers whose address Stripe cannot resolve

After pushing the Recurly address, read customer.tax.automatic_tax; when it is 'unrecognized_location', record address_unrecognized in the output so the subscription is migrated untaxed (address-pending) instead of failing at the billing-migration toolkit. This is the authoritative, region-agnostic detector (covers US/CA country-only and broken non-US addresses, e.g. India with a postal but no state/city). Adds isCustomerAddressUnrecognized helper + unit tests.

* Close reactivation-without-valid-address loophole

* webhook: detect newly-set address/tax with !== undefined

Review follow-up: the address-pending heal guard used a truthy check, which
would miss an address newly set from empty. Harmonise with _billingChanges,
which already uses !== undefined.

* upsert: set tax.validate_location via customerParams

Review follow-up: move the tax.validate_location='auto' directive into the
assembled customerParams instead of overriding it inline at the update call,
so it also appears in the dry-run output.

* create_coupons: guard migration coupons against ambiguous discount specs

Review follow-up: throw a clear per-coupon error if a migration coupon spec
has neither or both of amount_off/percent_off, catching data-processing
issues instead of silently sending percent_off=NaN.

* Rely on presence of customer.tax

* webhook: cover the address-pending heal path in unit tests

The customer.updated fixtures carried no `tax` hash and the mocked region
client had no `stripe` property, so the one test that reached the heal branch
threw and was swallowed by the caller's error handler. The heal logic had no
real coverage as a result.

Add the missing fixture fields and tests covering the heal itself, the
still-unrecognized early return, the skip rules for unflagged and cancelled
subscriptions, the Stripe rejection path that leaves the flag set, and the
missing-tax guard.

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
GitOrigin-RevId: 8162e3e0f01e136d3aa560c22e98f43e36da4eb5
2026-09-17 11:58:48 +00:00
Brian Gough 446c4f3f6a Merge pull request #35899 from overleaf/bg-custom-multer-workaround
add custom multer upload handler to prevent leaked files

GitOrigin-RevId: 7b390d326b4cf81fd82c532c53e9772cb4107a29
2026-09-17 11:58:42 +00:00
Andrew Rumble 44753a2a50 Merge pull request #36606 from overleaf/ar/log-relativePath
[web] log relativePath in uploadFiles endpoint

GitOrigin-RevId: d30cace4632c6c1b70aad2c84a2a6f470ef2ffa8
2026-09-17 11:58:39 +00:00
Domagoj Kriskovic ce194c9752 Use named <a> in feedback link Trans and themed-links mixin
GitOrigin-RevId: 812beaa01376c8ce0a423ba4cf1ae25581396fbb
2026-09-17 11:58:36 +00:00
Domagoj Kriskovic d7b4ef33ed Add "New" badge to library nav link and a feedback link on the library page
GitOrigin-RevId: 6c936ca8168dd718c4eaf806f426d5c00078add8
2026-09-17 11:58:32 +00:00
Brian Gough a4b9b18109 Merge pull request #36402 from overleaf/bg-zod-move-safe-path-tests
move safe path tests from zodHelpers to web

GitOrigin-RevId: 3bb25fa108a4a0da0bed1ae60fabfdd47ed76283
2026-09-17 11:58:29 +00:00
KristinaandJimmy Domagala-Tang 9c005e4e54 [web/document-updater] display preview for accepted/rejected tracked changes (#36240)
* [web] add preview payload to track-change notification types

* [doc-updater] pass accepted/rejected change data through to web for previews

* [web] snapshot change preview onto accepted/rejected notifications

* [web] render resolved change previews instead of accepted/rejected count lines

* [web] add unit coverage for accepted/rejected change preview flow

* fix: notification carries multiple previews per accept/reject batch; extract shared group helper

* fix: one preview per accept/reject action, drop adjacency grouping

* fix: move buildResolvedChangePreviews out of the email builder class

* fix: type error, make tests more explicit

* fix: render resolver below preview

* fix: overflow text, alignment

* fix: test error

* fix: resolved count

* [document-updater/web] send sparse change preview instead of full doc lines

* fix: store sparse preview, hydrate at render, drop CE gate

* fix: advance slice cursor past tracked-delete text in sparse preview

* fix: inline buildChangeGroupPreview

* fix: changePreviewBuilder -> sparseChangePreview

* fix: rm change_contributors

* fix: copilot flagged testing issues

* fix: hydrate and truncate change preview at write time

* fix: avoid materializing full doc text when slicing preview window

* fix: update reject preview test to hydrated shape

* fix: accepted delete removing context

* [document-updater/web] split resolved change previews into one per change cluster

* fix: narrow cluster userIds to string[] for typecheck

* feat: updating to use zod schema for previews

---------

Co-authored-by: Jimmy Domagala-Tang <jimmy.domagala-tang@overleaf.com>
GitOrigin-RevId: 0740713c715a61a220180f353e497b27da6a5b0f
2026-09-17 11:58:14 +00:00
Andrew Rumble d9b8aa1322 Merge pull request #36592 from overleaf/ar-remove-unused-output-zip-query-params
[web] remove unused query params from download all link

GitOrigin-RevId: e6c1ac8d8c7f369d7ea99c39ed0f0c3c596580b7
2026-09-17 11:58:00 +00:00
Alf EatonandClaude Fable 5 44315375fa Improve the Dimensions search feature (#36386)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
GitOrigin-RevId: 3d1ca7883102955dac3bc4a2e56c72975d0a3d20
2026-09-17 11:57:33 +00:00
Alf Eaton 1f394b32dc Copy asset rules into dev webpack config (#36371)
GitOrigin-RevId: 0b77675cf17cf0f023d0ffa3b9568621774c2a7f
2026-09-17 11:57:27 +00:00
Alf EatonandMathias Jakobsen 8c869db734 Replace unload handlers with visibilitychange (#36387)
Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: 3b52b09445597d93eb5fdfa5a343fbc2fac14d6c
2026-09-17 11:57:24 +00:00
Mathias Jakobsen aac9e669a3 Merge pull request #36548 from overleaf/jd-upload-file-delete-icon
[web] Use themed danger colour for figure modal's remove icon

GitOrigin-RevId: b881d3a08d22636c5c521a114499b650af6e6c82
2026-09-17 11:57:18 +00:00
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
Mathias Jakobsen 51ae580da9 Merge pull request #36539 from overleaf/mj-misc-dark-mode-modals-core1
[web] Add dark mode to misc editor modals

GitOrigin-RevId: 3d7bd45476b0f814abfc26fa3da3eecca54342e8
2026-09-17 11:57:06 +00:00
Mathias Jakobsen 034b9e35be Merge pull request #36573 from overleaf/mj-review-panel-modal-theme
[web] Add theme support to review panel modal

GitOrigin-RevId: e5bfc4a4affdb6352e81bbf835d64832ec249422
2026-09-17 11:57:02 +00:00
Jimmy Domagala-Tang 73ef3f6439 fix: remove webkit patch for safari input height jumping on persistent scrollbars since it causes a full on crash in firefox (#36589)
GitOrigin-RevId: a64fcae032ad8370c67b9e0a05b54c2e0759d40f
2026-09-17 11:56:56 +00:00
Alexandre Bourdin c861628684 Merge pull request #36208 from overleaf/ab-labs-description-headings-code
[web] Support headings and code in labs experiment descriptions

GitOrigin-RevId: 2a85f92fb5f0ce0696c1056087108ef2599547de
2026-09-17 11:56:43 +00:00
Alexandre Bourdin 329eca74c1 Merge pull request #36210 from overleaf/ab-fix-focus-mode-shortcut-linux
[web] Fix Focus mode shortcut showing Mac control glyph on non-Mac platforms

GitOrigin-RevId: d2f9f068ab9a2585813fbb777a6ab4fb41d386a2
2026-09-17 11:56:40 +00:00
Domagoj Kriskovic 0adf9ea45c [visual-markdown-editor] Support for images for in project files
GitOrigin-RevId: 488ebcfc6429cfa2ce4f919f8c736822c80fdca1
2026-09-17 11:56:36 +00:00
Copilotandthomas- 490c2141d2 Remove outdated humans.txt file (#36547)
* Remove outdated humans.txt file

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: thomas- <2176518+thomas-@users.noreply.github.com>
GitOrigin-RevId: cbeab28912ca8256c052d42a0ba2cf0b7790feef
2026-09-17 11:56:13 +00:00
Maria Florencia Besteiro Gonzalez 173081aa6f Add user affiliations to Library page to fix affiliation widget on Commons (#36522)
* load affiliations data when rendering library page

* address Copilot review feedback on PR #36522

- default userAffiliations to [] if getUserFullEmails fails, matching
  ProjectListController's error handling, so Library/Trash still render
  when the institutions service is unavailable
- stop mutating the affiliation object when attaching the email
- rename a misleading test title (affiliation is not necessarily confirmed)
- fix sidebar-ds-nav "hides the widget" tests: they were only waiting for
  the /api/project fetch to be called, not for the project list state to
  settle, so they passed even before the affiliations check ran

GitOrigin-RevId: 7d04ae7f7dc8d1526c2deb8959099f6e9fe9c4ee
2026-09-17 11:56:03 +00:00
Mathias Jakobsen 531718c874 Merge pull request #36521 from overleaf/mj-project-list-themed-modals
[web] Add theme support to most project list modals

GitOrigin-RevId: fd61f096c2a3f021795c30a490c7fe2d4dc13100
2026-09-17 11:55:59 +00:00
Antoine Clausse a6b7329e47 [web] Render address form above payment element on Stripe checkout (#36209)
* [web] render address form above payment element on Stripe checkout

Changing country across Stripe regions (US/CA vs rest) remounts the Elements
tree and clears any entered card details. Rendering the address form (which
contains the country selector) first lets users settle the country before
entering payment details.

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

* [web] gate checkout address-first order behind checkout-address-order split test

Per PR review: the reorder needs testing, so it is now behind the
checkout-address-order split test (default keeps the current payment-first
order). With the enabled variant the heading becomes "Payment details", since
"Select a payment method" no longer sits above the payment element.

Part of #36429

* Rename `checkout-address-order` to `checkout-address-first`

GitOrigin-RevId: 9c861b1013a284b10757fc416bcdc5610790d582
2026-09-17 11:55:56 +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 a6792af5b1 Merge pull request #36225 from overleaf/jpa-zod-web-final
[web] fully adopt strict zod schema and enforce in tests

GitOrigin-RevId: 1bb03ed3a819be6de38c8ca5758b3909cfa23318
2026-09-17 11:55:44 +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
Eric Mc Sween 2d3474fbdb Merge pull request #36494 from overleaf/em-remove-visual-options
Remove the Options object from the visual editor extensions

GitOrigin-RevId: f06e60b88ef77d3a670d7d956d1a86c116d71873
2026-09-17 11:55:18 +00:00
Mathias Jakobsen 33e2a1e282 Merge pull request #36526 from overleaf/mj-command-palette-network-stall-files
[web] Avoid searching files when network is stalled

GitOrigin-RevId: 08707b1c8a7e0088e8fee6ead3e74bdd807514c7
2026-09-17 11:55:12 +00:00
Mathias Jakobsen 1edb50de7b Merge pull request #36505 from overleaf/mj-themed-url-field
[web] Enable dark mode url fields

GitOrigin-RevId: 97e820e773e9d1528a5e852f10fa31fab84a185b
2026-09-17 11:55:09 +00:00
ilkin-overleaf 0ee4158abe Merge pull request #36392 from overleaf/ii-audit-logs-survey-removal
[web] Remove the feedback survey link from audit logs page

GitOrigin-RevId: f0b662146cec72e1a805387a0566154aab82c892
2026-09-17 11:55:00 +00:00
Malik Glossop f534349991 Merge pull request #36490 from overleaf/copilot/fix-flaky-test-sends-invites
Stabilize flaky ShareProjectModal invite JSDOM test

GitOrigin-RevId: c91abb89f1d16c0347de11287ee26f1c885edba8
2026-09-17 11:54:46 +00:00
Andrew Rumble ff14d94c04 Merge pull request #33538 from overleaf/ar-remove-web-transform-vitest
[web] remove mocha-to-vitest transform script

GitOrigin-RevId: b33f1587846640a8823ff963e789cde4aaae081f
2026-09-17 11:54:28 +00:00
Kristina 42f441b498 [web] disable editor tabs in review panel tests (#36504)
GitOrigin-RevId: baefd7028b89c1a157a7f279452c953843031f08
2026-09-17 11:54:12 +00:00
Kristina 3e11985e59 [web] prevent dangling comments by using the thread's doc id in operations (#36423)
GitOrigin-RevId: 9f3ddf282a058e92419e772b583169ac8bfe4af9
2026-09-17 11:54:06 +00:00
Mathias Jakobsen 2cb515ac2f Merge pull request #36463 from overleaf/mj-themed-history-modals
[web] Add theme support to history modals

GitOrigin-RevId: 10cc2176b91213342e066fad8ff0eba265d868ec
2026-09-17 11:54:00 +00:00
Mathias Jakobsen 6a800028be Merge pull request #36474 from overleaf/mj-themed-file-tree-modals
[web] Add dark mode file tree modals

GitOrigin-RevId: 8bfd548eedd16fd6848a9d6460cdd7f1be50d759
2026-09-17 11:53:55 +00:00
Mathias Jakobsen 99f0b2d562 Merge pull request #36446 from overleaf/mj-themed-keyboard-shortcuts
[web] Add theme support to keyboard shortcuts modal

GitOrigin-RevId: c92088cbe81a58431627b2343df5d90b68f2bc60
2026-09-17 11:53:51 +00:00
Mathias Jakobsen 67478b1b56 Merge pull request #36453 from overleaf/mj-themed-table-generator-modals
[web] Add dark mode support for table generator modals

GitOrigin-RevId: aeb0d0e8eae2b4257c287cc322d1eb7b8d9b9a35
2026-09-17 11:53:48 +00:00
Mathias Jakobsen dfda63f060 Merge pull request #36470 from overleaf/mj-themed-uppy-figure-modal
[web] Use themed uppy in figure modal

GitOrigin-RevId: 54e92a40516a947befdd4d1f758dae631703672f
2026-09-17 11:53:44 +00:00
Mathias Jakobsen a7c830ee23 Merge pull request #36438 from overleaf/mj-themed-figure-modal
[web] Support theming in figure modal

GitOrigin-RevId: 31fcc5b8585cb9f81ff073fbc07b7b36e04ba54d
2026-09-17 11:53:41 +00:00
Mathias Jakobsen e8ee19d17d Merge pull request #36408 from overleaf/mj-context-menu-flag-teardown
[web] Tear down editor-context-menu flag

GitOrigin-RevId: 80cc2ebaf62ec1bd6064b0f96b884d159a9d4b5f
2026-09-17 11:53:38 +00:00
Mathias Jakobsen 38eb3ddfa6 Merge pull request #36426 from overleaf/mj-wrong-variable-removed
[web] Remove typoed themed variable

GitOrigin-RevId: ec23ed1819f78cfcfb42c578ebe58373ddbef6b1
2026-09-17 11:53:34 +00:00