* [web] Redirect missing AI add-on purchase to subscription dashboard
The two error paths in `previewAddonPurchase` redirected to
`/user/subscription/plans#ai-assist`, but the `#ai-assist` anchor was
removed when the AI Assist add-on was retired, so users land at the top
of the plans page with no context. Align both with the other error
branches in the same function and the `plans-2026-phase-1` enabled
branch, which already redirect to
`/user/subscription?redirect-reason=ai-assist-unavailable` — the
subscription dashboard shows the matching warning alert
(`redirect-alerts.tsx`).
Update the acceptance test to match the new redirect target.
Closes#34074
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* [web] Update ai-assist-unavailable warning to reflect bundled AI features
The previous copy said "AI Assist isn't available to you due to your
current subscription type", which read as a hard block. Now that the AI
Assist add-on has been retired and AI features are included with every
paid plan, the warning should point users to the pricing page instead of
implying their plan can't access AI at all.
Keep the existing translation key for now — a follow-up can rename it
once #33624 (AI page CTA destination) is resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* [web] Link the ai-assist-unavailable warning to the pricing page
* [web] Rename key `ai_assist_unavailable_due_to_subscription_type` -> `ai_assist_unavailable`
* [web] Update french and german translations
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GitOrigin-RevId: ae1319fa5b857d8f292de77c82ef0bda1c7ad144
* Add tests on plurals
* Update `collabs_per_proj` and its pluralisations
* Update `n_user` and its pluralisations
* Update `showing_x_results` and its pluralisations
* Update `show_x_more_projects` and its pluralisations
* `bin/run web npm run extract-translations`
* Populate `_plural` keys in non-en locales
For 2-form languages (da, de, es, fi, fr, it, nl, no, pt, sv, tr), copy
the existing bare-key value into the new `_plural` sibling to prevent
i18next from falling back to English for count!=1.
Also remove orphan singular keys (`collabs_per_proj_single`,
`showing_1_result*`) left over from the previous commits.
Bare-key values remain in their original plural form pending translator
review — count=1 will still render the plural form in non-en until
translators flip those to singular. Multi-form (cs, pl, ru) and
single-form (ja, ko, zh-CN, zh-TW) locales are unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* Flip non-en bare-key values to singular form
Per review, the i18next v3 plural convention uses the bare key for count=1
(singular) and `_plural` for count!=1. The non-en bare-key values were
left as the original plural form by the previous commit so the `_plural`
siblings could be copied from them; this commit flips the bare values to
the singular form per language.
Languages where singular and plural noun forms coincide (Finnish, Swedish,
Turkish) are unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* Apply suggestions from code review
Co-authored-by: Olzhas Askar <olzhas.askar@gmail.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Olzhas Askar <olzhas.askar@gmail.com>
GitOrigin-RevId: 628513ca792c2dcce023247e52b7320e2741cc54
* [web] Replace `pro` with `commons` wording on institutional subscriptions
Replaces the wording in several places:
- subscription settings
- email tags
- features tooltip
- institution portal
GitOrigin-RevId: 1b9a0e51245ed8a41865300d9e9d555bc05e6c17
* Update hrefs
* Revert link on expired subscriptions
* Revert hrefs of other buttons
* Use `plans-2026-phase-1` feature flag
GitOrigin-RevId: 3fe489c6ec192adc2fb836b07429dc2a11f9a57f
* Remove stale "You already have a subscription" notification after cancel/plan change
The notification was derived from a server-rendered meta tag set at page load,
so it persisted through cancel and plan-change flows. Now derived directly from
the URL param on the client; the param is stripped on cancel button click
(replaceState) and before plan-change reloads (location.replace via
reloadWithoutHasSubscription helper).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix format
* Update services/web/test/frontend/features/subscription/components/dashboard/subscription-dashboard.test.tsx
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix change-plan tests after location.reload → location.replace migration
reloadWithoutHasSubscription calls location.replace() not location.reload(),
so update assertions accordingly. Also stub toString() to return the jsdom
origin so FlashMessage's replaceState call doesn't throw a SecurityError.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Guard reloadWithoutHasSubscription against empty URL
When called after component unmount, useLocation's toString() returns '',
causing new URL('') to throw. No-op early to avoid the exception.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Guard against empty URL in history state replacement for subscription cancellation
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
GitOrigin-RevId: 8408ee971adf038e2d819eae5df060ace62a7e14
* [web] Update paywall copy for plans-2026 AI tiers
Replace AI-related strings in upgrade/paywall UI when the
plans-2026-phase-1 flag is enabled:
- Add `higher_ai_allowance` ("Higher AI allowance") for paywall bullet
lists and body text; keep `higher_ai_limits` ("Higher AI limits") for
the subscriptions dashboard, which uses different wording per spec
- Update three locale strings to use "allowance" instead of "limits":
`access_all_premium_features_ai`, `plus_additional_collaborators_and_more`,
`upgrade_to_add_more_collaborators_and_more`
- Fix casing: `upgrade_to_review` "Upgrade to Review" → "Upgrade to review"
- Switch upgrade-benefits and onboarding prompt from `higher_ai_limits`
to `higher_ai_allowance`
- Fix subscriptions free-plan to show `higher_ai_limits` instead of
`get_unlimited_ai` under the plans2026 flag
- Fix compile-timeout button to show "Start free trial" under plans2026
instead of "Start a free trial"
- Update two Cypress assertions for the new track-changes modal title
* Update extracted translations for higher AI allowance
* Remove "start a free trial" with exclamation
* Remove "get unlimited ai" translation entries
GitOrigin-RevId: 12300d94dc81c5407a21d4682d5714d7284c31b0
* Remove Font Awesome files and references
* Remove dead Font Awesome references
* Remove icon reference from `linkPrintNewTab` mixin
* Remove unused `customValidationMessage`
* Remove dead Font Awesome references
* Remove FA reference and disable "Monthly metrics emails" subscription link when loading
* Revert daterangepicker icon styles
GitOrigin-RevId: e08d4b61e35bae305f771d9949c18edf8a163575
* adding plural translations for the languages that were easy to test with the help of AI
* adding remaining translations
* adding your_subscriptions
* running make sort_locales
* fixing nl.json to make it formal You
GitOrigin-RevId: 7510e2f8eee87fd2a256ece434cc59e6877893e6
* Convert OLModal to named exports only
* Make closeButton the default for OLModalHeader
* Set `closeButton={false}` for modal that is not dismissible
* Fix duplicated imports
* Remove another unnecessary `closeButton` prop
* Fix import
---------
Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>
GitOrigin-RevId: ddd7be6e59a966ac634683d2494d6e9d2c3732e6
* Create eslint rule for requiring loadingLabel prop when isLoading is specified on OLButton
* Add `loadingLabel` props for OLButton components with `isLoading`
* Clarify loading label and button loading state
GitOrigin-RevId: 89279d5b4c346f9c3b67a59d0db822a2ff04314a
* Show Recurly's line items breakdown in subscription change preview
* fix rounding, filter items that cancel each other out
GitOrigin-RevId: 0f5d71b3917ce8a52ff36608a6ec6280fe7d38ce
* [web] Group audit log link in settings
Adds a link to access the `/manage/groups/:subscription_id/audit-logs`
endpoint
* [web] Add `group-audit-logs` split test for gradual rollout
GitOrigin-RevId: 60d6c9917ca54ff5e228996e7454a901f0f3b9ca
* [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
* Add permissions checks for AI assist when trying to buy the addon
* more explicit check for DuplicateAddOnError
* remove useCapabilities()
GitOrigin-RevId: 1979e27410981e2ef020cecc731e228483d3315a
[web] Make user able to sync their email address in subscription dashboard for Stripe subscription
GitOrigin-RevId: 9abdc0e18ebea29b18c2041130946b9e50fa43db
* handle 3DS challenges on the subscription dashboard
* add `/user/subscription/sync` endpoint
* upgrade `stripe-js` & rm `react-stripe-js`
* group related unit tests together
* add modules `SubscriptionController` unit tests and convert to async/await
* add `StripeClient` unit tests for 3DS failure
GitOrigin-RevId: 9da4758703f6ef4ec08248b328abddbbdd8e44ad