@duke333/builder-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/RuntimeEntryDialog-DAO74GFp.d.ts +282 -0
- package/dist/admin/index.d.ts +631 -0
- package/dist/admin/index.js +644 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/api/index.d.ts +99 -0
- package/dist/api/index.js +92 -0
- package/dist/api/index.js.map +1 -0
- package/dist/components/index.d.ts +137 -0
- package/dist/components/index.js +581 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.d.ts +107 -0
- package/dist/hooks/index.js +301 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1397 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/index.d.ts +28 -0
- package/dist/runtime/index.js +31 -0
- package/dist/runtime/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/admin/BuilderEditorPage.tsx","../../src/admin/editorState.ts","../../src/admin/BuilderEntityManager.tsx","../../src/admin/BuilderViewDialog.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport {\n FormProvider,\n type Resolver,\n type UseFieldArrayReturn,\n type UseFormReturn,\n useFieldArray,\n useForm,\n useWatch,\n} from \"react-hook-form\";\nimport {\n type BuilderEditorDbTable,\n type BuilderEditorTriggerValues,\n type BuilderFormEditorEntity,\n type BuilderFormEditorFieldValues,\n type BuilderFormEditorSubformValues,\n type BuilderFormEditorValues,\n type BuilderListEditorColumnValues,\n type BuilderListEditorEntity,\n type BuilderListEditorValues,\n builderFormEditorDefaultLayoutGroups,\n builderFormEditorFieldsFromTable,\n builderFormEditorValuesFromEntity,\n builderListEditorColumnsFromTable,\n builderListEditorValuesFromEntity,\n} from \"./editorState\";\n\ntype BuilderEditorEntity = {\n id: string;\n};\n\ntype BuilderEditorQuery<TEntity> = {\n data?: TEntity;\n isPending: boolean;\n isError: boolean;\n};\n\ntype BuilderEditorListQuery<TItem> = {\n data?: TItem[];\n};\n\ntype BuilderEditorSaveMutation<TInput, TEntity> = {\n mutateAsync(args: { id?: string; input: TInput }): Promise<TEntity>;\n isPending: boolean;\n};\n\ntype BuilderEditorNotifications = {\n success(message: string): void;\n error(error: unknown): void;\n};\n\ntype BuilderEditorLabels = {\n created: string;\n saved: string;\n};\n\ntype BuilderEditorStateLabels = {\n loading: string;\n error: string;\n};\n\nexport type BuilderFormEditorBodyProps<TFieldType extends string, TTriggerEvent extends string> = {\n formId?: string;\n form: UseFormReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>>;\n fieldArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"fields\">;\n subformArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"subforms\">;\n triggerArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"triggers\">;\n fields: BuilderFormEditorFieldValues<TFieldType>[];\n subforms: BuilderFormEditorSubformValues[];\n sourceType: BuilderFormEditorValues<TFieldType, TTriggerEvent>[\"sourceType\"];\n sourceTable: string;\n tables: BuilderEditorDbTable<TFieldType>[];\n emptyField: BuilderFormEditorFieldValues<TFieldType>;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n isSaving: boolean;\n importFieldsFromTable(): void;\n};\n\nexport type BuilderListEditorBodyProps<TTriggerEvent extends string> = {\n listId?: string;\n form: UseFormReturn<BuilderListEditorValues<TTriggerEvent>>;\n columnArray: UseFieldArrayReturn<BuilderListEditorValues<TTriggerEvent>, \"columns\">;\n triggerArray: UseFieldArrayReturn<BuilderListEditorValues<TTriggerEvent>, \"triggers\">;\n sourceType: BuilderListEditorValues<TTriggerEvent>[\"sourceType\"];\n sourceTable: string;\n tables: BuilderEditorDbTable[];\n emptyColumn: BuilderListEditorColumnValues;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n isSaving: boolean;\n importColumnsFromTable(): void;\n};\n\nexport type BuilderFormEditorPageDependencies<\n TEntity extends BuilderEditorEntity & BuilderFormEditorEntity<TFieldType, TTriggerEvent>,\n TInput,\n TFieldType extends string,\n TTriggerEvent extends string,\n> = {\n emptyValues: BuilderFormEditorValues<TFieldType, TTriggerEvent>;\n emptyField: BuilderFormEditorFieldValues<TFieldType>;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n resolver?: Resolver<BuilderFormEditorValues<TFieldType, TTriggerEvent>>;\n labels: BuilderEditorLabels;\n states: BuilderEditorStateLabels;\n hooks: {\n useEntity(id?: string): BuilderEditorQuery<TEntity>;\n useTables(): BuilderEditorListQuery<BuilderEditorDbTable<TFieldType>>;\n useSave(): BuilderEditorSaveMutation<TInput, TEntity>;\n };\n buildInput(values: BuilderFormEditorValues<TFieldType, TTriggerEvent>): TInput;\n navigateAfterCreate(entity: TEntity): void;\n notifications: BuilderEditorNotifications;\n Body(props: BuilderFormEditorBodyProps<TFieldType, TTriggerEvent>): ReactNode;\n};\n\nexport type BuilderListEditorPageDependencies<\n TEntity extends BuilderEditorEntity & BuilderListEditorEntity<TTriggerEvent>,\n TInput,\n TTriggerEvent extends string,\n> = {\n emptyValues: BuilderListEditorValues<TTriggerEvent>;\n emptyColumn: BuilderListEditorColumnValues;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n resolver?: Resolver<BuilderListEditorValues<TTriggerEvent>>;\n labels: BuilderEditorLabels;\n states: BuilderEditorStateLabels;\n hooks: {\n useEntity(id?: string): BuilderEditorQuery<TEntity>;\n useTables(): BuilderEditorListQuery<BuilderEditorDbTable>;\n useSave(): BuilderEditorSaveMutation<TInput, TEntity>;\n };\n buildInput(values: BuilderListEditorValues<TTriggerEvent>): TInput;\n navigateAfterCreate(entity: TEntity): void;\n notifications: BuilderEditorNotifications;\n Body(props: BuilderListEditorBodyProps<TTriggerEvent>): ReactNode;\n};\n\nexport function createBuilderFormEditorPageComponent<\n TEntity extends BuilderEditorEntity & BuilderFormEditorEntity<TFieldType, TTriggerEvent>,\n TInput,\n TFieldType extends string,\n TTriggerEvent extends string,\n>(deps: BuilderFormEditorPageDependencies<TEntity, TInput, TFieldType, TTriggerEvent>) {\n return function BuilderFormEditorPage({ formId }: { formId?: string }) {\n const Body = deps.Body;\n const entityQuery = deps.hooks.useEntity(formId);\n const tables = deps.hooks.useTables();\n const save = deps.hooks.useSave();\n const form = useForm<BuilderFormEditorValues<TFieldType, TTriggerEvent>>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n const fieldArray = useFieldArray({ control: form.control, name: \"fields\" });\n const subformArray = useFieldArray({ control: form.control, name: \"subforms\" });\n const triggerArray = useFieldArray({ control: form.control, name: \"triggers\" });\n const fields = useWatch({ control: form.control, name: \"fields\" }) ?? [];\n const subforms = useWatch({ control: form.control, name: \"subforms\" }) ?? [];\n const sourceType = useWatch({ control: form.control, name: \"sourceType\" });\n const sourceTable = useWatch({ control: form.control, name: \"sourceTable\" });\n\n useEffect(() => {\n if (formId && !entityQuery.data) return;\n form.reset(builderFormEditorValuesFromEntity(entityQuery.data ?? null, deps.emptyValues));\n }, [entityQuery.data, form, formId]);\n\n const importFieldsFromTable = () => {\n const table = tables.data?.find((item) => item.name === sourceTable);\n if (!table) return;\n const nextFields = builderFormEditorFieldsFromTable(table);\n fieldArray.replace(nextFields);\n form.setValue(\"layoutGroups\", builderFormEditorDefaultLayoutGroups(nextFields), {\n shouldDirty: true,\n });\n };\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n const saved = await save.mutateAsync({ id: formId, input: deps.buildInput(values) });\n deps.notifications.success(formId ? deps.labels.saved : deps.labels.created);\n if (!formId) deps.navigateAfterCreate(saved);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n if (formId && entityQuery.isPending) {\n return <div className=\"text-muted-foreground text-sm\">{deps.states.loading}</div>;\n }\n\n if (formId && entityQuery.isError) {\n return <div className=\"text-destructive text-sm\">{deps.states.error}</div>;\n }\n\n return (\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <Body\n formId={formId}\n form={form}\n fieldArray={fieldArray}\n subformArray={subformArray}\n triggerArray={triggerArray}\n fields={fields}\n subforms={subforms}\n sourceType={sourceType}\n sourceTable={sourceTable}\n tables={tables.data ?? []}\n emptyField={deps.emptyField}\n emptyTrigger={deps.emptyTrigger}\n isSaving={save.isPending}\n importFieldsFromTable={importFieldsFromTable}\n />\n </form>\n </FormProvider>\n );\n };\n}\n\nexport function createBuilderListEditorPageComponent<\n TEntity extends BuilderEditorEntity & BuilderListEditorEntity<TTriggerEvent>,\n TInput,\n TTriggerEvent extends string,\n>(deps: BuilderListEditorPageDependencies<TEntity, TInput, TTriggerEvent>) {\n return function BuilderListEditorPage({ listId }: { listId?: string }) {\n const Body = deps.Body;\n const entityQuery = deps.hooks.useEntity(listId);\n const tables = deps.hooks.useTables();\n const save = deps.hooks.useSave();\n const form = useForm<BuilderListEditorValues<TTriggerEvent>>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n const columnArray = useFieldArray({ control: form.control, name: \"columns\" });\n const triggerArray = useFieldArray({ control: form.control, name: \"triggers\" });\n const sourceType = useWatch({ control: form.control, name: \"sourceType\" });\n const sourceTable = useWatch({ control: form.control, name: \"sourceTable\" });\n\n useEffect(() => {\n if (listId && !entityQuery.data) return;\n form.reset(builderListEditorValuesFromEntity(entityQuery.data ?? null, deps.emptyValues));\n }, [entityQuery.data, form, listId]);\n\n const importColumnsFromTable = () => {\n const table = tables.data?.find((item) => item.name === sourceTable);\n if (!table) return;\n columnArray.replace(builderListEditorColumnsFromTable(table));\n };\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n const saved = await save.mutateAsync({ id: listId, input: deps.buildInput(values) });\n deps.notifications.success(listId ? deps.labels.saved : deps.labels.created);\n if (!listId) deps.navigateAfterCreate(saved);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n if (listId && entityQuery.isPending) {\n return <div className=\"text-muted-foreground text-sm\">{deps.states.loading}</div>;\n }\n\n if (listId && entityQuery.isError) {\n return <div className=\"text-destructive text-sm\">{deps.states.error}</div>;\n }\n\n return (\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <Body\n listId={listId}\n form={form}\n columnArray={columnArray}\n triggerArray={triggerArray}\n sourceType={sourceType}\n sourceTable={sourceTable}\n tables={tables.data ?? []}\n emptyColumn={deps.emptyColumn}\n emptyTrigger={deps.emptyTrigger}\n isSaving={save.isPending}\n importColumnsFromTable={importColumnsFromTable}\n />\n </form>\n </FormProvider>\n );\n };\n}\n","export const BUILDER_EDITOR_NONE_VALUE = \"__none\";\n\nexport type BuilderEditorSelectOption = {\n label: string;\n value: string;\n};\n\nexport type BuilderEditorDbTable<TFieldType extends string = string> = {\n name: string;\n label?: string;\n lookupColumns?: Array<{\n name: string;\n label: string;\n }>;\n columns: Array<{\n name: string;\n label: string;\n fieldType: TFieldType;\n nullable: boolean;\n dataType: string;\n sortable: boolean;\n }>;\n};\n\ntype BuilderEditorSource =\n | { type: \"dbTable\"; tableName: string }\n | { type: \"apiEndpoint\"; basePath: string }\n | null;\n\ntype BuilderEditorTrigger<TEvent extends string> = {\n event: TEvent;\n action: string;\n enabled: boolean;\n blocking: boolean;\n config: Record<string, unknown>;\n};\n\ntype BuilderEditorField<TFieldType extends string> = {\n key: string;\n label: string;\n type: TFieldType;\n required: boolean;\n hidden?: boolean;\n disabled?: boolean;\n placeholder?: string;\n description?: string;\n options?: BuilderEditorSelectOption[];\n optionsSource?:\n | {\n type: \"dbTable\";\n tableName: string;\n valueField: string;\n labelField: string;\n searchFields?: string[];\n filterBy?: {\n field: string;\n valueFromField: string;\n };\n }\n | undefined;\n triggers?: BuilderEditorFieldTrigger[];\n};\n\nexport type BuilderEditorSubform = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n icon?: string;\n};\n\ntype BuilderEditorFormLayoutField = {\n key: string;\n span?: number;\n};\n\ntype BuilderEditorFormLayoutGroup = {\n id: string;\n title?: string | null;\n columns?: 6 | 8 | 12;\n fields?: BuilderEditorFormLayoutField[];\n};\n\ntype BuilderEditorFormLayout = {\n groups?: BuilderEditorFormLayoutGroup[];\n};\n\ntype BuilderEditorColumn = {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n};\n\nexport type BuilderFormEditorEntity<\n TFieldType extends string = string,\n TTriggerEvent extends string = string,\n> = {\n title: string;\n description: string | null;\n version: number;\n source: BuilderEditorSource;\n schema: {\n fields: BuilderEditorField<TFieldType>[];\n layout?: BuilderEditorFormLayout;\n subforms?: BuilderEditorSubform[];\n };\n triggers: BuilderEditorTrigger<TTriggerEvent>[];\n};\n\nexport type BuilderListEditorEntity<TTriggerEvent extends string = string> = {\n title: string;\n description: string | null;\n version: number;\n source: BuilderEditorSource;\n schema: { columns: BuilderEditorColumn[] };\n triggers: BuilderEditorTrigger<TTriggerEvent>[];\n};\n\nexport type BuilderFormEditorFieldValues<TFieldType extends string = string> = {\n key: string;\n label: string;\n type: TFieldType;\n required: boolean;\n hidden: boolean;\n disabled: boolean;\n placeholder?: string;\n optionsText?: string;\n optionsMode: \"static\" | \"table\";\n optionsTable: string;\n optionsValueField: string;\n optionsLabelField: string;\n optionsSearchFieldsText?: string;\n optionsDependsOn?: string;\n optionsFilterField?: string;\n triggers: BuilderEditorFieldTriggerValues[];\n};\n\nexport type BuilderFormEditorSubformValues = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n icon?: string;\n};\n\nexport type BuilderFormEditorLayoutFieldValues = {\n key: string;\n span: number;\n};\n\nexport type BuilderFormEditorLayoutGroupValues = {\n id: string;\n title: string;\n columns: 6 | 8 | 12;\n fields: BuilderFormEditorLayoutFieldValues[];\n};\n\nexport type BuilderEditorTriggerValues<TEvent extends string = string> = {\n event: TEvent;\n route: string;\n enabled: boolean;\n blocking: boolean;\n};\n\nexport type BuilderEditorFieldTrigger = {\n event: string;\n action: string;\n enabled: boolean;\n debounceMs: number;\n config: Record<string, unknown>;\n};\n\nexport type BuilderEditorFieldTriggerValues = {\n event: string;\n action: string;\n enabled: boolean;\n debounceMs: number;\n};\n\nexport type BuilderFormEditorValues<\n TFieldType extends string = string,\n TTriggerEvent extends string = string,\n> = {\n title: string;\n description?: string;\n sourceType: \"none\" | \"dbTable\" | \"apiEndpoint\";\n sourceTable: string;\n apiBasePath?: string;\n fields: BuilderFormEditorFieldValues<TFieldType>[];\n layoutGroups: BuilderFormEditorLayoutGroupValues[];\n subforms?: BuilderFormEditorSubformValues[];\n triggers: BuilderEditorTriggerValues<TTriggerEvent>[];\n version: number;\n};\n\nexport type BuilderListEditorColumnValues = {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n};\n\nexport type BuilderListEditorValues<TTriggerEvent extends string = string> = {\n title: string;\n description?: string;\n sourceType: \"none\" | \"dbTable\" | \"apiEndpoint\";\n sourceTable: string;\n apiBasePath?: string;\n columns: BuilderListEditorColumnValues[];\n triggers: BuilderEditorTriggerValues<TTriggerEvent>[];\n version: number;\n};\n\nexport type BuilderViewEditorEntity<TTrigger = unknown> = {\n title: string;\n description: string | null;\n formId: string | null;\n listId: string | null;\n permissionRead?: string | null;\n permissionWrite?: string | null;\n triggers: TTrigger[];\n version: number;\n};\n\nexport type BuilderViewEditorValues = {\n title: string;\n description?: string;\n formId: string;\n listId: string;\n permissionRead: string;\n permissionWrite: string;\n triggersText?: string;\n version: number;\n};\n\nexport function builderEditorOptionsToText(options?: BuilderEditorSelectOption[]) {\n return (options ?? []).map((option) => `${option.label}:${option.value}`).join(\"\\n\");\n}\n\nexport function builderEditorTextToOptions(\n value?: string,\n): BuilderEditorSelectOption[] | undefined {\n const rows = (value ?? \"\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n if (rows.length === 0) return undefined;\n return rows.map((line) => {\n const [label, ...rest] = line.split(\":\");\n return { label: label.trim(), value: rest.join(\":\").trim() || label.trim() };\n });\n}\n\nexport function builderEditorSearchFieldsToText(fields?: string[]) {\n return (fields ?? []).join(\"\\n\");\n}\n\nexport function builderEditorTextToSearchFields(value?: string): string[] | undefined {\n const fields = (value ?? \"\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n return fields.length > 0 ? fields : undefined;\n}\n\nexport function getBuilderEditorTriggerRoute(config: Record<string, unknown>) {\n const route = config.route ?? config.path ?? config.url;\n return typeof route === \"string\" ? route : \"\";\n}\n\nfunction valuesFromTriggers<TEvent extends string>(\n triggers: BuilderEditorTrigger<TEvent>[],\n): BuilderEditorTriggerValues<TEvent>[] {\n return triggers\n .filter((trigger) => trigger.action === \"callApi\" || trigger.action === \"webhook\")\n .map((trigger) => ({\n event: trigger.event,\n route: getBuilderEditorTriggerRoute(trigger.config),\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n }))\n .filter((trigger) => trigger.route);\n}\n\nfunction valuesFromFieldTriggers(\n triggers?: BuilderEditorFieldTrigger[],\n): BuilderEditorFieldTriggerValues[] {\n return (triggers ?? []).map((trigger) => ({\n event: trigger.event,\n action: trigger.action,\n enabled: trigger.enabled,\n debounceMs: trigger.debounceMs,\n }));\n}\n\nfunction clampLayoutSpan(span: number | undefined, columns: 6 | 8 | 12) {\n if (!span || Number.isNaN(span)) return columns;\n return Math.max(1, Math.min(columns, Math.trunc(span)));\n}\n\nexport function builderFormEditorDefaultSpan<TFieldType extends string>(\n field: BuilderFormEditorFieldValues<TFieldType>,\n) {\n if (field.type === \"textarea\" || field.type === \"checkbox\") return 12;\n return 6;\n}\n\nexport function builderFormEditorDefaultLayoutGroups<TFieldType extends string>(\n fields: BuilderFormEditorFieldValues<TFieldType>[],\n subforms: BuilderFormEditorSubformValues[] = [],\n): BuilderFormEditorLayoutGroupValues[] {\n return [\n {\n id: \"main\",\n title: \"Үндсэн\",\n columns: 12,\n fields: [\n ...fields.map((field) => ({\n key: field.key,\n span: builderFormEditorDefaultSpan(field),\n })),\n ...subforms.map((subform) => ({ key: subform.key, span: 12 })),\n ],\n },\n ];\n}\n\nexport function normalizeBuilderFormEditorLayoutGroups<TFieldType extends string>(\n groups: BuilderEditorFormLayoutGroup[] | undefined,\n fields: BuilderFormEditorFieldValues<TFieldType>[],\n subforms: BuilderFormEditorSubformValues[] = [],\n): BuilderFormEditorLayoutGroupValues[] {\n if (fields.length === 0 && subforms.length === 0) return [];\n\n const layoutItems = [\n ...fields.map((field) => ({\n key: field.key,\n span: builderFormEditorDefaultSpan(field),\n })),\n ...subforms.map((subform) => ({ key: subform.key, span: 12 })),\n ];\n const itemKeys = new Set(layoutItems.map((item) => item.key));\n const usedKeys = new Set<string>();\n const normalized = (groups ?? [])\n .map((group, index) => {\n const columns: 6 | 8 | 12 = group.columns === 6 || group.columns === 8 ? group.columns : 12;\n const groupFields = (group.fields ?? [])\n .filter((field) => itemKeys.has(field.key) && !usedKeys.has(field.key))\n .map((field) => {\n usedKeys.add(field.key);\n return { key: field.key, span: clampLayoutSpan(field.span, columns) };\n });\n\n return {\n id: group.id || `group${index + 1}`,\n title: group.title || `Group ${index + 1}`,\n columns,\n fields: groupFields,\n };\n })\n .filter((group) => group.fields.length > 0 || group.title.trim());\n\n const missingFields = layoutItems.filter((item) => !usedKeys.has(item.key));\n\n if (normalized.length === 0) {\n return builderFormEditorDefaultLayoutGroups(fields, subforms);\n }\n\n if (missingFields.length > 0) {\n normalized.push({\n id: \"ungrouped\",\n title: \"Бусад\",\n columns: 12,\n fields: missingFields,\n });\n }\n\n return normalized;\n}\n\nexport function builderFormEditorValuesFromEntity<\n TFieldType extends string,\n TTriggerEvent extends string,\n>(\n form: BuilderFormEditorEntity<TFieldType, TTriggerEvent> | null,\n emptyValues: BuilderFormEditorValues<TFieldType, TTriggerEvent>,\n): BuilderFormEditorValues<TFieldType, TTriggerEvent> {\n if (!form) return emptyValues;\n const source = form.source;\n const fields: BuilderFormEditorFieldValues<TFieldType>[] = form.schema.fields.map((field) => ({\n key: field.key,\n label: field.label,\n type: field.type,\n required: field.required,\n hidden: field.hidden ?? false,\n disabled: field.disabled ?? false,\n placeholder: field.placeholder ?? \"\",\n optionsText: builderEditorOptionsToText(field.options),\n optionsMode: field.optionsSource?.type === \"dbTable\" ? \"table\" : \"static\",\n optionsTable:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.tableName\n : BUILDER_EDITOR_NONE_VALUE,\n optionsValueField:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.valueField\n : BUILDER_EDITOR_NONE_VALUE,\n optionsLabelField:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.labelField\n : BUILDER_EDITOR_NONE_VALUE,\n optionsSearchFieldsText:\n field.optionsSource?.type === \"dbTable\"\n ? builderEditorSearchFieldsToText(field.optionsSource.searchFields)\n : \"\",\n optionsDependsOn:\n field.optionsSource?.type === \"dbTable\"\n ? (field.optionsSource.filterBy?.valueFromField ?? \"\")\n : \"\",\n optionsFilterField:\n field.optionsSource?.type === \"dbTable\" ? (field.optionsSource.filterBy?.field ?? \"\") : \"\",\n triggers: valuesFromFieldTriggers(field.triggers),\n }));\n const subforms = (form.schema.subforms ?? []).map((subform) => ({\n key: subform.key,\n label: subform.label,\n viewId: subform.viewId,\n parentField: subform.parentField,\n childField: subform.childField,\n buttonLabel: subform.buttonLabel ?? \"\",\n icon: subform.icon ?? \"\",\n }));\n return {\n title: form.title,\n description: form.description ?? \"\",\n sourceType: source?.type ?? \"none\",\n sourceTable: source?.type === \"dbTable\" ? source.tableName : BUILDER_EDITOR_NONE_VALUE,\n apiBasePath: source?.type === \"apiEndpoint\" ? source.basePath : \"\",\n fields,\n layoutGroups: normalizeBuilderFormEditorLayoutGroups(\n form.schema.layout?.groups,\n fields,\n subforms,\n ),\n subforms,\n triggers: valuesFromTriggers(form.triggers),\n version: form.version,\n };\n}\n\nexport function builderListEditorValuesFromEntity<TTriggerEvent extends string>(\n list: BuilderListEditorEntity<TTriggerEvent> | null,\n emptyValues: BuilderListEditorValues<TTriggerEvent>,\n): BuilderListEditorValues<TTriggerEvent> {\n if (!list) return emptyValues;\n const source = list.source;\n return {\n title: list.title,\n description: list.description ?? \"\",\n sourceType: source?.type ?? \"none\",\n sourceTable: source?.type === \"dbTable\" ? source.tableName : BUILDER_EDITOR_NONE_VALUE,\n apiBasePath: source?.type === \"apiEndpoint\" ? source.basePath : \"\",\n columns: list.schema.columns.map((column) => ({\n key: column.key,\n label: column.label,\n sortable: column.sortable,\n align: column.align,\n })),\n triggers: valuesFromTriggers(list.triggers),\n version: list.version,\n };\n}\n\nexport function builderViewEditorValuesFromEntity<TTrigger>(\n view: BuilderViewEditorEntity<TTrigger> | null,\n emptyValues: BuilderViewEditorValues,\n defaultPermission: string,\n): BuilderViewEditorValues {\n if (!view) return emptyValues;\n return {\n title: view.title,\n description: view.description ?? \"\",\n formId: view.formId ?? BUILDER_EDITOR_NONE_VALUE,\n listId: view.listId ?? BUILDER_EDITOR_NONE_VALUE,\n permissionRead: view.permissionRead ?? defaultPermission,\n permissionWrite: view.permissionWrite ?? defaultPermission,\n triggersText: JSON.stringify(view.triggers ?? [], null, 2),\n version: view.version,\n };\n}\n\nexport function builderFormEditorFieldsFromTable<TFieldType extends string>(\n table: BuilderEditorDbTable<TFieldType>,\n): BuilderFormEditorFieldValues<TFieldType>[] {\n return table.columns.map((column) => ({\n key: column.name,\n label: column.label,\n type: column.fieldType,\n required: !column.nullable,\n hidden: false,\n disabled: false,\n placeholder: column.label,\n optionsText: \"\",\n optionsMode: \"static\",\n optionsTable: BUILDER_EDITOR_NONE_VALUE,\n optionsValueField: BUILDER_EDITOR_NONE_VALUE,\n optionsLabelField: BUILDER_EDITOR_NONE_VALUE,\n optionsSearchFieldsText: \"\",\n optionsDependsOn: \"\",\n optionsFilterField: \"\",\n triggers: [],\n }));\n}\n\nexport function builderListEditorColumnsFromTable<TFieldType extends string>(\n table: BuilderEditorDbTable<TFieldType>,\n): BuilderListEditorColumnValues[] {\n return table.columns.map((column) => ({\n key: column.name,\n label: column.label,\n sortable: column.sortable,\n align: column.fieldType === \"number\" || column.fieldType === \"money\" ? \"right\" : \"left\",\n }));\n}\n\nexport function builderFormEditorInputFromValues<\n TFieldType extends string,\n TTriggerEvent extends string,\n>(values: BuilderFormEditorValues<TFieldType, TTriggerEvent>) {\n const source =\n values.sourceType === \"dbTable\" && values.sourceTable !== BUILDER_EDITOR_NONE_VALUE\n ? { type: \"dbTable\" as const, tableName: values.sourceTable }\n : values.sourceType === \"apiEndpoint\" && values.apiBasePath\n ? { type: \"apiEndpoint\" as const, basePath: values.apiBasePath }\n : null;\n\n return {\n title: values.title,\n description: values.description || null,\n source,\n schema: {\n fields: values.fields.map((field) => ({\n key: field.key,\n label: field.label,\n type: field.type,\n required: field.required,\n hidden: field.hidden,\n disabled: field.disabled,\n placeholder: field.placeholder?.trim() || field.label,\n options:\n field.type === \"select\" && field.optionsMode === \"static\"\n ? builderEditorTextToOptions(field.optionsText)\n : undefined,\n optionsSource:\n field.type === \"select\" &&\n field.optionsMode === \"table\" &&\n field.optionsTable !== BUILDER_EDITOR_NONE_VALUE &&\n field.optionsValueField !== BUILDER_EDITOR_NONE_VALUE &&\n field.optionsLabelField !== BUILDER_EDITOR_NONE_VALUE\n ? {\n type: \"dbTable\" as const,\n tableName: field.optionsTable,\n valueField: field.optionsValueField,\n labelField: field.optionsLabelField,\n searchFields: builderEditorTextToSearchFields(field.optionsSearchFieldsText),\n filterBy:\n field.optionsDependsOn && field.optionsFilterField\n ? {\n field: field.optionsFilterField,\n valueFromField: field.optionsDependsOn,\n }\n : undefined,\n }\n : undefined,\n triggers: field.triggers.map((trigger) => ({\n event: trigger.event,\n action: trigger.action,\n enabled: trigger.enabled,\n debounceMs: trigger.debounceMs,\n config: {},\n })),\n })),\n layout: {\n groups: normalizeBuilderFormEditorLayoutGroups(\n values.layoutGroups,\n values.fields,\n values.subforms ?? [],\n ),\n },\n subforms: (values.subforms ?? [])\n .filter(\n (subform) =>\n subform.key &&\n subform.label &&\n subform.viewId !== BUILDER_EDITOR_NONE_VALUE &&\n subform.parentField &&\n subform.childField,\n )\n .map((subform) => ({\n key: subform.key,\n label: subform.label,\n viewId: subform.viewId,\n parentField: subform.parentField,\n childField: subform.childField,\n buttonLabel: subform.buttonLabel?.trim() || undefined,\n icon: subform.icon?.trim() || undefined,\n })),\n },\n triggers: values.triggers.map((trigger) => ({\n event: trigger.event,\n action: \"callApi\" as const,\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n config: { route: trigger.route },\n })),\n version: values.version,\n };\n}\n\nexport function builderListEditorInputFromValues<TTriggerEvent extends string>(\n values: BuilderListEditorValues<TTriggerEvent>,\n) {\n const source =\n values.sourceType === \"dbTable\" && values.sourceTable !== BUILDER_EDITOR_NONE_VALUE\n ? { type: \"dbTable\" as const, tableName: values.sourceTable }\n : values.sourceType === \"apiEndpoint\" && values.apiBasePath\n ? { type: \"apiEndpoint\" as const, basePath: values.apiBasePath }\n : null;\n\n return {\n title: values.title,\n description: values.description || null,\n source,\n schema: { columns: values.columns },\n triggers: values.triggers.map((trigger) => ({\n event: trigger.event,\n action: \"callApi\" as const,\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n config: { route: trigger.route },\n })),\n version: values.version,\n };\n}\n\nexport function builderViewEditorInputFromValues<TTrigger>(\n values: BuilderViewEditorValues,\n parseTriggers: (value: string) => TTrigger[],\n) {\n return {\n title: values.title,\n description: values.description || null,\n formId: values.formId === BUILDER_EDITOR_NONE_VALUE ? null : values.formId,\n listId: values.listId === BUILDER_EDITOR_NONE_VALUE ? null : values.listId,\n permissionRead: values.permissionRead,\n permissionWrite: values.permissionWrite,\n triggers: values.triggersText?.trim() ? parseTriggers(values.triggersText) : [],\n version: values.version,\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type BuilderEntityManagerEntity = {\n id: string;\n title: string;\n};\n\nexport type BuilderEntityManagerActions<TEntity extends BuilderEntityManagerEntity> = {\n onEdit(entity: TEntity): void;\n onReplicate(entity: TEntity): void | Promise<void>;\n onDelete(entity: TEntity): void;\n runtimeHref?: (entity: TEntity) => string;\n};\n\nexport type BuilderEntityManagerDataGridProps<TController, TEntity> = {\n title: string;\n description: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder: string;\n emptyTitle: string;\n emptyDescription: string;\n onRowClick(entity: TEntity): void;\n toolbarExtra: ReactNode;\n};\n\nexport type BuilderEntityManagerAddButtonProps = {\n href: string;\n label: string;\n};\n\nexport type BuilderEntityManagerDialogAddButtonProps = {\n label: string;\n onAdd(): void;\n};\n\nexport type BuilderEntityManagerDeleteDialogProps<TEntity> = {\n entity: TEntity | null;\n title: string;\n description: string;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type BuilderEntityManagerEditorDialogProps<TEntity> = {\n open: boolean;\n editing: TEntity | null;\n onClose(): void;\n};\n\nexport type BuilderEntityManagerHookResult<TEntity> = {\n data?: {\n items: TEntity[];\n total: number;\n };\n isPending: boolean;\n};\n\nexport type BuilderEntityManagerMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type BuilderEntityManagerLabels = {\n title: string;\n description: string;\n searchPlaceholder: string;\n emptyTitle: string;\n emptyDescription: string;\n addLabel: string;\n deleteTitle: string;\n deleteDescription(entity: BuilderEntityManagerEntity | null): string;\n};\n\nexport type BuilderEntityManagerDependencies<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n> = {\n labels: BuilderEntityManagerLabels;\n createHref: string;\n runtimeHref(entity: TEntity): string;\n navigateToEdit(entity: TEntity): void;\n requestReplicateTitle(entity: TEntity): string | null | Promise<string | null>;\n hooks: {\n useEntities(query: TQuery): BuilderEntityManagerHookResult<TEntity>;\n useDelete(): BuilderEntityManagerMutation<string>;\n useReplicate(): BuilderEntityManagerMutation<{ id: string; input: { title?: string } }>;\n };\n buildColumns(actions: BuilderEntityManagerActions<TEntity>): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: TEntity[];\n rowCount: number;\n state: TState;\n getRowId(row: TEntity): string;\n }): TController;\n DataGrid: ComponentType<BuilderEntityManagerDataGridProps<TController, TEntity>>;\n AddButton: ComponentType<BuilderEntityManagerAddButtonProps>;\n DeleteDialog: ComponentType<BuilderEntityManagerDeleteDialogProps<TEntity>>;\n};\n\nexport type BuilderEntityDialogManagerDependencies<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n> = {\n labels: BuilderEntityManagerLabels;\n runtimeHref(entity: TEntity): string;\n requestReplicateTitle(entity: TEntity): string | null | Promise<string | null>;\n hooks: {\n useEntities(query: TQuery): BuilderEntityManagerHookResult<TEntity>;\n useDelete(): BuilderEntityManagerMutation<string>;\n useReplicate(): BuilderEntityManagerMutation<{ id: string; input: { title?: string } }>;\n };\n buildColumns(actions: BuilderEntityManagerActions<TEntity>): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: TEntity[];\n rowCount: number;\n state: TState;\n getRowId(row: TEntity): string;\n }): TController;\n DataGrid: ComponentType<BuilderEntityManagerDataGridProps<TController, TEntity>>;\n AddButton: ComponentType<BuilderEntityManagerDialogAddButtonProps>;\n EditorDialog: ComponentType<BuilderEntityManagerEditorDialogProps<TEntity>>;\n DeleteDialog: ComponentType<BuilderEntityManagerDeleteDialogProps<TEntity>>;\n};\n\nexport function createBuilderEntityManagerComponent<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n>(deps: BuilderEntityManagerDependencies<TEntity, TColumn, TState, TQuery, TController>) {\n return function BuilderEntityManager() {\n const [pendingDelete, setPendingDelete] = useState<TEntity | null>(null);\n const state = deps.useDataTableState({ pageSize: 20 });\n const query = deps.hooks.useEntities(state.query);\n const remove = deps.hooks.useDelete();\n const replicate = deps.hooks.useReplicate();\n\n const columns = useMemo(\n () =>\n deps.buildColumns({\n onEdit: deps.navigateToEdit,\n onReplicate: async (entity) => {\n const title = await deps.requestReplicateTitle(entity);\n if (!title) return;\n await replicate.mutateAsync({ id: entity.id, input: { title } });\n },\n onDelete: setPendingDelete,\n runtimeHref: deps.runtimeHref,\n }),\n [replicate],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: query.data?.items ?? [],\n rowCount: query.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={deps.labels.title}\n description={deps.labels.description}\n controller={controller}\n isLoading={query.isPending}\n searchPlaceholder={deps.labels.searchPlaceholder}\n emptyTitle={deps.labels.emptyTitle}\n emptyDescription={deps.labels.emptyDescription}\n onRowClick={deps.navigateToEdit}\n toolbarExtra={<deps.AddButton href={deps.createHref} label={deps.labels.addLabel} />}\n />\n\n <deps.DeleteDialog\n entity={pendingDelete}\n title={deps.labels.deleteTitle}\n description={deps.labels.deleteDescription(pendingDelete)}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n\nexport function createBuilderEntityDialogManagerComponent<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n>(deps: BuilderEntityDialogManagerDependencies<TEntity, TColumn, TState, TQuery, TController>) {\n return function BuilderEntityDialogManager() {\n const [editing, setEditing] = useState<TEntity | null>(null);\n const [isEditorOpen, setEditorOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<TEntity | null>(null);\n const state = deps.useDataTableState({ pageSize: 20 });\n const query = deps.hooks.useEntities(state.query);\n const remove = deps.hooks.useDelete();\n const replicate = deps.hooks.useReplicate();\n\n const openEditor = useCallback((entity: TEntity | null) => {\n setEditing(entity);\n setEditorOpen(true);\n }, []);\n\n const columns = useMemo(\n () =>\n deps.buildColumns({\n onEdit: (entity) => openEditor(entity),\n onReplicate: async (entity) => {\n const title = await deps.requestReplicateTitle(entity);\n if (!title) return;\n await replicate.mutateAsync({ id: entity.id, input: { title } });\n },\n onDelete: setPendingDelete,\n runtimeHref: deps.runtimeHref,\n }),\n [replicate, openEditor],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: query.data?.items ?? [],\n rowCount: query.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={deps.labels.title}\n description={deps.labels.description}\n controller={controller}\n isLoading={query.isPending}\n searchPlaceholder={deps.labels.searchPlaceholder}\n emptyTitle={deps.labels.emptyTitle}\n emptyDescription={deps.labels.emptyDescription}\n onRowClick={openEditor}\n toolbarExtra={\n <deps.AddButton label={deps.labels.addLabel} onAdd={() => openEditor(null)} />\n }\n />\n\n <deps.EditorDialog\n open={isEditorOpen}\n editing={editing}\n onClose={() => setEditorOpen(false)}\n />\n\n <deps.DeleteDialog\n entity={pendingDelete}\n title={deps.labels.deleteTitle}\n description={deps.labels.deleteDescription(pendingDelete)}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { FormProvider, type Resolver, type UseFormReturn, useForm } from \"react-hook-form\";\nimport {\n type BuilderViewEditorEntity,\n type BuilderViewEditorValues,\n builderViewEditorValuesFromEntity,\n} from \"./editorState\";\n\ntype BuilderOptionEntity = {\n id: string;\n title: string;\n};\n\ntype BuilderViewDialogSaveMutation<TInput> = (args: {\n id?: string;\n input: TInput;\n}) => Promise<unknown>;\n\ntype BuilderViewDialogNotifications = {\n success(message: string): void;\n error(error: unknown): void;\n};\n\ntype BuilderViewDialogLabels = {\n created: string;\n saved: string;\n};\n\nexport type BuilderViewDialogProps<TView, TForm, TList, TInput> = {\n open: boolean;\n editing: TView | null;\n forms: TForm[];\n lists: TList[];\n onClose(): void;\n onSave: BuilderViewDialogSaveMutation<TInput>;\n isSaving: boolean;\n};\n\nexport type BuilderViewDialogShellProps<TView> = {\n open: boolean;\n editing: TView | null;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type BuilderViewDialogBodyProps<TForm, TList> = {\n form: UseFormReturn<BuilderViewEditorValues>;\n editing: BuilderViewEditorEntity | null;\n forms: TForm[];\n lists: TList[];\n permissionOptions: Array<{ value: string; label: string }>;\n noneValue: string;\n isSaving: boolean;\n onClose(): void;\n};\n\nexport type BuilderViewDialogDependencies<\n TView extends BuilderViewEditorEntity & { id: string },\n TForm extends BuilderOptionEntity,\n TList extends BuilderOptionEntity,\n TInput,\n> = {\n emptyValues: BuilderViewEditorValues;\n defaultPermission: string;\n permissionOptions: Array<{ value: string; label: string }>;\n noneValue: string;\n resolver?: Resolver<BuilderViewEditorValues>;\n labels: BuilderViewDialogLabels;\n buildInput(values: BuilderViewEditorValues): TInput;\n notifications: BuilderViewDialogNotifications;\n Shell(props: BuilderViewDialogShellProps<TView>): ReactNode;\n Body(props: BuilderViewDialogBodyProps<TForm, TList>): ReactNode;\n};\n\nexport function createBuilderViewDialogComponent<\n TView extends BuilderViewEditorEntity & { id: string },\n TForm extends BuilderOptionEntity,\n TList extends BuilderOptionEntity,\n TInput,\n>(deps: BuilderViewDialogDependencies<TView, TForm, TList, TInput>) {\n return function BuilderViewDialog({\n open,\n editing,\n forms,\n lists,\n onClose,\n onSave,\n isSaving,\n }: BuilderViewDialogProps<TView, TForm, TList, TInput>) {\n const form = useForm<BuilderViewEditorValues>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n\n useEffect(() => {\n if (!open) return;\n form.reset(\n builderViewEditorValuesFromEntity(editing, deps.emptyValues, deps.defaultPermission),\n );\n }, [editing, form, open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({ id: editing?.id, input: deps.buildInput(values) });\n onClose();\n deps.notifications.success(editing ? deps.labels.saved : deps.labels.created);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n return (\n <deps.Shell open={open} editing={editing} onClose={onClose}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate>\n {deps.Body({\n form,\n editing,\n forms,\n lists,\n permissionOptions: deps.permissionOptions,\n noneValue: deps.noneValue,\n isSaving,\n onClose,\n })}\n </form>\n </FormProvider>\n </deps.Shell>\n );\n };\n}\n"],"mappings":"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","names":["jsx","useEffect","FormProvider","useForm","jsx","useForm","useEffect","FormProvider"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
type BuilderApiQueryValue = string | number | boolean | null | undefined;
|
|
2
|
+
type BuilderApiQuery = Record<string, BuilderApiQueryValue>;
|
|
3
|
+
type BuilderApiTransport = {
|
|
4
|
+
get<T>(path: string, options?: {
|
|
5
|
+
query?: BuilderApiQuery;
|
|
6
|
+
}): Promise<T>;
|
|
7
|
+
post<T>(path: string, body?: unknown, options?: {
|
|
8
|
+
query?: BuilderApiQuery;
|
|
9
|
+
}): Promise<T>;
|
|
10
|
+
patch<T>(path: string, body?: unknown, options?: {
|
|
11
|
+
query?: BuilderApiQuery;
|
|
12
|
+
}): Promise<T>;
|
|
13
|
+
delete<T>(path: string, options?: {
|
|
14
|
+
query?: BuilderApiQuery;
|
|
15
|
+
}): Promise<T>;
|
|
16
|
+
};
|
|
17
|
+
type BuilderFieldOptionsQuery = {
|
|
18
|
+
search?: string;
|
|
19
|
+
depends?: Record<string, string | undefined>;
|
|
20
|
+
};
|
|
21
|
+
type BuilderApiContracts = {
|
|
22
|
+
BuilderDbTable: unknown;
|
|
23
|
+
BuilderForm: {
|
|
24
|
+
id: string;
|
|
25
|
+
};
|
|
26
|
+
BuilderList: {
|
|
27
|
+
id: string;
|
|
28
|
+
};
|
|
29
|
+
BuilderView: {
|
|
30
|
+
id: string;
|
|
31
|
+
};
|
|
32
|
+
BuilderViewEntry: {
|
|
33
|
+
id: string;
|
|
34
|
+
};
|
|
35
|
+
ListBuilderFormsQuery: object;
|
|
36
|
+
ListBuilderFormsResponse: unknown;
|
|
37
|
+
CreateBuilderFormInput: unknown;
|
|
38
|
+
UpdateBuilderFormInput: unknown;
|
|
39
|
+
ListBuilderListsQuery: object;
|
|
40
|
+
ListBuilderListsResponse: unknown;
|
|
41
|
+
CreateBuilderListInput: unknown;
|
|
42
|
+
UpdateBuilderListInput: unknown;
|
|
43
|
+
ListBuilderViewsQuery: object;
|
|
44
|
+
ListBuilderViewsResponse: unknown;
|
|
45
|
+
CreateBuilderViewInput: unknown;
|
|
46
|
+
UpdateBuilderViewInput: unknown;
|
|
47
|
+
ReplicateBuilderEntityInput: unknown;
|
|
48
|
+
CreateBuilderViewEntryInput: unknown;
|
|
49
|
+
CreateCompositeBuilderViewEntryInput: unknown;
|
|
50
|
+
UpdateCompositeBuilderViewEntryInput: unknown;
|
|
51
|
+
UpdateBuilderViewEntryInput: unknown;
|
|
52
|
+
ListBuilderFieldOptionsQuery: BuilderFieldOptionsQuery;
|
|
53
|
+
ListBuilderFieldOptionsResponse: unknown;
|
|
54
|
+
RunBuilderFieldTriggerInput: unknown;
|
|
55
|
+
BuilderFieldTriggerEvent: string;
|
|
56
|
+
BuilderFieldTriggerResponse: unknown;
|
|
57
|
+
ListBuilderViewEntriesQuery: object;
|
|
58
|
+
ListBuilderViewEntriesResponse: unknown;
|
|
59
|
+
};
|
|
60
|
+
declare function createBuilderApiClient<C extends BuilderApiContracts>(transport: BuilderApiTransport): {
|
|
61
|
+
listBuilderForms: (query: C["ListBuilderFormsQuery"]) => Promise<C["ListBuilderFormsResponse"]>;
|
|
62
|
+
listBuilderDbTables: () => Promise<C["BuilderDbTable"][]>;
|
|
63
|
+
listBuilderFormOptions: () => Promise<C["BuilderForm"][]>;
|
|
64
|
+
getBuilderForm: (id: string) => Promise<C["BuilderForm"]>;
|
|
65
|
+
createBuilderForm: (input: C["CreateBuilderFormInput"]) => Promise<C["BuilderForm"]>;
|
|
66
|
+
updateBuilderForm: (id: string, input: C["UpdateBuilderFormInput"]) => Promise<C["BuilderForm"]>;
|
|
67
|
+
replicateBuilderForm: (id: string, input: C["ReplicateBuilderEntityInput"]) => Promise<C["BuilderForm"]>;
|
|
68
|
+
deleteBuilderForm: (id: string) => Promise<void>;
|
|
69
|
+
listBuilderLists: (query: C["ListBuilderListsQuery"]) => Promise<C["ListBuilderListsResponse"]>;
|
|
70
|
+
listBuilderListOptions: () => Promise<C["BuilderList"][]>;
|
|
71
|
+
getBuilderList: (id: string) => Promise<C["BuilderList"]>;
|
|
72
|
+
createBuilderList: (input: C["CreateBuilderListInput"]) => Promise<C["BuilderList"]>;
|
|
73
|
+
updateBuilderList: (id: string, input: C["UpdateBuilderListInput"]) => Promise<C["BuilderList"]>;
|
|
74
|
+
replicateBuilderList: (id: string, input: C["ReplicateBuilderEntityInput"]) => Promise<C["BuilderList"]>;
|
|
75
|
+
deleteBuilderList: (id: string) => Promise<void>;
|
|
76
|
+
listBuilderViews: (query: C["ListBuilderViewsQuery"]) => Promise<C["ListBuilderViewsResponse"]>;
|
|
77
|
+
getBuilderView: (id: string) => Promise<C["BuilderView"]>;
|
|
78
|
+
createBuilderView: (input: C["CreateBuilderViewInput"]) => Promise<C["BuilderView"]>;
|
|
79
|
+
updateBuilderView: (id: string, input: C["UpdateBuilderViewInput"]) => Promise<C["BuilderView"]>;
|
|
80
|
+
replicateBuilderView: (id: string, input: C["ReplicateBuilderEntityInput"]) => Promise<C["BuilderView"]>;
|
|
81
|
+
deleteBuilderView: (id: string) => Promise<void>;
|
|
82
|
+
getRuntimeBuilderForm: (id: string) => Promise<C["BuilderForm"]>;
|
|
83
|
+
createRuntimeBuilderFormEntry: (formId: string, input: C["CreateBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
84
|
+
listRuntimeBuilderFormFieldOptions: (formId: string, fieldKey: string, query: C["ListBuilderFieldOptionsQuery"]) => Promise<C["ListBuilderFieldOptionsResponse"]>;
|
|
85
|
+
runRuntimeBuilderFormFieldTrigger: (formId: string, fieldKey: string, event: C["BuilderFieldTriggerEvent"], input: C["RunBuilderFieldTriggerInput"]) => Promise<C["BuilderFieldTriggerResponse"]>;
|
|
86
|
+
getRuntimeBuilderList: (id: string) => Promise<C["BuilderList"]>;
|
|
87
|
+
listRuntimeBuilderListEntries: (listId: string, query: C["ListBuilderViewEntriesQuery"]) => Promise<C["ListBuilderViewEntriesResponse"]>;
|
|
88
|
+
getRuntimeBuilderView: (id: string) => Promise<C["BuilderView"]>;
|
|
89
|
+
runRuntimeBuilderViewFieldTrigger: (viewId: string, fieldKey: string, event: C["BuilderFieldTriggerEvent"], input: C["RunBuilderFieldTriggerInput"]) => Promise<C["BuilderFieldTriggerResponse"]>;
|
|
90
|
+
listBuilderViewEntries: (viewId: string, query: C["ListBuilderViewEntriesQuery"]) => Promise<C["ListBuilderViewEntriesResponse"]>;
|
|
91
|
+
createBuilderViewEntry: (viewId: string, input: C["CreateBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
92
|
+
createCompositeBuilderViewEntry: (viewId: string, input: C["CreateCompositeBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
93
|
+
updateCompositeBuilderViewEntry: (viewId: string, id: string, input: C["UpdateCompositeBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
94
|
+
updateBuilderViewEntry: (viewId: string, id: string, input: C["UpdateBuilderViewEntryInput"]) => Promise<C["BuilderViewEntry"]>;
|
|
95
|
+
deleteBuilderViewEntry: (viewId: string, id: string) => Promise<void>;
|
|
96
|
+
};
|
|
97
|
+
type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<typeof createBuilderApiClient<C>>;
|
|
98
|
+
|
|
99
|
+
export { type BuilderApiClient, type BuilderApiContracts, type BuilderApiQuery, type BuilderApiQueryValue, type BuilderApiTransport, type BuilderFieldOptionsQuery, createBuilderApiClient };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/api/createBuilderApiClient.ts
|
|
2
|
+
function queryParams(query) {
|
|
3
|
+
return { ...query };
|
|
4
|
+
}
|
|
5
|
+
function fieldOptionsQueryParams(query) {
|
|
6
|
+
const flatQuery = { search: query.search };
|
|
7
|
+
for (const [key, value] of Object.entries(query.depends ?? {})) {
|
|
8
|
+
flatQuery[`depends.${key}`] = value;
|
|
9
|
+
}
|
|
10
|
+
return flatQuery;
|
|
11
|
+
}
|
|
12
|
+
function createBuilderApiClient(transport) {
|
|
13
|
+
return {
|
|
14
|
+
listBuilderForms: (query) => transport.get("/builder/forms", {
|
|
15
|
+
query: queryParams(query)
|
|
16
|
+
}),
|
|
17
|
+
listBuilderDbTables: () => transport.get("/builder/datasources/tables"),
|
|
18
|
+
listBuilderFormOptions: () => transport.get("/builder/forms/options"),
|
|
19
|
+
getBuilderForm: (id) => transport.get(`/builder/forms/${encodeURIComponent(id)}`),
|
|
20
|
+
createBuilderForm: (input) => transport.post("/builder/forms", input),
|
|
21
|
+
updateBuilderForm: (id, input) => transport.patch(`/builder/forms/${encodeURIComponent(id)}`, input),
|
|
22
|
+
replicateBuilderForm: (id, input) => transport.post(`/builder/forms/${encodeURIComponent(id)}/replicate`, input),
|
|
23
|
+
deleteBuilderForm: (id) => transport.delete(`/builder/forms/${encodeURIComponent(id)}`),
|
|
24
|
+
listBuilderLists: (query) => transport.get("/builder/lists", {
|
|
25
|
+
query: queryParams(query)
|
|
26
|
+
}),
|
|
27
|
+
listBuilderListOptions: () => transport.get("/builder/lists/options"),
|
|
28
|
+
getBuilderList: (id) => transport.get(`/builder/lists/${encodeURIComponent(id)}`),
|
|
29
|
+
createBuilderList: (input) => transport.post("/builder/lists", input),
|
|
30
|
+
updateBuilderList: (id, input) => transport.patch(`/builder/lists/${encodeURIComponent(id)}`, input),
|
|
31
|
+
replicateBuilderList: (id, input) => transport.post(`/builder/lists/${encodeURIComponent(id)}/replicate`, input),
|
|
32
|
+
deleteBuilderList: (id) => transport.delete(`/builder/lists/${encodeURIComponent(id)}`),
|
|
33
|
+
listBuilderViews: (query) => transport.get("/builder/views", {
|
|
34
|
+
query: queryParams(query)
|
|
35
|
+
}),
|
|
36
|
+
getBuilderView: (id) => transport.get(`/builder/views/${encodeURIComponent(id)}`),
|
|
37
|
+
createBuilderView: (input) => transport.post("/builder/views", input),
|
|
38
|
+
updateBuilderView: (id, input) => transport.patch(`/builder/views/${encodeURIComponent(id)}`, input),
|
|
39
|
+
replicateBuilderView: (id, input) => transport.post(`/builder/views/${encodeURIComponent(id)}/replicate`, input),
|
|
40
|
+
deleteBuilderView: (id) => transport.delete(`/builder/views/${encodeURIComponent(id)}`),
|
|
41
|
+
getRuntimeBuilderForm: (id) => transport.get(`/builder/runtime/forms/${encodeURIComponent(id)}`),
|
|
42
|
+
createRuntimeBuilderFormEntry: (formId, input) => transport.post(
|
|
43
|
+
`/builder/runtime/forms/${encodeURIComponent(formId)}/entries`,
|
|
44
|
+
input
|
|
45
|
+
),
|
|
46
|
+
listRuntimeBuilderFormFieldOptions: (formId, fieldKey, query) => transport.get(
|
|
47
|
+
`/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/options`,
|
|
48
|
+
{ query: fieldOptionsQueryParams(query) }
|
|
49
|
+
),
|
|
50
|
+
runRuntimeBuilderFormFieldTrigger: (formId, fieldKey, event, input) => transport.post(
|
|
51
|
+
`/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,
|
|
52
|
+
input
|
|
53
|
+
),
|
|
54
|
+
getRuntimeBuilderList: (id) => transport.get(`/builder/runtime/lists/${encodeURIComponent(id)}`),
|
|
55
|
+
listRuntimeBuilderListEntries: (listId, query) => transport.get(
|
|
56
|
+
`/builder/runtime/lists/${encodeURIComponent(listId)}/entries`,
|
|
57
|
+
{ query: queryParams(query) }
|
|
58
|
+
),
|
|
59
|
+
getRuntimeBuilderView: (id) => transport.get(`/builder/runtime/views/${encodeURIComponent(id)}`),
|
|
60
|
+
runRuntimeBuilderViewFieldTrigger: (viewId, fieldKey, event, input) => transport.post(
|
|
61
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,
|
|
62
|
+
input
|
|
63
|
+
),
|
|
64
|
+
listBuilderViewEntries: (viewId, query) => transport.get(
|
|
65
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,
|
|
66
|
+
{ query: queryParams(query) }
|
|
67
|
+
),
|
|
68
|
+
createBuilderViewEntry: (viewId, input) => transport.post(
|
|
69
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,
|
|
70
|
+
input
|
|
71
|
+
),
|
|
72
|
+
createCompositeBuilderViewEntry: (viewId, input) => transport.post(
|
|
73
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries`,
|
|
74
|
+
input
|
|
75
|
+
),
|
|
76
|
+
updateCompositeBuilderViewEntry: (viewId, id, input) => transport.patch(
|
|
77
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries/${encodeURIComponent(id)}`,
|
|
78
|
+
input
|
|
79
|
+
),
|
|
80
|
+
updateBuilderViewEntry: (viewId, id, input) => transport.patch(
|
|
81
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,
|
|
82
|
+
input
|
|
83
|
+
),
|
|
84
|
+
deleteBuilderViewEntry: (viewId, id) => transport.delete(
|
|
85
|
+
`/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`
|
|
86
|
+
)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export {
|
|
90
|
+
createBuilderApiClient
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/createBuilderApiClient.ts"],"sourcesContent":["export type BuilderApiQueryValue = string | number | boolean | null | undefined;\nexport type BuilderApiQuery = Record<string, BuilderApiQueryValue>;\n\nexport type BuilderApiTransport = {\n get<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n post<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n patch<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n delete<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n};\n\nexport type BuilderFieldOptionsQuery = {\n search?: string;\n depends?: Record<string, string | undefined>;\n};\n\nexport type BuilderApiContracts = {\n BuilderDbTable: unknown;\n BuilderForm: { id: string };\n BuilderList: { id: string };\n BuilderView: { id: string };\n BuilderViewEntry: { id: string };\n ListBuilderFormsQuery: object;\n ListBuilderFormsResponse: unknown;\n CreateBuilderFormInput: unknown;\n UpdateBuilderFormInput: unknown;\n ListBuilderListsQuery: object;\n ListBuilderListsResponse: unknown;\n CreateBuilderListInput: unknown;\n UpdateBuilderListInput: unknown;\n ListBuilderViewsQuery: object;\n ListBuilderViewsResponse: unknown;\n CreateBuilderViewInput: unknown;\n UpdateBuilderViewInput: unknown;\n ReplicateBuilderEntityInput: unknown;\n CreateBuilderViewEntryInput: unknown;\n CreateCompositeBuilderViewEntryInput: unknown;\n UpdateCompositeBuilderViewEntryInput: unknown;\n UpdateBuilderViewEntryInput: unknown;\n ListBuilderFieldOptionsQuery: BuilderFieldOptionsQuery;\n ListBuilderFieldOptionsResponse: unknown;\n RunBuilderFieldTriggerInput: unknown;\n BuilderFieldTriggerEvent: string;\n BuilderFieldTriggerResponse: unknown;\n ListBuilderViewEntriesQuery: object;\n ListBuilderViewEntriesResponse: unknown;\n};\n\nfunction queryParams(query: object): BuilderApiQuery {\n return { ...query } as BuilderApiQuery;\n}\n\nfunction fieldOptionsQueryParams(query: BuilderFieldOptionsQuery): BuilderApiQuery {\n const flatQuery: BuilderApiQuery = { search: query.search };\n for (const [key, value] of Object.entries(query.depends ?? {})) {\n flatQuery[`depends.${key}`] = value;\n }\n return flatQuery;\n}\n\nexport function createBuilderApiClient<C extends BuilderApiContracts>(\n transport: BuilderApiTransport,\n) {\n return {\n listBuilderForms: (query: C[\"ListBuilderFormsQuery\"]) =>\n transport.get<C[\"ListBuilderFormsResponse\"]>(\"/builder/forms\", {\n query: queryParams(query),\n }),\n\n listBuilderDbTables: () => transport.get<C[\"BuilderDbTable\"][]>(\"/builder/datasources/tables\"),\n\n listBuilderFormOptions: () => transport.get<C[\"BuilderForm\"][]>(\"/builder/forms/options\"),\n\n getBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`),\n\n createBuilderForm: (input: C[\"CreateBuilderFormInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(\"/builder/forms\", input),\n\n updateBuilderForm: (id: string, input: C[\"UpdateBuilderFormInput\"]) =>\n transport.patch<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`, input),\n\n replicateBuilderForm: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderForm: (id: string) =>\n transport.delete<void>(`/builder/forms/${encodeURIComponent(id)}`),\n\n listBuilderLists: (query: C[\"ListBuilderListsQuery\"]) =>\n transport.get<C[\"ListBuilderListsResponse\"]>(\"/builder/lists\", {\n query: queryParams(query),\n }),\n\n listBuilderListOptions: () => transport.get<C[\"BuilderList\"][]>(\"/builder/lists/options\"),\n\n getBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`),\n\n createBuilderList: (input: C[\"CreateBuilderListInput\"]) =>\n transport.post<C[\"BuilderList\"]>(\"/builder/lists\", input),\n\n updateBuilderList: (id: string, input: C[\"UpdateBuilderListInput\"]) =>\n transport.patch<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`, input),\n\n replicateBuilderList: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderList: (id: string) =>\n transport.delete<void>(`/builder/lists/${encodeURIComponent(id)}`),\n\n listBuilderViews: (query: C[\"ListBuilderViewsQuery\"]) =>\n transport.get<C[\"ListBuilderViewsResponse\"]>(\"/builder/views\", {\n query: queryParams(query),\n }),\n\n getBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`),\n\n createBuilderView: (input: C[\"CreateBuilderViewInput\"]) =>\n transport.post<C[\"BuilderView\"]>(\"/builder/views\", input),\n\n updateBuilderView: (id: string, input: C[\"UpdateBuilderViewInput\"]) =>\n transport.patch<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`, input),\n\n replicateBuilderView: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderView: (id: string) =>\n transport.delete<void>(`/builder/views/${encodeURIComponent(id)}`),\n\n getRuntimeBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/runtime/forms/${encodeURIComponent(id)}`),\n\n createRuntimeBuilderFormEntry: (formId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/entries`,\n input,\n ),\n\n listRuntimeBuilderFormFieldOptions: (\n formId: string,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n ) =>\n transport.get<C[\"ListBuilderFieldOptionsResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/options`,\n { query: fieldOptionsQueryParams(query) },\n ),\n\n runRuntimeBuilderFormFieldTrigger: (\n formId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n getRuntimeBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/runtime/lists/${encodeURIComponent(id)}`),\n\n listRuntimeBuilderListEntries: (listId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/lists/${encodeURIComponent(listId)}/entries`,\n { query: queryParams(query) },\n ),\n\n getRuntimeBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/runtime/views/${encodeURIComponent(id)}`),\n\n runRuntimeBuilderViewFieldTrigger: (\n viewId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n listBuilderViewEntries: (viewId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n { query: queryParams(query) },\n ),\n\n createBuilderViewEntry: (viewId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n input,\n ),\n\n createCompositeBuilderViewEntry: (\n viewId: string,\n input: C[\"CreateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries`,\n input,\n ),\n\n updateCompositeBuilderViewEntry: (\n viewId: string,\n id: string,\n input: C[\"UpdateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n updateBuilderViewEntry: (viewId: string, id: string, input: C[\"UpdateBuilderViewEntryInput\"]) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n deleteBuilderViewEntry: (viewId: string, id: string) =>\n transport.delete<void>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n ),\n };\n}\n\nexport type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<\n typeof createBuilderApiClient<C>\n>;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { R as RuntimeEntryDialogDraftRowsChange } from '../RuntimeEntryDialog-DAO74GFp.js';
|
|
2
|
+
export { D as DynamicFormContracts, a as DynamicFormDependencies, b as DynamicFormErrorStateProps, c as DynamicFormFieldsProps, d as DynamicFormNotifications, e as DynamicFormProps, f as DynamicFormShellProps, g as DynamicFormSubmitProps, h as DynamicListContracts, i as DynamicListDataGridProps, j as DynamicListDependencies, k as DynamicListErrorStateProps, l as DynamicListProps, m as DynamicViewAddButtonProps, n as DynamicViewColumnActions, o as DynamicViewContracts, p as DynamicViewDataGridProps, q as DynamicViewDeleteDialogProps, r as DynamicViewDependencies, s as DynamicViewEntryDialogProps, t as DynamicViewErrorStateProps, u as DynamicViewProps, v as RuntimeEntryDialogActionsProps, w as RuntimeEntryDialogDependencies, x as RuntimeEntryDialogFieldsProps, y as RuntimeEntryDialogNotifications, z as RuntimeEntryDialogProps, A as RuntimeEntryDialogSaveArgs, B as RuntimeEntryDialogShellProps, C as RuntimeEntryDialogViewLike, E as createDynamicFormComponent, F as createDynamicListComponent, G as createDynamicViewComponent, H as createRuntimeEntryDialogComponent } from '../RuntimeEntryDialog-DAO74GFp.js';
|
|
3
|
+
import * as react from 'react';
|
|
4
|
+
import { ReactNode, ComponentType } from 'react';
|
|
5
|
+
import { BuilderApiContracts } from '../api/index.js';
|
|
6
|
+
import { BuilderHooks } from '../hooks/index.js';
|
|
7
|
+
import { BuilderRuntimeFormSchemaLike, BuilderRuntimeEntryLike, BuilderRuntimeEntryValues } from '../runtime/index.js';
|
|
8
|
+
import '@tanstack/react-query';
|
|
9
|
+
|
|
10
|
+
type RuntimeDatasourceLike = {
|
|
11
|
+
type: "dbTable";
|
|
12
|
+
tableName: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: string;
|
|
15
|
+
} | null;
|
|
16
|
+
type RuntimeSubformLike = {
|
|
17
|
+
key: string;
|
|
18
|
+
label: string;
|
|
19
|
+
viewId: string;
|
|
20
|
+
parentField: string;
|
|
21
|
+
childField: string;
|
|
22
|
+
buttonLabel?: string;
|
|
23
|
+
};
|
|
24
|
+
type RuntimeSubformViewLike = {
|
|
25
|
+
id: string;
|
|
26
|
+
title: string;
|
|
27
|
+
form?: {
|
|
28
|
+
id: string;
|
|
29
|
+
schema: BuilderRuntimeFormSchemaLike;
|
|
30
|
+
} | null;
|
|
31
|
+
list?: {
|
|
32
|
+
source?: RuntimeDatasourceLike;
|
|
33
|
+
schema: {
|
|
34
|
+
columns: readonly {
|
|
35
|
+
key: string;
|
|
36
|
+
label: string;
|
|
37
|
+
sortable: boolean;
|
|
38
|
+
align: "left" | "right";
|
|
39
|
+
}[];
|
|
40
|
+
};
|
|
41
|
+
} | null;
|
|
42
|
+
};
|
|
43
|
+
type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {
|
|
44
|
+
viewId: string;
|
|
45
|
+
createdAt: string;
|
|
46
|
+
updatedAt: string;
|
|
47
|
+
};
|
|
48
|
+
type RuntimeSubformContracts = BuilderApiContracts & {
|
|
49
|
+
BuilderView: RuntimeSubformViewLike;
|
|
50
|
+
BuilderViewEntry: RuntimeSubformEntryLike;
|
|
51
|
+
ListBuilderViewEntriesResponse: {
|
|
52
|
+
items: RuntimeSubformEntryLike[];
|
|
53
|
+
total: number;
|
|
54
|
+
};
|
|
55
|
+
UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;
|
|
56
|
+
};
|
|
57
|
+
type ParentEntryLike = {
|
|
58
|
+
id: string;
|
|
59
|
+
values: Record<string, unknown>;
|
|
60
|
+
};
|
|
61
|
+
type RuntimeSubformFieldProps<TSubform, TEntry> = {
|
|
62
|
+
subform: TSubform;
|
|
63
|
+
parentEntry?: ParentEntryLike | null;
|
|
64
|
+
draftRows?: TEntry[];
|
|
65
|
+
onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;
|
|
66
|
+
};
|
|
67
|
+
type RuntimeSubformShellProps = {
|
|
68
|
+
label: string;
|
|
69
|
+
buttonLabel: string;
|
|
70
|
+
canOpen: boolean;
|
|
71
|
+
missingParentDescription?: ReactNode;
|
|
72
|
+
onAdd(): void;
|
|
73
|
+
children: ReactNode;
|
|
74
|
+
};
|
|
75
|
+
type RuntimeSubformDataPanelProps<TController, TEntry> = {
|
|
76
|
+
controller: TController;
|
|
77
|
+
isLoading: boolean;
|
|
78
|
+
showDraftDelete: boolean;
|
|
79
|
+
onRowClick(entry: TEntry): void;
|
|
80
|
+
onDeleteSelected(): void;
|
|
81
|
+
};
|
|
82
|
+
type RuntimeSubformDialogShellProps = {
|
|
83
|
+
open: boolean;
|
|
84
|
+
title: string;
|
|
85
|
+
description: string;
|
|
86
|
+
onClose(): void;
|
|
87
|
+
children: ReactNode;
|
|
88
|
+
};
|
|
89
|
+
type RuntimeSubformDialogFieldsProps<TSchema> = {
|
|
90
|
+
formId: string;
|
|
91
|
+
viewId: string;
|
|
92
|
+
schema: TSchema;
|
|
93
|
+
namePrefix: "values";
|
|
94
|
+
};
|
|
95
|
+
type RuntimeSubformDialogActionsProps = {
|
|
96
|
+
isSaving: boolean;
|
|
97
|
+
onClose(): void;
|
|
98
|
+
};
|
|
99
|
+
type RuntimeSubformNotifications = {
|
|
100
|
+
success(message: string): void;
|
|
101
|
+
error(message: string): void;
|
|
102
|
+
errorMessage(error: unknown, fallback: string): string;
|
|
103
|
+
};
|
|
104
|
+
type RuntimeSubformFieldDependencies<C extends RuntimeSubformContracts, TColumn, TState extends {
|
|
105
|
+
query: C["ListBuilderViewEntriesQuery"];
|
|
106
|
+
}, TController extends {
|
|
107
|
+
selectedIds: string[];
|
|
108
|
+
clearSelection(): void;
|
|
109
|
+
}> = {
|
|
110
|
+
hooks: Pick<BuilderHooks<C>, "useBuilderViewEntries" | "useRuntimeBuilderView" | "useSaveBuilderViewEntry">;
|
|
111
|
+
buildColumns(view: C["BuilderView"]): TColumn[];
|
|
112
|
+
useDataTableState(args?: {
|
|
113
|
+
pageSize?: number;
|
|
114
|
+
}): TState;
|
|
115
|
+
useDataTable(args: {
|
|
116
|
+
columns: TColumn[];
|
|
117
|
+
data: C["BuilderViewEntry"][];
|
|
118
|
+
rowCount: number;
|
|
119
|
+
state: TState;
|
|
120
|
+
getRowId(row: C["BuilderViewEntry"]): string;
|
|
121
|
+
}): TController;
|
|
122
|
+
Shell: ComponentType<RuntimeSubformShellProps>;
|
|
123
|
+
DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C["BuilderViewEntry"]>>;
|
|
124
|
+
DialogShell: ComponentType<RuntimeSubformDialogShellProps>;
|
|
125
|
+
DialogFields: ComponentType<RuntimeSubformDialogFieldsProps<NonNullable<C["BuilderView"]["form"]>["schema"]>>;
|
|
126
|
+
DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;
|
|
127
|
+
dialogFormClassName?: string;
|
|
128
|
+
notifications: RuntimeSubformNotifications;
|
|
129
|
+
};
|
|
130
|
+
declare function createRuntimeSubformFieldComponent<C extends RuntimeSubformContracts, TSubform extends RuntimeSubformLike, TColumn, TState extends {
|
|
131
|
+
query: C["ListBuilderViewEntriesQuery"];
|
|
132
|
+
}, TController extends {
|
|
133
|
+
selectedIds: string[];
|
|
134
|
+
clearSelection(): void;
|
|
135
|
+
}>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>): ({ subform, parentEntry, draftRows, onDraftRowsChange, }: RuntimeSubformFieldProps<TSubform, C["BuilderViewEntry"]>) => react.JSX.Element;
|
|
136
|
+
|
|
137
|
+
export { type RuntimeSubformDataPanelProps, type RuntimeSubformDialogActionsProps, type RuntimeSubformDialogFieldsProps, type RuntimeSubformDialogShellProps, type RuntimeSubformFieldDependencies, type RuntimeSubformFieldProps, type RuntimeSubformLike, type RuntimeSubformShellProps, createRuntimeSubformFieldComponent };
|