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 { TbDots } 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 { JsonSchemaForm, type JsonSchemaFormRef } from "ui/components/form/json-schema/JsonSchemaForm"; import { Dropdown } from "ui/components/overlay/Dropdown"; import * as AppShell from "ui/layouts/AppShell/AppShell"; import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; import { routes, useNavigate } from "ui/lib/routes"; import { extractSchema } from "../settings/utils/schema"; import { EntityFieldsForm, type EntityFieldsFormRef } from "./forms/entity.fields.form"; export function DataSchemaEntity({ params }) { const { $data } = useBkndData(); const [value, setValue] = useState("fields"); const fieldsRef = useRef(null); function toggle(value) { return () => setValue(value); } const [navigate] = useNavigate(); const entity = $data.entity(params.entity as string)!; return ( <> navigate(routes.settings.path(["data", "entities", entity.name]), { absolute: true }) } ]} position="bottom-end" > } className="pl-3" >
navigate(routes.settings.path(["data", "relations"]), { absolute: true }) } /> navigate(routes.settings.path(["data", "indices"]), { absolute: true }) } />
); } const Fields = ({ entity, open, toggle }: { entity: Entity; open: boolean; toggle: () => void }) => { const [submitting, setSubmitting] = useState(false); const [updates, setUpdates] = useState(0); const { actions } = 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 ? ( ) : null } >
{submitting && (
)} {isDebug() && (
{JSON.stringify(res, null, 2)}
)}
); }; const BasicSettings = ({ entity, open, toggle }: { entity: Entity; open: boolean; toggle: () => void }) => { 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 ? ( ) : null } >
); };