import { IconAlignJustified, IconBolt, IconCirclesRelation, IconSettings, } from "@tabler/icons-react"; import { isDebug } from "core"; import type { Entity } from "data"; import { cloneDeep } from "lodash-es"; import { useRef, useState } from "react"; import { TbCirclesRelation, TbDatabasePlus, TbDots, TbPhoto, TbPlus, TbSitemap, } from "react-icons/tb"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; import { Button } from "ui/components/buttons/Button"; import { IconButton } from "ui/components/buttons/IconButton"; import { Empty } from "ui/components/display/Empty"; import { Message } from "ui/components/display/Message"; import { JsonSchemaForm, type JsonSchemaFormRef } from "ui/components/form/json-schema"; import { Dropdown } from "ui/components/overlay/Dropdown"; import { Link } from "ui/components/wouter/Link"; import * as AppShell from "ui/layouts/AppShell/AppShell"; import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; import { routes, useNavigate } from "ui/lib/routes"; import { fieldSpecs } from "ui/modules/data/components/fields-specs"; import { extractSchema } from "../settings/utils/schema"; import { EntityFieldsForm, type EntityFieldsFormRef } from "./forms/entity.fields.form"; import { RoutePathStateProvider } from "ui/hooks/use-route-path-state"; export function DataSchemaEntity({ params }) { const { $data } = useBkndData(); const [navigate] = useNavigate(); const entity = $data.entity(params.entity as string)!; if (!entity) { return ; } return ( navigate(routes.data.root() + routes.data.entity.list(entity.name), { absolute: true, }), }, { label: "Advanced Settings", onClick: () => navigate(routes.settings.path(["data", "entities", entity.name]), { absolute: true, }), }, ]} position="bottom-end" > $data.modals.createRelation(entity.name), }, { icon: TbPhoto, label: "Add media", onClick: () => $data.modals.createMedia(entity.name), }, () => , { icon: TbDatabasePlus, label: "Create Entity", onClick: () => $data.modals.createEntity(), }, ]} position="bottom-end" > Add > } className="pl-3" > Overview navigate(routes.settings.path(["data", "relations"]), { absolute: true }), }} /> navigate(routes.settings.path(["data", "indices"]), { absolute: true, }), }} /> ); } const Fields = ({ entity }: { entity: Entity }) => { const [submitting, setSubmitting] = useState(false); const [updates, setUpdates] = useState(0); const { actions, $data, config } = useBkndData(); const [res, setRes] = useState(); const ref = useRef(null); async function handleUpdate() { if (submitting) return; setSubmitting(true); const fields = ref.current?.getData()!; await actions.entity.patch(entity.name).fields.set(fields); setSubmitting(false); setUpdates((u) => u + 1); } // @todo: the return of toJSON from Fields doesn't match "type" enum const initialFields = Object.fromEntries(entity.fields.map((f) => [f.name, f.toJSON()])) as any; return ( open ? ( Update ) : null } > {submitting && ( )} ["relation", "media"].includes(f.type)) .map((i) => ({ ...i, onClick: () => { switch (i.type) { case "relation": $data.modals.createRelation(entity.name); break; case "media": $data.modals.createMedia(entity.name); break; } }, }))} defaultPrimaryFormat={config?.default_primary_format} isNew={false} /> {isDebug() && ( setRes(ref.current?.isValid())}> valid setRes(ref.current?.getValues())}> values setRes(ref.current?.getData())}> data setRes(ref.current?.getErrors())}> errors update {JSON.stringify(res, null, 2)} )} ); }; const BasicSettings = ({ entity }: { entity: Entity }) => { const d = useBkndData(); const config = d.entities?.[entity.name]?.config; const formRef = useRef(null); const schema = cloneDeep( // @ts-ignore d.schema.properties.entities.additionalProperties?.properties?.config, ); const [_schema, _config] = extractSchema(schema as any, config, ["fields"]); // set fields as enum try { // @ts-ignore _schema.properties.sort_field.enum = entity.getFields().map((f) => f.name); } catch (e) { console.error("error setting sort_field enum", e); } async function handleUpdate() { console.log("update", formRef.current?.formData()); await d.actions.entity.patch(entity.name).config(formRef.current?.formData()); } return ( open ? ( Update ) : null } > ); };
{JSON.stringify(res, null, 2)}