// * Packages import { useForm, usePage } from "@inertiajs/react"; import { LinkIcon, BookTextIcon, CogIcon, EyeIcon, ShieldAlertIcon, } from "lucide-react"; import { route } from "ziggy-js"; // * Components shadcn import { Button } from "@/components/ui/button"; import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogClose, DialogContent, DialogFooter, DialogTrigger, } from "@/components/ui/dialog"; // * Other import SimpleString from "@/back/Components/Inputs/SimpleString"; import SimpleSwitch from "@/back/Components/Inputs/SimpleSwitch"; import SimpleWysiwyg from "@/back/Components/Inputs/Wysiwyg/SimpleWysiwyg"; import EnumSelect from "@/back/Components/Inputs/EnumSelect"; import DynamicInputs from "@/back/Components/DynamicPages/DynamicInputs"; import FieldsetWrapper from "@/back/Components/FieldsetWrapper"; import ConfigDetails from "@/back/Components/PageConfigs/ConfigDetails"; import BtnOptionnalLinkWithTooltip from "@/back/Components/BtnOptionnalLinkWithTooltip"; import GoToFrontView from "@/back/Components/GoToFrontView"; import useTrans from "@/hooks/use-translations"; import InputError from "@/back/Components/InputError"; import str from "@/hooks/use-string"; import { AppEnv, AuthProp, LaravelEnum } from "@/back/types/global"; import { ConfigField, DynamicPageModel, PageConfigModel, } from "@/back/types/dynamic-pages"; import SubmitButton from "@/back/Components/SubmitButton"; import useCrudSubmit from "@/hooks/use-crud-submit"; import Slugifycator from "@/back/Components/Inputs/Slugifycator"; import { ModelSelect } from "@/back/Components/Inputs/ModelSelect"; export default function Form({ model, modelName, modelRoute, action, method, }: { model?: DynamicPageModel; modelName: string; modelRoute: string; action: string; method: number; }) { /** Global */ const { locale, url } = usePage().props.appEnv as AppEnv; const dynamicPageUrl = usePage().props.dynamicPageUrl as string; const userModel = (usePage().props.auth as AuthProp).user; const enumUserRole = usePage().props.enumUserRole as LaravelEnum; const enumDynamicPageStatus = usePage().props .enumDynamicPageStatus as LaravelEnum; const isConceptor = userModel.role === enumUserRole.conceptor.value; const pageConfigModels = usePage().props .pageConfigModels as Array; // Models filtered based on the presence of the locale. const filteredPageConfigModels = pageConfigModels.filter( (pageConfigModel) => pageConfigModel.label?.[locale] !== undefined && pageConfigModel.config?.[locale] !== undefined, ); // Set empty config by default. const defaultConfigId = 0; const configOptions = [ { id: defaultConfigId, label: {}, config: {}, policies: { view: true, update: true, duplicate: true, delete: true, }, view: null, created_at: new Date(), updated_at: new Date(), deleted_at: new Date(), } as PageConfigModel, ...filteredPageConfigModels, ]; configOptions[defaultConfigId].label[locale] = useTrans( "back.config_none_selected", ); // Set translations. const contentAssociateToModel = str( useTrans("back.form_associate_to", { params: { attribute: useTrans("validation.attributes.content") }, choice: 1, }), ) .ucFirst() .value(); const modalTitle = useTrans("back.config_modal_title"); const modalDescription = useTrans("back.config_modal_descripion"); const modalClose = useTrans("back.close"); const anchorAccessConfig = useTrans("back.access_model", { params: { model: useTrans("models.classes.page-config", { choice: 1 }), }, }); const transValidationRootLabel = useTrans("validation.custom.root"); const transValidationParentPageLabel = useTrans("back.form_associate_to", { params: { attribute: useTrans("validation.custom.parent_page"), }, choice: 2, }); const transAssociateToStatus = useTrans("back.form_associate_to", { params: { attribute: useTrans("validation.custom.status"), }, choice: 1, }); const transFormTitleIsLocked = useTrans("back.form_title_isLocked"); const transFormSubtitleIsLocked = useTrans("back.form_subtitle_isLocked"); const getConfig = (id: number) => configOptions.find((objet) => objet.id === id)?.config[ locale ] as ConfigField[]; /** Form section */ const { post, setData, data, reset } = useForm({ title: model?.title ? model?.title[locale] : "", slug: model?.slug ? model?.slug[locale] : "", content: model?.content ? model?.content[locale] : "", page_id: model?.page_id ?? null, config_id: model?.config_id ?? configOptions[defaultConfigId].id, status: model?.status ?? enumDynamicPageStatus.draft.value, isLocked: model?.isLocked ?? false, isRoot: model?.isRoot ?? false, }); const defaultIsRootValue = !data.isRoot && data.page_id ? [data.page_id] : []; const submit = useCrudSubmit({ method, modelRoute, modelName, action, model, post, data, }); return (
} description={useTrans("back.form_subtitle_global")} className="sm:grid-cols-2 gap-4" > {(!data?.isLocked || isConceptor) && ( )} } description={useTrans("back.form_subtitle_page_accessibility")} className="sm:grid-cols-2 gap-4" > {isConceptor && (
{ setData("page_id", null); setData("slug", ""); // @ts-expect-error TS2345: 'name' type is dynamic, TypeScript cannot infer the correct key setData(name, value); }} />
)} {!data?.isRoot && ( <> )}
} description={useTrans("back.form_subtitle_page")} className="gap-4" >
{isConceptor && Number(data.config_id) !== defaultConfigId && ( {modalTitle} {modalDescription}
} tooltipContent={ anchorAccessConfig } variant="secondary" />
)}
{Number(data.config_id) === defaultConfigId ? ( ) : ( )}
{isConceptor && ( } description={transFormSubtitleIsLocked} inline > )}
); }