[pull] master from supabase:master#800
Merged
pull[bot] merged 17 commits intocode:masterfrom Mar 31, 2026
Merged
Conversation
## Screenshots On a number input with units: <img width="660" height="162" alt="image" src="https://github.com/user-attachments/assets/1758a6d9-0836-4d41-80d1-97a03292db91" /> focused state: <img width="651" height="71" alt="image" src="https://github.com/user-attachments/assets/a92a5c39-2c7e-4c5f-9e4b-eb89810cc45c" /> On a textarea: <img width="989" height="294" alt="image" src="https://github.com/user-attachments/assets/cc696cb9-3671-4719-bdd8-daa1aea4f041" />
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Fixes typo in Dashboard ## What is the current behavior? In the [Billing Dashboard](https://supabase.com/dashboard/org/_/billing), when one updates the spend cap: <img width="2376" height="502" alt="CleanShot 2026-03-29 at 14 52 01@2x" src="https://github.com/user-attachments/assets/5169fc01-cf78-4450-9184-7d7d6a28b000" /> The pop-out modal has a typo (states "includedthen" instead of "included, then"): <img width="1182" height="1408" alt="CleanShot 2026-03-29 at 14 52 17@2x" src="https://github.com/user-attachments/assets/53622f29-cc02-4138-aa83-4e098d31d1a2" /> ## What is the new behavior? Updated the line: ```jsx <p className="text-xs pl-4">{item.plans['pro']}</p> ``` to ```jsx <p className="text-xs pl-4"> {Array.isArray(item.plans['pro']) ? item.plans['pro']?.join(', ') : item.plans['pro']} </p> ``` Fixed the issue: <img width="1302" height="1072" alt="CleanShot 2026-03-29 at 15 27 30@2x" src="https://github.com/user-attachments/assets/722056c8-7b62-4993-83bb-a2ed4cbc5264" /> ## Additional context [A user reported the error](https://supabase.frontapp.com/open/msg_32qr4hpa?key=RjpHZRymA4HTNLMFa-PQ6l_Ne7L66x8A) The file containing pricing data "[packages/shared-data/pricing.ts](https://github.com/supabase/supabase/blob/7d7de475ecf31f95d37199456482b665c80aadc8/packages/shared-data/pricing.ts#L125)" has the following JS object: ```js // example problematic entry plans: { //rest of object pro: ['8 GB disk size per project included', 'then $0.125 per GB'], //rest of object }, ... // some other entry plans: { //rest of object pro: false, //rest of object } ... ``` The relevant content in the Dashboard is an array with two entries: > ['8 GB disk size per project included', 'then $0.125 per GB'] The [modal file](https://github.com/supabase/supabase/blob/7d7de475ecf31f95d37199456482b665c80aadc8/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx#L174) deconstructs it within the following element: ```jsx {usageItems.map((item: any) => { return ( <Table.tr key={item.title}> <Table.td> <p className="text-xs pl-4">{item.title}</p> </Table.td> <Table.td> <p className="text-xs pl-4">{item.plans['pro']}</p> <!--------RELEVANT LINE--> </Table.td> </Table.tr> ) })} ``` It doesn't bother to separate entries in the array, so the element just concatenates the two entries without any spacing. --------- Co-authored-by: Gildas Garcia <1122076+djhi@users.noreply.github.com>
## Context Related to marketplace integrations, now shifting wrappers over to the new UI (feature flagged) ## Changes involved - Added a "Installed" indicator if the integration is installed <img width="1155" height="171" alt="image" src="https://github.com/user-attachments/assets/6de2ea49-64bb-46af-ba04-db6629ec7546" /> - New UI will only show the "Add new wrapper" + "Recent wrappers" table only if the required extensions have been installed (Current UI shows them both irregardless) <img width="1147" height="518" alt="image" src="https://github.com/user-attachments/assets/c428ff70-4a52-401e-a369-6948100d1cef" /> - Once required extensions are installed, the wrappers tab will also show up - Currently the wrappers tab only shows up after a wrapper is created - This change will affect the existing behaviour too (reckon it makes more sense this UX) <img width="1143" height="611" alt="image" src="https://github.com/user-attachments/assets/b05f5196-854e-41c1-8a01-7a5e5cca9d4e" /> - In the install integration sheet, only extensions that have yet to be installed will users be allowed to adjust schema selection for <img width="553" height="583" alt="image" src="https://github.com/user-attachments/assets/045e185a-6235-4dc5-a984-b039b64cd7fd" /> - Likewise, if the extension has already been installed, it will be omitted from the SQL code output <img width="575" height="267" alt="image" src="https://github.com/user-attachments/assets/5e6c0a75-5738-4a0d-9e33-ff19aed074d3" /> - Updated docs URL for some of the integrations (vault, database webhooks, graphql) - Nit: This one's bugged me for the longest time but remove extra border bottom in "Recent wrappers" table <img width="1068" height="177" alt="image" src="https://github.com/user-attachments/assets/1d6e24cf-072a-4605-8eca-ee0f37406d74" /> FWIW i think the integrations UI for wrappers is due for an update, but we'll leave things as they are for now - at least until we're bit more clearer on the requirements for marketplace integrations (less we make changes now which then have to be redone again later) ## To test - [ ] Verify that you can install + create wrappers still with the new UI - [ ] Verify that behaviour is status quo with flag off (except the ones mentioned explicitly)
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix ## What is the current behavior? The `getNextPageParam` function in `database-queue-messages-infinite-query.ts` uses `<=` instead of `>=`, which means pagination never stops. Since the result length is always less than or equal to the page size, `hasNextPage` is always `true`, causing infinite API requests when viewing queue messages in Studio. Resolves #44291 ## What is the new behavior? Uses `>=` to correctly detect when there are more pages, consistent with every other infinite query in the codebase: - `database-cron-jobs-infinite-query.ts` uses `>=` - `users-infinite-query.ts` uses `>=` - `database-cron-jobs-runs-infinite-query.ts` uses `< PAGE_SIZE` to return `undefined` (equivalent logic) ## Additional context One character change: `<=` to `>=` on line 112.
## Context Resolves FE-2923 There's an issue with creating s3 keys in the storage settings at the moment, where naming your key throws a form field validation error. This PR fixes that - not sure when this was introduced though, but the main fix was just using `field` from `render` instead of calling `register` ## To test - [ ] Verify that you can create an s3 access key via the storage settings
## Summary Remove the privacy policy update notification banner that was added for the March 2026 policy update. The effective date has passed and users have had sufficient notice. ## Changes - Remove `PrivacyUpdateBanner` component from `AnalyticsSettings.tsx` and its unused imports - Remove banner usage from the organizations list page and org projects page - Remove `PRIVACY_NOTICE_ACKNOWLEDGED` localStorage key ## Testing No setup needed - this is a removal of UI elements. Tested on Vercel preview: - [x] Organizations page loads without the banner - [x] Org projects page loads without the banner - [ ] No console errors on either page - [x] Analytics settings page still renders correctly ## Linear - fixes GROWTH-692
## Problem #44282 introduced a change in design for inputs used outside a form layout such as search inputs on the project list page ## Solution Fix padding and spacing
Those queries will always error out anyway as there's no data in place yet.
## Problem - The vault new secret form still uses `formik` and we want to remove it in favour of `react-hook-form` to keep only one form library - The vault new secret form does not follow the design system guidelines (`Modal` instead of `Dialog`) ## Solution - Migrate to `react-hook-form` - Apply the design system guidelines ## Screenshots Before: <img width="539" height="396" alt="image" src="https://github.com/user-attachments/assets/c1beda65-9bad-4ff6-9f5c-64b2bea615e5" /> After: <img width="452" height="384" alt="image" src="https://github.com/user-attachments/assets/86bfff23-924c-4e1d-9b28-66e131a5db1d" />
## Problem Some forms register their inputs incorrectly by calling `control.register` and spreading the `field`. This makes the form unusable. ## Screenshots Design of the new analytics buckets table Before: <img width="554" height="564" alt="image" src="https://github.com/user-attachments/assets/6ddf7ead-f576-44c4-b184-8102a52a22e2" /> After: <img width="395" height="791" alt="image" src="https://github.com/user-attachments/assets/ee85fcdd-b2a5-410d-9296-8bd6f1aa0b2f" />
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix ## What is the current behavior? SAML metadata URL cannot be saved with an empty string; it works through the management API <img width="781" height="412" alt="image" src="https://github.com/user-attachments/assets/586d3de2-30bc-4e8a-9d4b-b039685cb455" /> ## What is the new behavior? Allow saving SAML 2.0 config with an empty SAML metadata URL
…43281) When importing a CSV file, empty cells were always imported as empty strings with no way to import NULL values instead. This adds a "Treat empty cells as NULL" checkbox to the import configuration panel. When enabled, PapaParse's transform option converts empty strings to null before the data is parsed and previewed, so the imported rows correctly contain NULL rather than empty strings. Fixes #43258. ## What kind of change does this PR introduce? Bug fix ## What is the current behavior? Empty cells in a CSV file are always imported as empty strings with no way to import NULL values instead. Fixes #43258. ## What is the new behavior? "Treat empty cells as NULL" checkbox is added to the import configuration panel. When enabled, empty cells are imported as NULL instead of empty strings. Toggling the checkbox instantly re-parses the preview. ## Additional context The fix uses PapaParse's transform option to convert empty strings to null before parsing. Applies to both file uploads and pasted text. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Charis Lam <26616127+charislam@users.noreply.github.com>
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? New UI to help users create partitioned queues when supported with pg_partman. Updated the existing UI from 2024 to be a bit more user friendly ## Walkthrough **Extension management page** <img width="1575" height="155" alt="image" src="https://github.com/user-attachments/assets/4b1895cf-4555-40c5-8a11-54208748b169" /> **pg partman call out in queues** <img width="664" height="771" alt="image" src="https://github.com/user-attachments/assets/92feff48-72bb-4816-b0aa-e24e70fa148e" /> **Updated recommended section with sane defaults** <img width="663" height="918" alt="image" src="https://github.com/user-attachments/assets/716d9411-f708-4b4d-8027-7ca7a41062c8" /> **Warning on disabling extension** <img width="431" height="392" alt="image" src="https://github.com/user-attachments/assets/129ab1eb-2bcc-49ca-a20c-72422460c60e" /> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…extension FE-2843 (#44357) ## Problem On self-hosted Supabase instances where the `pg_stat_statements` extension is not installed, the Observability Overview page automatically queries the extension on every page load. This produces "relation pg_stat_statements does not exist" errors in Postgres logs for all projects without the extension. Additionally, if a user navigated to the Query Performance page, they received a generic error with no actionable guidance. A secondary issue allowed malformed sort URL params (e.g. `?sort=created_at:asc&order=asc`) to be interpolated directly into SQL ORDER BY clauses. ## Fix - Wrapped the `useSlowQueriesCount` SQL in a `CASE WHEN EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements')` guard. The query now returns 0 silently instead of erroring when the extension is absent. - Added a `VALID_SORT_COLUMNS` whitelist in `generateQueryPerformanceSql`. Invalid column names from URL params are rejected and the query falls back to the preset default ORDER BY. - When the Query Performance page fails because `pg_stat_statements` does not exist, a `warning` admonition now appears with "Enable it in Database -> Extensions" guidance instead of a generic destructive error. The Sentry capture is skipped for this expected configuration state. - Extracted `buildSlowQueriesCountSql` as a testable function and added unit tests for both fixes. ## How to test **Extension not installed (self-hosted):** 1. Run a self-hosted Supabase instance without the `pg_stat_statements` extension enabled. 2. Navigate to the Observability Overview page. 3. Check Postgres logs -- no "relation pg_stat_statements does not exist" errors should appear. 4. Navigate to the Query Performance page. 5. Expected: a yellow warning admonition appears saying the extension is not enabled, with a link to Database -> Extensions. No red error. **Extension installed (normal flow):** 1. With `pg_stat_statements` installed, navigate to Observability Overview. 2. Expected: slow queries count loads as normal. 3. Navigate to Query Performance -- data loads as normal. **Invalid sort URL param:** 1. Navigate to `/project/<ref>/observability/query-performance?sort=created_at:asc&order=asc`. 2. Expected: the page loads and falls back to the default sort order (total time descending). No SQL error in logs. **Unit tests:** ``` node apps/studio/node_modules/vitest/dist/cli.js run --no-coverage \ apps/studio/components/interfaces/Observability/useSlowQueriesCount.test.ts \ apps/studio/components/interfaces/QueryPerformance/useQueryPerformanceQuery.test.ts ``` All 28 tests should pass. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
`useOrgSSOConfigQuery` had an internal plan-based gate (`canSetupSSOConfig`) that permanently disabled the query for non-team/enterprise orgs. The fix removes the redundant plan gate from the query hook, plan-based access is already controlled upstream via the entitlement check in the component.
…44396) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix ## Summary Use supabase project url for CRUD custom oauth providers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )