mirror of
https://github.com/langgenius/dify.git
synced 2026-04-04 12:00:30 -04:00
Made-with: Cursor # Conflicts: # api/controllers/console/app/workflow_draft_variable.py # api/core/agent/cot_agent_runner.py # api/core/agent/cot_chat_agent_runner.py # api/core/agent/cot_completion_agent_runner.py # api/core/agent/fc_agent_runner.py # api/core/app/apps/advanced_chat/app_generator.py # api/core/app/apps/advanced_chat/app_runner.py # api/core/app/apps/agent_chat/app_runner.py # api/core/app/apps/workflow/app_generator.py # api/core/app/apps/workflow/app_runner.py # api/core/app/entities/app_invoke_entities.py # api/core/app/entities/queue_entities.py # api/core/llm_generator/output_parser/structured_output.py # api/core/workflow/workflow_entry.py # api/dify_graph/context/__init__.py # api/dify_graph/entities/tool_entities.py # api/dify_graph/file/file_manager.py # api/dify_graph/graph_engine/response_coordinator/coordinator.py # api/dify_graph/graph_events/node.py # api/dify_graph/node_events/node.py # api/dify_graph/nodes/agent/agent_node.py # api/dify_graph/nodes/llm/entities.py # api/dify_graph/nodes/llm/llm_utils.py # api/dify_graph/nodes/llm/node.py # api/dify_graph/nodes/question_classifier/question_classifier_node.py # api/dify_graph/runtime/graph_runtime_state.py # api/dify_graph/variables/segments.py # api/factories/variable_factory.py # api/services/variable_truncator.py # api/tests/unit_tests/utils/structured_output_parser/test_structured_output_parser.py # api/uv.lock # web/app/components/app-sidebar/app-info.tsx # web/app/components/app-sidebar/app-sidebar-dropdown.tsx # web/app/components/app/create-app-modal/index.spec.tsx # web/app/components/apps/__tests__/list.spec.tsx # web/app/components/apps/app-card.tsx # web/app/components/apps/list.tsx # web/app/components/header/account-dropdown/compliance.tsx # web/app/components/header/account-dropdown/index.tsx # web/app/components/header/account-dropdown/support.tsx # web/app/components/workflow-app/components/workflow-onboarding-modal/index.tsx # web/app/components/workflow/panel/debug-and-preview/hooks.ts # web/contract/console/apps.ts # web/contract/router.ts # web/eslint-suppressions.json # web/next.config.ts # web/pnpm-lock.yaml
145 lines
4.3 KiB
TypeScript
145 lines
4.3 KiB
TypeScript
/**
|
|
* @deprecated Use `@/app/components/base/ui/dialog` instead.
|
|
* This component will be removed after migration is complete.
|
|
* See: https://github.com/langgenius/dify/issues/32767
|
|
*/
|
|
import type { ButtonProps } from '@/app/components/base/button'
|
|
import { noop } from 'es-toolkit/function'
|
|
import { memo } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import Button from '@/app/components/base/button'
|
|
import {
|
|
PortalToFollowElem,
|
|
PortalToFollowElemContent,
|
|
} from '@/app/components/base/portal-to-follow-elem'
|
|
import { cn } from '@/utils/classnames'
|
|
|
|
type ModalProps = {
|
|
onClose?: () => void
|
|
size?: 'sm' | 'md'
|
|
title: string
|
|
subTitle?: string
|
|
children?: React.ReactNode
|
|
confirmButtonText?: string
|
|
onConfirm?: () => void
|
|
cancelButtonText?: string
|
|
onCancel?: () => void
|
|
showExtraButton?: boolean
|
|
extraButtonText?: string
|
|
extraButtonVariant?: ButtonProps['variant']
|
|
onExtraButtonClick?: () => void
|
|
footerSlot?: React.ReactNode
|
|
bottomSlot?: React.ReactNode
|
|
disabled?: boolean
|
|
containerClassName?: string
|
|
wrapperClassName?: string
|
|
clickOutsideNotClose?: boolean
|
|
}
|
|
const Modal = ({
|
|
onClose,
|
|
size = 'sm',
|
|
title,
|
|
subTitle,
|
|
children,
|
|
confirmButtonText,
|
|
onConfirm,
|
|
cancelButtonText,
|
|
onCancel,
|
|
showExtraButton,
|
|
extraButtonVariant = 'warning',
|
|
extraButtonText,
|
|
onExtraButtonClick,
|
|
footerSlot,
|
|
bottomSlot,
|
|
disabled,
|
|
containerClassName,
|
|
wrapperClassName,
|
|
clickOutsideNotClose = false,
|
|
}: ModalProps) => {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<PortalToFollowElem open>
|
|
<PortalToFollowElemContent
|
|
className={cn('z-[9998] flex h-full w-full items-center justify-center bg-background-overlay', wrapperClassName)}
|
|
data-modal-root="true"
|
|
onClick={clickOutsideNotClose ? noop : onClose}
|
|
>
|
|
<div
|
|
className={cn(
|
|
'flex max-h-[80%] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xs',
|
|
size === 'sm' && 'w-[480px]',
|
|
size === 'md' && 'w-[640px]',
|
|
containerClassName,
|
|
)}
|
|
onClick={e => e.stopPropagation()}
|
|
>
|
|
<div className="relative shrink-0 p-6 pb-3 pr-14 text-text-primary title-2xl-semi-bold">
|
|
{title}
|
|
{
|
|
subTitle && (
|
|
<div className="mt-1 text-text-tertiary system-xs-regular">
|
|
{subTitle}
|
|
</div>
|
|
)
|
|
}
|
|
<div
|
|
className="absolute right-5 top-5 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg"
|
|
onClick={onClose}
|
|
>
|
|
<span className="i-ri-close-line h-5 w-5 text-text-tertiary" data-testid="close-icon" />
|
|
</div>
|
|
</div>
|
|
{
|
|
!!children && (
|
|
<div className="min-h-0 flex-1 overflow-y-auto px-6 py-3">{children}</div>
|
|
)
|
|
}
|
|
<div className="flex shrink-0 justify-between p-6 pt-5">
|
|
<div>
|
|
{footerSlot}
|
|
</div>
|
|
<div className="flex items-center">
|
|
{
|
|
showExtraButton && (
|
|
<>
|
|
<Button
|
|
variant={extraButtonVariant}
|
|
onClick={onExtraButtonClick}
|
|
disabled={disabled}
|
|
>
|
|
{extraButtonText || t('operation.remove', { ns: 'common' })}
|
|
</Button>
|
|
<div className="mx-3 h-4 w-[1px] bg-divider-regular"></div>
|
|
</>
|
|
)
|
|
}
|
|
<Button
|
|
onClick={onCancel}
|
|
disabled={disabled}
|
|
>
|
|
{cancelButtonText || t('operation.cancel', { ns: 'common' })}
|
|
</Button>
|
|
<Button
|
|
className="ml-2"
|
|
variant="primary"
|
|
onClick={onConfirm}
|
|
disabled={disabled}
|
|
>
|
|
{confirmButtonText || t('operation.save', { ns: 'common' })}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
{!!bottomSlot && (
|
|
<div className="shrink-0">
|
|
{bottomSlot}
|
|
</div>
|
|
)}
|
|
</div>
|
|
</PortalToFollowElemContent>
|
|
</PortalToFollowElem>
|
|
)
|
|
}
|
|
|
|
export default memo(Modal)
|