initial refactor

This commit is contained in:
dswbx
2025-06-21 13:35:58 +02:00
parent b2086c4da7
commit 42edce904f
93 changed files with 1021 additions and 1216 deletions
+3 -2
View File
@@ -1,4 +1,4 @@
import { StringIdentifier, transformObject, ucFirstAllSnakeToPascalWithSpaces } from "core/utils";
import { transformObject, ucFirstAllSnakeToPascalWithSpaces } from "core/utils";
import { useBkndAuth } from "ui/client/schema/auth/use-bknd-auth";
import { Alert } from "ui/components/display/Alert";
import { bkndModals } from "ui/modals";
@@ -6,6 +6,7 @@ import { Button } from "../../components/buttons/Button";
import { CellValue, DataTable } from "../../components/table/DataTable";
import * as AppShell from "../../layouts/AppShell/AppShell";
import { routes, useNavigate } from "../../lib/routes";
import { stringIdentifier } from "core/object/schema";
export function AuthRolesList() {
const [navigate] = useNavigate();
@@ -31,7 +32,7 @@ export function AuthRolesList() {
schema: {
type: "object",
properties: {
name: StringIdentifier,
name: stringIdentifier,
},
required: ["name"],
},
+7 -3
View File
@@ -64,8 +64,7 @@ function AuthStrategiesListInternal() {
const config = $auth.config.strategies;
const schema = $auth.schema.properties.strategies;
const schemas = Object.fromEntries(
// @ts-ignore
$auth.schema.properties.strategies.additionalProperties.anyOf.map((s) => [
$auth.schema.properties.strategies?.additionalProperties?.anyOf.map((s) => [
s.properties.type.const,
s,
]),
@@ -76,7 +75,12 @@ function AuthStrategiesListInternal() {
}
return (
<Form schema={schema} initialValues={config} onSubmit={handleSubmit} options={formOptions}>
<Form
schema={schema.toJSON()}
initialValues={config}
onSubmit={handleSubmit}
options={formOptions}
>
<Subscribe
selector={(state) => ({
dirty: state.dirty,
+7 -5
View File
@@ -1,15 +1,16 @@
import { typeboxResolver } from "@hookform/resolvers/typebox";
//import { typeboxResolver } from "@hookform/resolvers/typebox";
import { Input, Switch, Tooltip } from "@mantine/core";
import { guardRoleSchema } from "auth/auth-schema";
import { type Static, ucFirst } from "core/utils";
import { ucFirst } from "core/utils";
import { forwardRef, useImperativeHandle } from "react";
import { type UseControllerProps, useController, useForm } from "react-hook-form";
import { useBknd } from "ui/client/bknd";
import { Button } from "ui/components/buttons/Button";
import { MantineSwitch } from "ui/components/form/hook-form-mantine/MantineSwitch";
import type { s } from "core/object/schema";
const schema = guardRoleSchema;
type Role = Static<typeof guardRoleSchema>;
type Role = s.Static<typeof guardRoleSchema>;
export type AuthRoleFormRef = {
getData: () => Role;
@@ -33,7 +34,8 @@ export const AuthRoleForm = forwardRef<
reset,
getValues,
} = useForm({
resolver: typeboxResolver(schema),
// @todo: add resolver
//resolver: typeboxResolver(schema),
defaultValues: role,
});
@@ -87,7 +89,7 @@ const Permissions = ({
const {
field: { value, onChange: fieldOnChange, ...field },
fieldState,
} = useController<Static<typeof schema>, "permissions">({
} = useController<s.Static<typeof schema>, "permissions">({
name: "permissions",
control,
});
@@ -1,13 +1,5 @@
import { typeboxResolver } from "@hookform/resolvers/typebox";
import { Tabs, TextInput, Textarea, Tooltip, Switch } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import {
Default,
type Static,
StringIdentifier,
objectCleanEmpty,
ucFirstAllSnakeToPascalWithSpaces,
} from "core/utils";
import { objectCleanEmpty, omitKeys, ucFirstAllSnakeToPascalWithSpaces } from "core/utils";
import {
type TAppDataEntityFields,
fieldsSchemaObject as originalFieldsSchemaObject,
@@ -26,31 +18,25 @@ import { type SortableItemProps, SortableList } from "ui/components/list/Sortabl
import { Popover } from "ui/components/overlay/Popover";
import { type TFieldSpec, fieldSpecs } from "ui/modules/data/components/fields-specs";
import { dataFieldsUiSchema } from "../../settings/routes/data.settings";
import * as tbbox from "@sinclair/typebox";
import { useRoutePathState } from "ui/hooks/use-route-path-state";
import { MantineSelect } from "ui/components/form/hook-form-mantine/MantineSelect";
import type { TPrimaryFieldFormat } from "data/fields/PrimaryField";
const { Type } = tbbox;
import { s, stringIdentifier } from "core/object/schema";
const fieldsSchemaObject = originalFieldsSchemaObject;
const fieldsSchema = Type.Union(Object.values(fieldsSchemaObject));
const fieldsSchema = s.anyOf(Object.values(fieldsSchemaObject));
const fieldSchema = Type.Object(
{
name: StringIdentifier,
new: Type.Optional(Type.Boolean({ const: true })),
field: fieldsSchema,
},
{
additionalProperties: false,
},
);
type TFieldSchema = Static<typeof fieldSchema>;
const schema = Type.Object({
fields: Type.Array(fieldSchema),
const fieldSchema = s.strictObject({
name: stringIdentifier,
new: s.boolean({ const: true }).optional(),
field: fieldsSchema,
});
type TFieldsFormSchema = Static<typeof schema>;
type TFieldSchema = s.Static<typeof fieldSchema>;
const schema = s.strictObject({
fields: s.array(fieldSchema),
});
type TFieldsFormSchema = s.Static<typeof schema>;
const fieldTypes = Object.keys(fieldsSchemaObject);
const defaultType = fieldTypes[0];
@@ -58,7 +44,9 @@ const commonProps = ["label", "description", "required", "fillable", "hidden", "
function specificFieldSchema(type: keyof typeof fieldsSchemaObject) {
//console.log("specificFieldSchema", type);
return Type.Omit(fieldsSchemaObject[type]?.properties.config, commonProps);
return s.object(
omitKeys(fieldsSchemaObject[type]?.properties.config.properties, commonProps as any),
);
}
export type EntityFieldsFormProps = {
@@ -100,7 +88,8 @@ export const EntityFieldsForm = forwardRef<EntityFieldsFormRef, EntityFieldsForm
reset,
} = useForm({
mode: "all",
resolver: typeboxResolver(schema),
// @todo: add resolver
//resolver: typeboxResolver(schema),
defaultValues: {
fields: entityFields,
} as TFieldsFormSchema,
@@ -135,15 +124,14 @@ export const EntityFieldsForm = forwardRef<EntityFieldsFormRef, EntityFieldsForm
}));
function handleAppend(_type: keyof typeof fieldsSchemaObject) {
const newField = {
append({
name: "",
new: true,
field: {
type: _type,
config: Default(fieldsSchemaObject[_type]?.properties.config, {}) as any,
config: fieldsSchemaObject[_type]?.properties.config.template() as any,
},
};
append(newField);
});
}
const formProps = {
@@ -1,8 +1,5 @@
import { typeboxResolver } from "@hookform/resolvers/typebox";
import { TextInput } from "@mantine/core";
import { useFocusTrap } from "@mantine/hooks";
import { TypeRegistry } from "@sinclair/typebox";
import { type Static, StringEnum, StringIdentifier, registerCustomTypeboxKinds } from "core/utils";
import { TRIGGERS } from "flows/flows-schema";
import { forwardRef, useState } from "react";
import { useForm } from "react-hook-form";
@@ -16,18 +13,15 @@ import {
ModalTitle,
} from "../../../components/modal/Modal2";
import { Step, Steps, useStepContext } from "../../../components/steps/Steps";
import * as tbbox from "@sinclair/typebox";
const { Type } = tbbox;
registerCustomTypeboxKinds(TypeRegistry);
import { s, stringIdentifier } from "core/object/schema";
export type TCreateFlowModalSchema = any;
const triggerNames = Object.keys(TRIGGERS) as unknown as (keyof typeof TRIGGERS)[];
const schema = Type.Object({
name: StringIdentifier,
trigger: StringEnum(triggerNames),
mode: StringEnum(["async", "sync"]),
const schema = s.strictObject({
name: stringIdentifier,
trigger: s.string({ enum: triggerNames }),
mode: s.string({ enum: ["async", "sync"] }),
});
export const FlowCreateModal = forwardRef<Modal2Ref>(function FlowCreateModal(props, ref) {
@@ -61,16 +55,17 @@ export function StepCreate() {
register,
formState: { isValid, errors },
} = useForm({
resolver: typeboxResolver(schema),
// @todo: implement resolver
//resolver: typeboxResolver(schema),
defaultValues: {
name: "",
trigger: "manual",
mode: "async",
} as Static<typeof schema>,
} as s.Static<typeof schema>,
mode: "onSubmit",
});
async function onSubmit(data: Static<typeof schema>) {
async function onSubmit(data: s.Static<typeof schema>) {
console.log(data, isValid);
actions.flow.create(data.name, {
trigger: {
@@ -1,5 +1,5 @@
import { useHotkeys } from "@mantine/hooks";
import { type TObject, ucFirst } from "core/utils";
import { ucFirst } from "core/utils";
import { omit } from "lodash-es";
import { type ReactNode, useMemo, useRef, useState } from "react";
import { TbSettings } from "react-icons/tb";
@@ -18,10 +18,11 @@ import { Link, Route, useLocation } from "wouter";
import { extractSchema } from "../utils/schema";
import { SettingNewModal, type SettingsNewModalProps } from "./SettingNewModal";
import { SettingSchemaModal, type SettingsSchemaModalRef } from "./SettingSchemaModal";
import type { s } from "core/object/schema";
export type SettingProps<
Schema extends TObject = TObject,
Props = Schema extends TObject<infer TProperties> ? TProperties : any,
Schema extends s.ObjectSchema = s.ObjectSchema,
Props = Schema extends s.ObjectSchema<infer TProperties> ? TProperties : any,
> = {
schema: Schema;
config: any;
@@ -44,7 +45,7 @@ export type SettingProps<
};
};
export function Setting<Schema extends TObject = any>({
export function Setting<Schema extends s.ObjectSchema = s.ObjectSchema>({
schema,
uiSchema,
config,
@@ -1,8 +1,6 @@
import { useDisclosure, useFocusTrap } from "@mantine/hooks";
import type { TObject } from "core/utils";
import { omit } from "lodash-es";
import { useRef, useState } from "react";
import { TbCirclePlus, TbVariable } from "react-icons/tb";
import { useBknd } from "ui/client/BkndProvider";
import { Button } from "ui/components/buttons/Button";
import * as Formy from "ui/components/form/Formy";
@@ -10,9 +8,10 @@ import { JsonSchemaForm, type JsonSchemaFormRef } from "ui/components/form/json-
import { Dropdown } from "ui/components/overlay/Dropdown";
import { Modal } from "ui/components/overlay/Modal";
import { useLocation } from "wouter";
import type { s } from "core/object/schema";
export type SettingsNewModalProps = {
schema: TObject;
schema: s.ObjectSchema;
uiSchema?: object;
anyOfValues?: Record<string, { label: string; icon?: any }>;
path: string[];
+5 -5
View File
@@ -1,11 +1,11 @@
import type { Static, TObject } from "core/utils";
import type { JSONSchema7 } from "json-schema";
import { cloneDeep, omit, pick } from "lodash-es";
import type { s } from "core/object/schema";
export function extractSchema<
Schema extends TObject,
Schema extends s.ObjectSchema,
Keys extends keyof Schema["properties"],
Config extends Static<Schema>,
Config extends s.Static<Schema>,
>(
schema: Schema,
config: Config,
@@ -22,12 +22,12 @@ export function extractSchema<
},
] {
if (!schema.properties) {
return [{ ...schema }, config, {} as any];
return [{ ...schema.toJSON() }, config, {} as any];
}
const newSchema = cloneDeep(schema);
const updated = {
...newSchema,
...newSchema.toJSON(),
properties: omit(newSchema.properties, keys),
};
if (updated.required) {
@@ -1,9 +1,9 @@
import { parse } from "core/utils";
import { AppFlows } from "flows/AppFlows";
import { useState } from "react";
import { JsonViewer } from "../../../components/code/JsonViewer";
import { JsonSchemaForm } from "../../../components/form/json-schema";
import { Scrollable } from "../../../layouts/AppShell/AppShell";
import { parse } from "core/object/schema";
export default function FlowCreateSchemaTest() {
//const schema = flowsConfigSchema;
@@ -73,7 +73,7 @@ export default function JsonSchemaForm3() {
return (
<Scrollable>
<div className="flex flex-col p-3">
<Form schema={_schema.auth} options={formOptions} />
<Form schema={_schema.auth.toJSON()} options={formOptions} />
{/*<Form
onChange={(data) => console.log("change", data)}