import { useForm, usePage } from "@inertiajs/react"; import { BookTextIcon, CogIcon, EyeIcon, LinkIcon, ShieldAlertIcon, } from "lucide-react"; import BtnOptionnalLinkWithTooltip from "@/back/Components/BtnOptionnalLinkWithTooltip"; import DynamicInputs from "@/back/Components/DynamicPages/DynamicInputs"; import FieldsetWrapper from "@/back/Components/FieldsetWrapper"; import GoToFrontView from "@/back/Components/GoToFrontView"; import InputError from "@/back/Components/InputError"; import EnumSelect from "@/back/Components/Inputs/EnumSelect"; import { ModelSelect } from "@/back/Components/Inputs/ModelSelect"; import SimpleString from "@/back/Components/Inputs/SimpleString"; import SimpleSwitch from "@/back/Components/Inputs/SimpleSwitch"; import Slugifycator from "@/back/Components/Inputs/Slugifycator"; import SimpleWysiwyg from "@/back/Components/Inputs/Wysiwyg/SimpleWysiwyg"; import ConfigDetails from "@/back/Components/PageConfigs/ConfigDetails"; import SubmitButton from "@/back/Components/SubmitButton"; import useCrudSubmit from "@/back/hooks/use-crud-submit"; import type { ConfigField, DynamicPageModel, PageConfigModel, } from "@/back/types/dynamic-pages"; import type { AuthProp, ConfigBackend, UserModel } from "@/back/types/global"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import str from "@/hooks/use-string"; import trans from "@/hooks/use-translations"; const newDate = new Date(); export default function Form({ model, modelName, modelRoute, action, method, }: Readonly<{ model?: DynamicPageModel; modelName: string; modelRoute: string; action: string; method: number; }>) { /** Global */ const { locale, url } = usePage().props.appEnv as AppEnv; const routeName = (usePage().props.configBackend as ConfigBackend).routes .name; const dynamicPageUrl = usePage().props.dynamicPageUrl as string | null; const userModel = (usePage().props.auth as AuthProp).user; const enumUserRole = usePage().props.enumUserRole as UserModel["role"][]; const getEnumRoleValue = (name: string) => enumUserRole.find((role) => role.name === name)?.value; const isConceptor = userModel.role.value === getEnumRoleValue("conceptor"); const enumDynamicPageStatus = usePage().props .enumDynamicPageStatus as LaravelEnum; const pageConfigModels = usePage().props .pageConfigModels as PageConfigModel[]; // Models filtered based on the presence of the locale. const filteredPageConfigModels = pageConfigModels.filter( (pageConfigModel) => // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition pageConfigModel.label[locale] !== undefined && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 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: newDate, updated_at: newDate, deleted_at: newDate, } as PageConfigModel, ...filteredPageConfigModels, ]; configOptions[defaultConfigId].label[locale] = trans( "uwil-dynamic-pages::trans.config_none_selected", ); // Set translations. const contentAssociateToModel = str( trans("uwil-backend::back.form_associate_to", { params: { attribute: trans("uwil-dynamic-pages::trans.attributes.content"), }, choice: 1, }), ) .ucFirst() .value(); const modalTitle = trans("uwil-dynamic-pages::trans.config_modal_title"); const modalDescription = trans( "uwil-dynamic-pages::trans.config_modal_descripion", ); const modalClose = trans("uwil-backend::back.close"); const anchorAccessConfig = trans("uwil-dynamic-pages::trans.access_model", { params: { model: trans("uwil-dynamic-pages::models.classes.page-configs", { choice: 1, }), }, }); const transValidationRootLabel = trans( "uwil-dynamic-pages::trans.attributes.root", ); const transValidationParentPageLabel = trans( "uwil-backend::back.form_associate_to", { params: { attribute: trans("uwil-dynamic-pages::trans.attributes.parent_page"), }, choice: 2, }, ); const transAssociateToStatus = trans("uwil-backend::back.form_associate_to", { params: { attribute: trans("uwil-dynamic-pages::trans.attributes.status"), }, choice: 1, }); const transFormTitleIsLocked = trans( "uwil-dynamic-pages::trans.form_title_isLocked", ); const transFormSubtitleIsLocked = trans( "uwil-dynamic-pages::trans.form_subtitle_isLocked", ); const getConfig = (id: number): ConfigField[] => { return configOptions.find((obj) => obj.id === id)?.config[locale] ?? []; }; /** 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, action, model, post, data, modelNameTrans: trans(`uwil-dynamic-pages::models.classes.${modelName}`, { choice: 1, }), }); return (
} description={trans("uwil-backend::back.form_subtitle_global")} className="sm:grid-cols-2 gap-4" > {(!data.isLocked || isConceptor) && ( )} } description={trans( "uwil-dynamic-pages::trans.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={trans("uwil-dynamic-pages::trans.form_subtitle_page")} className="gap-y-4" >
{ const id = Array.isArray(value) ? (value[0] ?? defaultConfigId) : (value ?? defaultConfigId); setData("config_id", id); }} /> {isConceptor && data.config_id !== defaultConfigId && ( {modalTitle} {modalDescription}
} tooltipContent={anchorAccessConfig} variant="secondary" />
)}
{!data.config_id || data.config_id === defaultConfigId ? ( ) : ( )}
{isConceptor && ( } description={transFormSubtitleIsLocked} inline > )}
); }