import { useNavigate } from "react-router"; import { useState, useEffect, useRef } from "react"; import UrlUtils from "~/utils/app/UrlUtils"; import { EntitySimple } from "~/utils/db/entities/entities.db.server"; import { EntityGroupWithDetails } from "~/utils/db/entities/entityGroups.db.server"; import InputText, { RefInputText } from "../ui/input/InputText"; import FormGroup from "../ui/forms/FormGroup"; import { getUserHasPermission } from "~/utils/helpers/PermissionsHelper"; import { useAppOrAdminData } from "~/utils/data/useAppOrAdminData"; import InputCheckboxCards from "../ui/input/InputCheckboxCards"; import { useTranslation } from "react-i18next"; import EntityIcon from "../layouts/icons/EntityIcon"; import QuestionMarkFilledIcon from "../ui/icons/QuestionMarkFilledIcon"; import InputCheckboxWithDescription from "../ui/input/InputCheckboxWithDescription"; import InputSelector from "../ui/input/InputSelector"; import { EntityViewWithTenantAndUser } from "~/utils/db/entities/entityViews.db.server"; import { adminPath } from "~/utils/app/CanonicalUrlUtils"; export function EntityGroupForm({ item, allEntities, systemViews, }: { item: EntityGroupWithDetails | undefined; allEntities: EntitySimple[]; systemViews: EntityViewWithTenantAndUser[]; }) { const { t } = useTranslation(); const appOrAdminData = useAppOrAdminData(); const navigate = useNavigate(); const [title, setTitle] = useState(item?.title ?? ""); const [slug, setSlug] = useState(item?.slug ?? ""); const [icon, setIcon] = useState( item?.icon ?? ` ` ); const [collapsible, setCollapsible] = useState(item?.collapsible ?? false); const [section, setSection] = useState(item?.section ?? ""); const [entities, setEntities] = useState<{ entityId: string; allViewId: string | null }[]>(item?.entities ?? []); const input = useRef(null); useEffect(() => { setTimeout(() => { input.current?.input.current?.focus(); }, 100); }, []); useEffect(() => { if (!item) { const slug = UrlUtils.slugify(title.toLowerCase()); setSlug(slug); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [title]); return ( navigate(adminPath("entities/groups", { mode: "host-aware" }))} editing={true} canDelete={getUserHasPermission(appOrAdminData, "admin.entities.delete")} >
setSlug(UrlUtils.slugify(slug))} />
{t("models.entityGroup.form.iconHint")}
} button={
{icon ? ( ) : (
} /> f.entityId)} selectAndClearAll onChange={(e) => setEntities( e.map((v) => ({ entityId: v.toString(), allViewId: entities.find((f) => f.entityId === v.toString())?.allViewId ?? null, })) ) } options={allEntities.map((v) => ({ value: v.id, name: `${t(v.title)}` }))} />
{/* */}
{entities .filter((f) => systemViews.some((v) => v.entityId === f.entityId)) .map((f, idx) => { const entity = allEntities.find((e) => e.id === f.entityId); if (!entity) { return
{t("models.entityGroup.form.invalidEntity")}
; } const entitySystemViews = systemViews.filter((v) => v.entityId === entity.id); return ( { const newEntities = [...entities]; newEntities[idx].allViewId = e?.toString() ?? null; setEntities(newEntities); }} options={entitySystemViews.map((f) => { return { value: f.id, name: `${f.title} (${f.layout})`, }; })} hint={ <> {!!f.allViewId && ( )} } /> ); })}
{entities.map((item) => { return ; })}
); }