diff --git a/web/app/components/snippets/components/__tests__/save-before-leaving-dialog.spec.tsx b/web/app/components/snippets/components/__tests__/save-before-leaving-dialog.spec.tsx deleted file mode 100644 index fcff9180549..00000000000 --- a/web/app/components/snippets/components/__tests__/save-before-leaving-dialog.spec.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { render, screen } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import { expectLoadingButton } from '@/test/button' -import SaveBeforeLeavingDialog from '../save-before-leaving-dialog' - -describe('SaveBeforeLeavingDialog', () => { - it('should render the trigger and call discard or save actions', async () => { - const user = userEvent.setup() - const onDiscard = vi.fn() - const onSave = vi.fn() - - render( - leave snippet} - onDiscard={onDiscard} - onSave={onSave} - />, - ) - - expect(screen.getByText('snippet.saveBeforeLeavingTitle')).toBeInTheDocument() - - await user.click(screen.getByRole('button', { name: 'snippet.doNotSave' })) - await user.click(screen.getByRole('button', { name: 'snippet.saveAndExit' })) - - expect(onDiscard).toHaveBeenCalledTimes(1) - expect(onSave).toHaveBeenCalledTimes(1) - }) - - it('should disable destructive and save actions according to dialog state', () => { - render( - , - ) - - expect(screen.getByRole('button', { name: 'snippet.continueEditing' })).toBeDisabled() - expect(screen.getByRole('button', { name: 'snippet.doNotSave' })).toBeDisabled() - expectLoadingButton(screen.getByRole('button', { name: 'snippet.saveAndExit' })) - }) -}) diff --git a/web/app/components/snippets/components/__tests__/snippet-children.spec.tsx b/web/app/components/snippets/components/__tests__/snippet-children.spec.tsx index f4ed414ace1..b52a703bc68 100644 --- a/web/app/components/snippets/components/__tests__/snippet-children.spec.tsx +++ b/web/app/components/snippets/components/__tests__/snippet-children.spec.tsx @@ -41,22 +41,14 @@ describe('SnippetChildren', () => { it('should render snippet header and workflow panel with forwarded props', () => { const callbacks = { - onCancel: vi.fn(), - onEdit: vi.fn(), - onExitEditing: vi.fn(), - onExitEditingWithoutSave: vi.fn(), onPublish: vi.fn(), - onSaveAndExitEditing: vi.fn(), } render( , @@ -66,10 +58,7 @@ describe('SnippetChildren', () => { expect(screen.getByTestId('snippet-workflow-panel')).toBeInTheDocument() expect(capturedHeaderProps).toEqual(expect.objectContaining({ snippetId: 'snippet-1', - canDiscardChanges: true, canSave: true, - hasDraftChanges: true, - isEditing: true, isPublishing: false, ...callbacks, })) diff --git a/web/app/components/snippets/components/save-before-leaving-dialog.tsx b/web/app/components/snippets/components/save-before-leaving-dialog.tsx deleted file mode 100644 index 6a0da78ef8f..00000000000 --- a/web/app/components/snippets/components/save-before-leaving-dialog.tsx +++ /dev/null @@ -1,78 +0,0 @@ -'use client' - -import type { ReactElement } from 'react' -import { - AlertDialog, - AlertDialogActions, - AlertDialogCancelButton, - AlertDialogConfirmButton, - AlertDialogContent, - AlertDialogDescription, - AlertDialogTitle, - AlertDialogTrigger, -} from '@langgenius/dify-ui/alert-dialog' -import { useTranslation } from 'react-i18next' - -type SaveBeforeLeavingDialogProps = { - open?: boolean - onOpenChange?: (open: boolean) => void - trigger?: ReactElement - disabled?: boolean - saveDisabled?: boolean - loading?: boolean - onDiscard: () => void | Promise - onSave: () => void | Promise -} - -const SaveBeforeLeavingDialog = ({ - open, - onOpenChange, - trigger, - disabled, - saveDisabled, - loading, - onDiscard, - onSave, -}: SaveBeforeLeavingDialogProps) => { - const { t } = useTranslation('snippet') - - return ( - - {trigger && ( - - )} - -
- - {t('saveBeforeLeavingTitle')} - - - {t('saveBeforeLeavingDescription')} - -
- - - {t('continueEditing')} - - - {t('doNotSave')} - - - {t('saveAndExit')} - - -
-
- ) -} - -export default SaveBeforeLeavingDialog diff --git a/web/app/components/snippets/components/snippet-header/__tests__/cancel-changes.spec.tsx b/web/app/components/snippets/components/snippet-header/__tests__/cancel-changes.spec.tsx deleted file mode 100644 index 520354e6e2c..00000000000 --- a/web/app/components/snippets/components/snippet-header/__tests__/cancel-changes.spec.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import CancelChanges from '../cancel-changes' - -describe('CancelChanges', () => { - it('should render editing state without discard action when changes cannot be discarded', () => { - render() - - expect(screen.queryByRole('button', { name: 'snippet.discardDraft' })).not.toBeInTheDocument() - expect(screen.getByText('snippet.editingDraft')).toBeInTheDocument() - }) - - it('should confirm before discarding draft changes', async () => { - const user = userEvent.setup() - const onCancel = vi.fn().mockResolvedValue(undefined) - - render() - - await user.click(screen.getByRole('button', { name: 'snippet.discardDraft' })) - - expect(screen.getByText('snippet.discardChangesTitle')).toBeInTheDocument() - - await user.click(screen.getByRole('button', { name: 'snippet.discardChanges' })) - - await waitFor(() => { - expect(onCancel).toHaveBeenCalledTimes(1) - }) - }) -}) diff --git a/web/app/components/snippets/components/snippet-header/cancel-changes.tsx b/web/app/components/snippets/components/snippet-header/cancel-changes.tsx deleted file mode 100644 index 9e749cf967c..00000000000 --- a/web/app/components/snippets/components/snippet-header/cancel-changes.tsx +++ /dev/null @@ -1,81 +0,0 @@ -'use client' - -import { - AlertDialog, - AlertDialogActions, - AlertDialogCancelButton, - AlertDialogConfirmButton, - AlertDialogContent, - AlertDialogDescription, - AlertDialogTitle, - AlertDialogTrigger, -} from '@langgenius/dify-ui/alert-dialog' -import { memo, useCallback, useState } from 'react' -import { useTranslation } from 'react-i18next' - -type CancelChangesProps = { - canDiscardChanges: boolean - onCancel: () => void | Promise -} - -const CancelChanges = ({ - canDiscardChanges, - onCancel, -}: CancelChangesProps) => { - const { t } = useTranslation('snippet') - const [open, setOpen] = useState(false) - const [isDiscarding, setIsDiscarding] = useState(false) - - const handleDiscardChanges = useCallback(async () => { - setIsDiscarding(true) - try { - await onCancel() - setOpen(false) - } - finally { - setIsDiscarding(false) - } - }, [onCancel]) - - return ( -
- {canDiscardChanges && ( - <> - - - {t('discardDraft')} - - -
- - {t('discardChangesTitle')} - - - {t('discardChangesDescription')} - -
- - - {t('continueEditing')} - - - {t('discardChanges')} - - -
-
- ยท - - )} - {t('editingDraft')} -
- ) -} - -export default memo(CancelChanges)