import { Fragment, ReactNode, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate, useOutlet, useSearchParams, useParams, useActionData } from "react-router"; import RowActivity from "~/components/entities/rows/RowActivity"; import RowForm from "~/components/entities/rows/RowForm"; import RowTags from "~/components/entities/rows/RowTags"; import RowTasks from "~/components/entities/rows/RowTasks"; import EditPageLayout from "~/components/ui/layouts/EditPageLayout"; import { useAppOrAdminData } from "~/utils/data/useAppOrAdminData"; import { getEntityPermission, getUserHasPermission } from "~/utils/helpers/PermissionsHelper"; import { RowWithDetails } from "~/utils/db/entities/rows.db.server"; import { EntitiesApi } from "~/utils/api/.server/EntitiesApi"; import EntityHelper from "~/utils/helpers/EntityHelper"; import { RowsApi } from "~/utils/api/.server/RowsApi"; import SlideOverWideEmpty from "~/components/ui/slideOvers/SlideOverWideEmpty"; import clsx from "clsx"; import { Rows_Overview } from "../routes/Rows_Overview.server"; import toast from "react-hot-toast"; import ActionResultModal from "~/components/ui/modals/ActionResultModal"; import RowOverviewHeader from "~/components/entities/rows/RowOverviewHeader"; import { translateEntityTitle } from "~/utils/i18n/translateLabel"; type EditRowOptions = { hideTitle?: boolean; hideMenu?: boolean; hideShare?: boolean; hideTags?: boolean; hideTasks?: boolean; hideActivity?: boolean; disableUpdate?: boolean; disableDelete?: boolean; }; interface Props { rowData: RowsApi.GetRowData; item: RowWithDetails; // permissions: RowPermission[]; routes?: EntitiesApi.Routes; children?: ReactNode; title?: ReactNode; rowFormChildren?: ReactNode; afterRowForm?: ReactNode; options?: EditRowOptions; relationshipRows?: RowsApi.GetRelationshipRowsData; onSubmit?: (formData: FormData) => void; } export default function RowOverviewRoute({ rowData, item, routes, children, title, rowFormChildren, afterRowForm, options, relationshipRows, onSubmit, }: Props) { const { t, i18n } = useTranslation(); const appOrAdminData = useAppOrAdminData(); const params = useParams(); const outlet = useOutlet(); const navigate = useNavigate(); const actionData = useActionData(); useEffect(() => { if (actionData?.success) { toast.success(actionData?.success); } else if (actionData?.error) { toast.error(actionData.error); } }, [actionData, t]); return ( <> {children} { navigate(".", { replace: true }); }} className="sm:max-w-sm" overflowYScroll={true} >
{outlet}
); } interface EditRowProps { rowData: RowsApi.GetRowData; item: RowWithDetails; routes?: EntitiesApi.Routes; className: string; children?: ReactNode; title?: ReactNode; options?: EditRowOptions; rowFormChildren?: ReactNode; afterRowForm?: ReactNode; relationshipRows?: RowsApi.GetRelationshipRowsData; onSubmit?: (formData: FormData) => void; actionData: Rows_Overview.ActionData | null | undefined; } function EditRow({ rowData, routes, item, className, title, options, children, rowFormChildren, afterRowForm, relationshipRows, onSubmit, actionData, }: EditRowProps) { const appOrAdminData = useAppOrAdminData(); const [searchParams] = useSearchParams(); const { t } = useTranslation(); function canUpdate() { if (options?.disableUpdate) { return false; } if (!getUserHasPermission(appOrAdminData, getEntityPermission(rowData.entity, "update"))) { return false; } if (!rowData.rowPermissions.canUpdate) { return false; } return true; } function isEditing() { if (rowData.entity.onEdit === "overviewAlwaysEditable") { return true; } return searchParams.get("editing") !== null; } return ( {!rowData.rowPermissions.canRead ? (
{t("models.row.permissionMessages.cannotViewRecord")}
) : (
{children ?? ( {rowFormChildren} )} {afterRowForm}
{rowData.entity.hasTags && !options?.hideTags && } {rowData.entity.hasTasks && !options?.hideTasks && } {rowData.entity.hasActivity && rowData.rowPermissions.canComment && !options?.hideActivity && ( )}
)}
); }