import React from "react"; import { Box, Card, Group, ActionIcon, Stack, Title, LoadingOverlay, } from "@mantine/core"; import { useBack, useGo, useMutationMode, useRefineContext, useUserFriendlyName, useToPath, useTranslate, useResourceParams, } from "@refinedev/core"; import { IconArrowLeft } from "@tabler/icons-react"; import { DeleteButton, ListButton, RefreshButton, SaveButton, Breadcrumb, type ListButtonProps, type RefreshButtonProps, type DeleteButtonProps, type SaveButtonProps, AutoSaveIndicator, } from "@components"; import type { EditProps } from "../types"; import { RefinePageHeaderClassNames } from "@refinedev/ui-types"; export const Edit: React.FC = (props) => { const { children, resource: resourceFromProps, recordItemId, deleteButtonProps: deleteButtonPropsFromProps, mutationMode: mutationModeFromProps, saveButtonProps: saveButtonPropsFromProps, canDelete, dataProviderName, isLoading, footerButtons: footerButtonsFromProps, footerButtonProps, headerButtons: headerButtonsFromProps, headerButtonProps, wrapperProps, contentProps, headerProps, goBack: goBackFromProps, breadcrumb: breadcrumbFromProps, title, autoSaveProps, } = props; const translate = useTranslate(); const { options: { breadcrumb: globalBreadcrumb } = {}, } = useRefineContext(); const { mutationMode: mutationModeContext } = useMutationMode(); const mutationMode = mutationModeFromProps ?? mutationModeContext; const back = useBack(); const go = useGo(); const getUserFriendlyName = useUserFriendlyName(); const { resource, identifier, id: idFromParams, } = useResourceParams({ resource: resourceFromProps, }); const goListPath = useToPath({ resource, action: "list", }); const id = recordItemId ?? idFromParams; const breadcrumb = typeof breadcrumbFromProps === "undefined" ? globalBreadcrumb : breadcrumbFromProps; const hasList = resource?.list && !recordItemId; const isDeleteButtonVisible = canDelete ?? (resource?.meta?.canDelete || deleteButtonPropsFromProps); const breadcrumbComponent = typeof breadcrumb !== "undefined" ? <>{breadcrumb} : ; const loadingOverlayVisible = isLoading ?? saveButtonPropsFromProps?.disabled ?? false; const listButtonProps: ListButtonProps | undefined = hasList ? { ...(isLoading ? { disabled: true } : {}), resource: identifier, } : undefined; const refreshButtonProps: RefreshButtonProps = { ...(isLoading ? { disabled: true } : {}), resource: identifier, recordItemId: id, dataProviderName, }; const deleteButtonProps: DeleteButtonProps | undefined = isDeleteButtonVisible ? ({ ...(isLoading ? { disabled: true } : {}), resource: identifier, mutationMode, onSuccess: () => { go({ to: goListPath }); }, recordItemId: id, dataProviderName, ...deleteButtonPropsFromProps, } as const) : undefined; const saveButtonProps: SaveButtonProps = { ...(isLoading ? { disabled: true } : {}), ...saveButtonPropsFromProps, }; const defaultHeaderButtons = ( <> {autoSaveProps && } {hasList && } ); const defaultFooterButtons = ( <> {isDeleteButtonVisible && } ); const buttonBack = goBackFromProps === (false || null) ? null : ( {typeof goBackFromProps !== "undefined" ? ( goBackFromProps ) : ( )} ); const headerButtons = headerButtonsFromProps ? typeof headerButtonsFromProps === "function" ? headerButtonsFromProps({ defaultButtons: defaultHeaderButtons, listButtonProps, refreshButtonProps, }) : headerButtonsFromProps : defaultHeaderButtons; const footerButtons = footerButtonsFromProps ? typeof footerButtonsFromProps === "function" ? footerButtonsFromProps({ defaultButtons: defaultFooterButtons, deleteButtonProps, saveButtonProps, }) : footerButtonsFromProps : defaultFooterButtons; return ( {breadcrumbComponent} {buttonBack} {title ?? ( {translate( `${identifier}.titles.edit`, `Edit ${getUserFriendlyName( resource?.meta?.label ?? identifier, "singular", )}`, )} )} {headerButtons} {children} {footerButtons} ); };