Files
supabase/apps/studio/components/interfaces/SQLEditor/SqlEditorManualSaveNoticeDialog.utils.test.ts
Charis 0791b04eb8 feat(sql-editor): roll out manual saving by default (#48706)
## 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?

Feature — progresses the SQL Editor manual saving rollout, and removes a
fully rolled out feature flag.

## What is the current behavior?

Manual saving (snippets save only on an explicit Save / Cmd+S rather
than autosaving every edit) is opt-in. It requires both the
`sqlEditorManualSave` ConfigCat flag and the user turning on the
"Disable snippet auto-saving" feature preview themselves. That flag is
now fully rolled out.

## What is the new behavior?

- `sqlEditorManualSave` is removed, so the feature preview is listed for
everyone. (Delete the flag in ConfigCat after a few months.)
- New `sqlEditorManualSaveForced` flag progresses the rollout. It forces
manual saving on regardless of what the user stored previously,
including an explicit opt-out, via a new `isForced` field on
`FeaturePreview` that `initializeFlags` resolves ahead of the
localStorage lookup — so the feature preview modal reflects the forced
state too, not just the save behavior. Turning the flag off reverts
everyone who never opted in, so it remains a working kill switch.
- Users the rollout switches over get a one-time dialog on their first
SQL Editor route, explaining that snippets no longer autosave. Dismissal
persists in `sql-editor-manual-save-notice-dismissed` (allowlisted, so
it survives sign-out).
- Users who opted into the preview themselves never see the dialog — it
records their dismissal up front instead, since the notice needs to
outlive the feature preview and once the preview is retired there's no
stored opt-in left to recognize them by.
- The preview keeps its switch so users who lose their local storage can
opt in early, but once the rollout reaches them the "Disable feature"
button is disabled with a tooltip explaining why.

### To test

Turn on `sqlEditorManualSaveForced` on via the dev toolbar.

- No `supabase-ui-sql-editor-manual-save` and no dismissal key → dialog
appears on `/project/<ref>/sql`, toolbar shows the Save button. Dismiss,
reload → no dialog.
- `supabase-ui-sql-editor-manual-save` set to `false` (previously opted
out) → still forced onto manual saving, and still gets the dialog.
- `supabase-ui-sql-editor-manual-save` set to `true` → no dialog, and
the dismissal key is written automatically.
- Flag off, no opt-in → autosave, no dialog, and the "Disable autosave"
power-off button still opens the preview modal.
- Preview modal while forced → "Disable feature" is disabled with a
tooltip; another preview (e.g. Column-level privileges) still disables
normally.

## Additional context
2026-08-04 12:16:18 -04:00

43 lines
1.4 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
shouldShowManualSaveNotice,
type ShouldShowManualSaveNoticeParams,
} from './SqlEditorManualSaveNoticeDialog.utils'
const eligible: ShouldShowManualSaveNoticeParams = {
isPlatform: true,
isFeaturePreviewInitialized: true,
isForced: true,
hasOptedIntoPreview: false,
isNoticeDismissed: false,
}
describe('shouldShowManualSaveNotice', () => {
it('shows the notice to a user the rollout switches over', () => {
expect(shouldShowManualSaveNotice(eligible)).toBe(true)
})
it('does not show the notice to a user who opted into the preview themselves', () => {
expect(shouldShowManualSaveNotice({ ...eligible, hasOptedIntoPreview: true })).toBe(false)
})
it('does not show the notice once dismissed', () => {
expect(shouldShowManualSaveNotice({ ...eligible, isNoticeDismissed: true })).toBe(false)
})
it('does not show the notice when the rollout flag is off', () => {
expect(shouldShowManualSaveNotice({ ...eligible, isForced: false })).toBe(false)
})
it('does not show the notice outside of the hosted platform', () => {
expect(shouldShowManualSaveNotice({ ...eligible, isPlatform: false })).toBe(false)
})
it('does not show the notice before the feature previews have initialized', () => {
expect(shouldShowManualSaveNotice({ ...eligible, isFeaturePreviewInitialized: false })).toBe(
false
)
})
})