@duke333/builder-ui 0.2.2 → 0.2.3

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.
@@ -96,6 +96,7 @@ type RuntimeSubformDialogFieldsProps<TSchema> = {
96
96
  };
97
97
  type RuntimeSubformDialogActionsProps = {
98
98
  isSaving: boolean;
99
+ submitLabel: string;
99
100
  onClose(): void;
100
101
  };
101
102
  type RuntimeSubformNotifications = {
@@ -399,6 +399,7 @@ function RuntimeSubformEntryDialog({
399
399
  childField,
400
400
  parentValue: linkedParentValue,
401
401
  editing,
402
+ isDraft,
402
403
  isSaving,
403
404
  deps,
404
405
  onClose,
@@ -428,7 +429,9 @@ function RuntimeSubformEntryDialog({
428
429
  }
429
430
  });
430
431
  onClose();
431
- deps.notifications.success(editing ? "Section \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0433\u0434\u043B\u0430\u0430" : "Section \u043D\u044D\u043C\u044D\u0433\u0434\u043B\u044D\u044D");
432
+ if (!isDraft) {
433
+ deps.notifications.success(editing ? "Section \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0433\u0434\u043B\u0430\u0430" : "Section \u043D\u044D\u043C\u044D\u0433\u0434\u043B\u044D\u044D");
434
+ }
432
435
  } catch (error) {
433
436
  deps.notifications.error(
434
437
  deps.notifications.errorMessage(error, "Subform \u0445\u0430\u0434\u0433\u0430\u043B\u0430\u0445\u0430\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430")
@@ -462,7 +465,14 @@ function RuntimeSubformEntryDialog({
462
465
  namePrefix: "values"
463
466
  }
464
467
  ) : null,
465
- /* @__PURE__ */ jsx5(deps.DialogActions, { isSaving, onClose })
468
+ /* @__PURE__ */ jsx5(
469
+ deps.DialogActions,
470
+ {
471
+ isSaving,
472
+ submitLabel: editing ? "\u0428\u0438\u043D\u044D\u0447\u043B\u044D\u0445" : "\u041D\u044D\u043C\u044D\u0445",
473
+ onClose
474
+ }
475
+ )
466
476
  ]
467
477
  }
468
478
  ) })
@@ -570,6 +580,7 @@ function createRuntimeSubformFieldComponent(deps) {
570
580
  childField: subform.childField,
571
581
  parentValue: linkedValue,
572
582
  editing,
583
+ isDraft: isDraftMode,
573
584
  isSaving: canUseBackendRows ? save.isPending : false,
574
585
  deps,
575
586
  onClose: () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/DynamicForm.tsx","../../src/runtime/runtimeUtils.ts","../../src/components/DynamicList.tsx","../../src/components/DynamicView.tsx","../../src/components/RuntimeEntryDialog.tsx","../../src/components/RuntimeSubformField.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n createBuilderFormDefaultValues,\n} from \"../runtime\";\n\nexport type DynamicFormContracts = BuilderApiContracts & {\n BuilderForm: {\n id: string;\n title: string;\n schema: BuilderRuntimeFormSchemaLike;\n };\n CreateBuilderViewEntryInput: BuilderRuntimeFormValues;\n};\n\nexport type DynamicFormProps = {\n formId: string;\n};\n\nexport type DynamicFormShellProps = {\n title: string;\n children: ReactNode;\n};\n\nexport type DynamicFormFieldsProps<TSchema> = {\n formId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type DynamicFormSubmitProps = {\n isSaving: boolean;\n};\n\nexport type DynamicFormErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicFormNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type DynamicFormDependencies<C extends DynamicFormContracts> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderForm\" | \"useSaveRuntimeBuilderFormEntry\">;\n FormShell: ComponentType<DynamicFormShellProps>;\n FormFields: ComponentType<DynamicFormFieldsProps<C[\"BuilderForm\"][\"schema\"]>>;\n SubmitButton: ComponentType<DynamicFormSubmitProps>;\n ErrorState: ComponentType<DynamicFormErrorStateProps>;\n notifications: DynamicFormNotifications;\n};\n\nexport function createDynamicFormComponent<C extends DynamicFormContracts>(\n deps: DynamicFormDependencies<C>,\n) {\n return function DynamicForm({ formId }: DynamicFormProps) {\n const query = deps.hooks.useRuntimeBuilderForm(formId);\n const save = deps.hooks.useSaveRuntimeBuilderFormEntry(formId);\n const formValues = useMemo(\n () => (query.data ? createBuilderFormDefaultValues(query.data.schema) : undefined),\n [query.data],\n );\n const form = useForm<BuilderRuntimeFormValues>({\n defaultValues: createBuilderFormDefaultValues(query.data?.schema),\n values: formValues,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await save.mutateAsync(values as C[\"CreateBuilderViewEntryInput\"]);\n form.reset(createBuilderFormDefaultValues(query.data?.schema));\n deps.notifications.success(\"Form хадгалагдлаа\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"Form нээгдсэнгүй\"\n description={`«${formId}» id-тай form олдсонгүй.`}\n />\n );\n }\n\n if (!query.data) return null;\n\n return (\n <deps.FormShell title={query.data.title}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <deps.FormFields formId={formId} schema={query.data.schema} namePrefix=\"values\" />\n <deps.SubmitButton isSaving={save.isPending} />\n </form>\n </FormProvider>\n </deps.FormShell>\n );\n };\n}\n","export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n};\n\nexport type BuilderRuntimePresentation = \"dialog\" | \"drawer\";\n\nexport type BuilderRuntimeFormSchemaLike = {\n presentation?: BuilderRuntimePresentation;\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n","\"use client\";\n\nimport type { ComponentType } from \"react\";\nimport { useMemo } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\n\nexport type DynamicListContracts = BuilderApiContracts & {\n BuilderList: {\n id: string;\n title: string;\n description?: string | null;\n };\n BuilderViewEntry: {\n id: string;\n };\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicListProps = {\n listId: string;\n};\n\nexport type DynamicListDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n};\n\nexport type DynamicListErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicListDependencies<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderList\" | \"useRuntimeBuilderListEntries\">;\n buildColumns(list: C[\"BuilderList\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicListDataGridProps<TController>>;\n ErrorState: ComponentType<DynamicListErrorStateProps>;\n};\n\nexport function createDynamicListComponent<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicListDependencies<C, TColumn, TState, TController>) {\n return function DynamicList({ listId }: DynamicListProps) {\n const query = deps.hooks.useRuntimeBuilderList(listId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useRuntimeBuilderListEntries(listId, state.query);\n const columns = useMemo(() => (query.data ? deps.buildColumns(query.data) : []), [query.data]);\n const entries = entriesQuery.data?.items ?? [];\n const controller = deps.useDataTable({\n columns,\n data: entries as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"List нээгдсэнгүй\"\n description={`«${listId}» id-тай list олдсонгүй.`}\n />\n );\n }\n\n return (\n <deps.DataGrid\n title={query.data?.title ?? \"Dynamic List\"}\n description={query.data?.description ?? `/winu/list?id=${listId}`}\n controller={controller}\n isLoading={query.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ list-ийн datasource дээр мөр алга.\"\n />\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport type { BuilderRuntimeEntryLike } from \"../runtime\";\n\nexport type DynamicViewContracts = BuilderApiContracts & {\n BuilderView: {\n id: string;\n title: string;\n description?: string | null;\n form?: unknown | null;\n };\n BuilderViewEntry: BuilderRuntimeEntryLike;\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicViewProps = {\n viewId: string;\n};\n\nexport type DynamicViewInteractionEvent = {\n defaultPrevented?: boolean;\n target?: unknown;\n stopPropagation?(): void;\n};\n\nexport type DynamicViewColumnActions<TEntry> = {\n onEdit(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n onDelete(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n};\n\nexport type DynamicViewDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n onRowClick?: (row: unknown, event?: DynamicViewInteractionEvent) => void;\n toolbarExtra?: ReactNode;\n};\n\nexport type DynamicViewAddButtonProps = {\n disabled: boolean;\n onAdd(): void;\n};\n\nexport type DynamicViewEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose(): void;\n onSave(args: { id?: string; input: TInput }): Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type DynamicViewDeleteDialogProps<TEntry> = {\n entry: TEntry | null;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type DynamicViewErrorStateProps = {\n title: string;\n description: string;\n};\n\ntype ClosestTarget = {\n closest(selector: string): unknown;\n};\n\nconst interactiveRowTargetSelector =\n \"button,a,input,select,textarea,[role='button'],[role='menuitem'],[data-builder-row-action]\";\n\nfunction hasClosest(target: unknown): target is ClosestTarget {\n return (\n typeof target === \"object\" &&\n target !== null &&\n \"closest\" in target &&\n typeof target.closest === \"function\"\n );\n}\n\nexport function shouldHandleDynamicViewRowClick(event?: DynamicViewInteractionEvent) {\n if (!event) return true;\n if (event.defaultPrevented) return false;\n return !hasClosest(event.target) || !event.target.closest(interactiveRowTargetSelector);\n}\n\nexport type DynamicViewDependencies<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n | \"useBuilderViewEntries\"\n | \"useDeleteBuilderViewEntry\"\n | \"useRuntimeBuilderView\"\n | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(\n view: C[\"BuilderView\"],\n actions: DynamicViewColumnActions<C[\"BuilderViewEntry\"]>,\n ): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicViewDataGridProps<TController>>;\n AddButton: ComponentType<DynamicViewAddButtonProps>;\n EntryDialog: ComponentType<\n DynamicViewEntryDialogProps<\n C[\"BuilderView\"],\n C[\"BuilderViewEntry\"],\n C[\"UpdateBuilderViewEntryInput\"]\n >\n >;\n DeleteDialog: ComponentType<DynamicViewDeleteDialogProps<C[\"BuilderViewEntry\"]>>;\n ErrorState: ComponentType<DynamicViewErrorStateProps>;\n};\n\nexport function createDynamicViewComponent<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicViewDependencies<C, TColumn, TState, TController>) {\n return function DynamicView({ viewId }: DynamicViewProps) {\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<C[\"BuilderViewEntry\"] | null>(null);\n\n const viewQuery = deps.hooks.useRuntimeBuilderView(viewId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useBuilderViewEntries(viewId, state.query);\n const save = deps.hooks.useSaveBuilderViewEntry(viewId);\n const remove = deps.hooks.useDeleteBuilderViewEntry(viewId);\n const view = viewQuery.data;\n\n const columns = useMemo(\n () =>\n view\n ? deps.buildColumns(view, {\n onEdit: (entry, event) => {\n event?.stopPropagation?.();\n setEditing(entry);\n setDialogOpen(true);\n },\n onDelete: (entry, event) => {\n event?.stopPropagation?.();\n setPendingDelete(entry);\n },\n })\n : [],\n [view],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: (entriesQuery.data?.items ?? []) as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (viewQuery.isError) {\n return (\n <deps.ErrorState\n title=\"View нээгдсэнгүй\"\n description={`«${viewId}» id-тай view олдсонгүй.`}\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={view?.title ?? \"Dynamic View\"}\n description={view?.description ?? `/winu/view?id=${viewId}`}\n controller={controller}\n isLoading={viewQuery.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ view дээр эхний мөрөө нэмээрэй.\"\n onRowClick={(entry, event) => {\n if (!shouldHandleDynamicViewRowClick(event)) return;\n setEditing(entry as C[\"BuilderViewEntry\"]);\n setDialogOpen(true);\n }}\n toolbarExtra={\n <deps.AddButton\n disabled={!view?.form}\n onAdd={() => {\n setEditing(null);\n setDialogOpen(true);\n }}\n />\n }\n />\n\n {view ? (\n <deps.EntryDialog\n open={isDialogOpen}\n view={view}\n editing={editing}\n onClose={() => setDialogOpen(false)}\n onSave={save.mutateAsync}\n isSaving={save.isPending}\n />\n ) : null}\n\n <deps.DeleteDialog\n entry={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 { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\n\ntype BuilderRuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeEntryDialogSubformLike = {\n key: string;\n};\n\nexport type RuntimeEntryDialogViewLike = BuilderRuntimeViewLike & {\n id: string;\n title: string;\n list?: {\n source?: BuilderRuntimeDatasourceLike;\n } | null;\n form?: {\n id: string;\n source?: BuilderRuntimeDatasourceLike;\n schema: BuilderRuntimeFormSchemaLike & {\n subforms?: readonly RuntimeEntryDialogSubformLike[];\n };\n } | null;\n};\n\nexport type RuntimeEntryDialogSaveArgs<TInput> = {\n id?: string;\n input: TInput;\n};\n\nexport type RuntimeEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose: () => void;\n onSave: (args: RuntimeEntryDialogSaveArgs<TInput>) => Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type RuntimeEntryDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport type RuntimeEntryDialogExtraItem = {\n key: string;\n render: () => ReactNode;\n};\n\nexport type RuntimeEntryDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n entry?: BuilderRuntimeEntryLike | null;\n schema: TSchema;\n namePrefix: \"values\";\n extraItems?: RuntimeEntryDialogExtraItem[];\n};\n\nexport type RuntimeEntryDialogActionsProps = {\n isSaving: boolean;\n onClose: () => void;\n};\n\nexport type RuntimeEntryDialogNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeEntryDialogDraftRowsChange<TEntry> = {\n subformKey: string;\n dataKey: string;\n rows: TEntry[];\n};\n\nexport type RuntimeEntryDialogSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: TEntry | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\ntype RuntimeEntryDialogDraftSubform<TEntry> = {\n dataKey: string;\n rows: TEntry[];\n};\n\ntype RuntimeCompositeData = Record<\n string,\n Record<string, unknown> | Array<Record<string, unknown>>\n>;\n\ntype RuntimeCompositeCreateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeCompositeUpdateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type RuntimeEntryDialogDependencies<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike = BuilderRuntimeEntryLike,\n> = {\n DialogShell: ComponentType<RuntimeEntryDialogShellProps>;\n FormFields: ComponentType<RuntimeEntryDialogFieldsProps<NonNullable<TView[\"form\"]>[\"schema\"]>>;\n Actions: ComponentType<RuntimeEntryDialogActionsProps>;\n formClassName?: string;\n SubformField?: ComponentType<\n RuntimeEntryDialogSubformFieldProps<\n NonNullable<NonNullable<TView[\"form\"]>[\"schema\"][\"subforms\"]>[number],\n TEntry\n >\n >;\n useCreateCompositeEntry?(viewId: string): RuntimeMutation<RuntimeCompositeCreateInput>;\n useUpdateCompositeEntry?(\n viewId: string,\n ): RuntimeMutation<{ id: string; input: RuntimeCompositeUpdateInput }>;\n notifications: RuntimeEntryDialogNotifications;\n};\n\nfunction isDbTableSource(\n source: BuilderRuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction runtimeViewTableName(view: RuntimeEntryDialogViewLike) {\n const listSource = view.list?.source;\n if (isDbTableSource(listSource)) return listSource.tableName;\n const formSource = view.form?.source;\n return isDbTableSource(formSource) ? formSource.tableName : undefined;\n}\n\nfunction cleanRowValues(values: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key === \"_delete\" || !key.startsWith(\"_\")),\n );\n}\n\nfunction childRowPayload(row: BuilderRuntimeEntryLike, includeIdentity: boolean) {\n const values = cleanRowValues(row.values);\n if (!includeIdentity || row.values._draftNew === true) return values;\n return {\n id: row.id,\n version: row.version,\n ...values,\n };\n}\n\nexport function createRuntimeEntryDialogComponent<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike,\n TInput extends BuilderRuntimeEntryValues,\n>(deps: RuntimeEntryDialogDependencies<TView, TEntry>) {\n return function RuntimeEntryDialog({\n open,\n view,\n editing,\n onClose,\n onSave,\n isSaving,\n }: RuntimeEntryDialogProps<TView, TEntry, TInput>) {\n const [draftSubforms, setDraftSubforms] = useState<\n Record<string, RuntimeEntryDialogDraftSubform<TEntry>>\n >({});\n const compositeCreate = deps.useCreateCompositeEntry?.(view.id);\n const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues: createBuilderEntryDefaultValues(view, editing),\n values: open ? createBuilderEntryDefaultValues(view, editing) : undefined,\n });\n const mainTableName = runtimeViewTableName(view);\n const hasDraftRows = useMemo(\n () => Object.values(draftSubforms).some((draft) => draft.rows.length > 0),\n [draftSubforms],\n );\n\n useEffect(() => {\n if (open) setDraftSubforms({});\n }, [open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n if (!editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeCreate) throw new Error(\"Composite create handler тохируулагдаагүй байна\");\n await compositeCreate.mutateAsync({\n data: {\n [mainTableName]: values.values,\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows\n .filter((row) => row.values._delete !== true)\n .map((row) => childRowPayload(row, false)),\n ]),\n ),\n },\n });\n } else if (editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeUpdate) throw new Error(\"Composite update handler тохируулагдаагүй байна\");\n await compositeUpdate.mutateAsync({\n id: editing.id,\n input: {\n data: {\n [mainTableName]: {\n id: editing.id,\n version: values.version,\n ...values.values,\n },\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows.map((row) => childRowPayload(row, true)),\n ]),\n ),\n },\n },\n });\n } else {\n await onSave({ id: editing?.id, input: values as TInput });\n }\n onClose();\n deps.notifications.success(editing ? \"Мөр хадгалагдлаа\" : \"Мөр нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);\n const extraItems: RuntimeEntryDialogExtraItem[] | undefined =\n deps.SubformField && view.form?.schema.subforms?.length\n ? view.form.schema.subforms.map((subform) => ({\n key: subform.key,\n render: () =>\n deps.SubformField ? (\n <deps.SubformField\n subform={subform}\n parentEntry={editing}\n draftRows={draftSubforms[subform.key]?.rows ?? []}\n onDraftRowsChange={({ subformKey, dataKey, rows }) => {\n setDraftSubforms((current) => ({\n ...current,\n [subformKey]: { dataKey, rows: rows as TEntry[] },\n }));\n }}\n />\n ) : null,\n }))\n : undefined;\n\n return (\n <deps.DialogShell\n open={open}\n presentation={view.form?.schema.presentation ?? \"dialog\"}\n title={editing ? \"Мөр засах\" : \"Мөр нэмэх\"}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className={deps.formClassName}>\n {view.form ? (\n <deps.FormFields\n formId={view.form.id}\n viewId={view.id}\n entry={editing}\n schema={view.form.schema}\n namePrefix=\"values\"\n extraItems={extraItems}\n />\n ) : null}\n <deps.Actions isSaving={saving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\nimport type { RuntimeEntryDialogDraftRowsChange } from \"./RuntimeEntryDialog\";\n\ntype RuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeSubformLike = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n presentation?: BuilderRuntimePresentation;\n};\n\nexport type RuntimeSubformViewLike = {\n id: string;\n title: string;\n form?: {\n id: string;\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n list?: {\n source?: RuntimeDatasourceLike;\n schema: {\n columns: readonly {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n }[];\n };\n } | null;\n};\n\nexport type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {\n viewId: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype RuntimeSubformContracts = BuilderApiContracts & {\n BuilderView: RuntimeSubformViewLike;\n BuilderViewEntry: RuntimeSubformEntryLike;\n ListBuilderViewEntriesResponse: {\n items: RuntimeSubformEntryLike[];\n total: number;\n };\n UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;\n};\n\ntype ParentEntryLike = {\n id: string;\n values: Record<string, unknown>;\n};\n\nexport type RuntimeSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: ParentEntryLike | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\nexport type RuntimeSubformShellProps = {\n label: string;\n buttonLabel: string;\n canOpen: boolean;\n missingParentDescription?: ReactNode;\n onAdd(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDataPanelProps<TController, TEntry> = {\n controller: TController;\n isLoading: boolean;\n showDraftDelete: boolean;\n onRowClick(entry: TEntry): void;\n onDeleteSelected(): void;\n};\n\nexport type RuntimeSubformDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type RuntimeSubformDialogActionsProps = {\n isSaving: boolean;\n onClose(): void;\n};\n\nexport type RuntimeSubformNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeSubformFieldDependencies<\n C extends RuntimeSubformContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n \"useBuilderViewEntries\" | \"useRuntimeBuilderView\" | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(view: C[\"BuilderView\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n Shell: ComponentType<RuntimeSubformShellProps>;\n DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C[\"BuilderViewEntry\"]>>;\n DialogShell: ComponentType<RuntimeSubformDialogShellProps>;\n DialogFields: ComponentType<\n RuntimeSubformDialogFieldsProps<NonNullable<C[\"BuilderView\"][\"form\"]>[\"schema\"]>\n >;\n DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;\n dialogFormClassName?: string;\n notifications: RuntimeSubformNotifications;\n};\n\nfunction subformButtonLabel(subform: RuntimeSubformLike) {\n return subform.buttonLabel?.trim() || subform.label;\n}\n\nfunction parentValue(entry: ParentEntryLike | null | undefined, field: string) {\n if (!entry) return undefined;\n const value = field === \"id\" ? entry.id : entry.values[field];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\nfunction isDbTableSource(\n source: RuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction subformFallbackKey(view: RuntimeSubformViewLike) {\n return view.id;\n}\n\nfunction viewTableName(view: RuntimeSubformViewLike) {\n const source = view.list?.source;\n return isDbTableSource(source) ? source.tableName : subformFallbackKey(view);\n}\n\nfunction draftEntry<TEntry extends RuntimeSubformEntryLike>(\n values: BuilderRuntimeEntryValues,\n editing: TEntry | null,\n) {\n const now = new Date().toISOString();\n return {\n id: editing?.id ?? crypto.randomUUID(),\n viewId: editing?.viewId ?? \"\",\n values: editing ? values.values : { ...values.values, _draftNew: true },\n version: editing?.version ?? 0,\n createdAt: editing?.createdAt ?? now,\n updatedAt: now,\n } satisfies RuntimeSubformEntryLike;\n}\n\ntype RuntimeSubformEntryDialogProps<C extends RuntimeSubformContracts> = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n view: C[\"BuilderView\"];\n childField: string;\n parentValue?: string;\n editing: C[\"BuilderViewEntry\"] | null;\n isSaving: boolean;\n deps: Pick<\n RuntimeSubformFieldDependencies<\n C,\n unknown,\n { query: C[\"ListBuilderViewEntriesQuery\"] },\n { selectedIds: string[]; clearSelection(): void }\n >,\n \"DialogActions\" | \"DialogFields\" | \"DialogShell\" | \"dialogFormClassName\" | \"notifications\"\n >;\n onClose(): void;\n onSave(args: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }): Promise<unknown>;\n};\n\nfunction RuntimeSubformEntryDialog<C extends RuntimeSubformContracts>({\n open,\n presentation,\n title,\n view,\n childField,\n parentValue: linkedParentValue,\n editing,\n isSaving,\n deps,\n onClose,\n onSave,\n}: RuntimeSubformEntryDialogProps<C>) {\n const defaultValues = useMemo(() => {\n const values = createBuilderEntryDefaultValues(view, editing);\n if (linkedParentValue) {\n values.values[childField] = editing?.values[childField] ?? linkedParentValue;\n }\n return values;\n }, [childField, editing, linkedParentValue, view]);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues,\n values: open ? defaultValues : undefined,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({\n id: editing?.id,\n input: {\n ...values,\n values: {\n ...values.values,\n ...(linkedParentValue ? { [childField]: linkedParentValue } : {}),\n },\n } as C[\"UpdateBuilderViewEntryInput\"],\n });\n onClose();\n deps.notifications.success(editing ? \"Section хадгалагдлаа\" : \"Section нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(\n deps.notifications.errorMessage(error, \"Subform хадгалахад алдаа гарлаа\"),\n );\n }\n });\n\n return (\n <deps.DialogShell\n open={open}\n presentation={presentation}\n title={title}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form\n className={deps.dialogFormClassName}\n onSubmit={(event) => {\n event.stopPropagation();\n void onSubmit(event);\n }}\n noValidate\n >\n {view.form ? (\n <deps.DialogFields\n formId={view.form.id}\n viewId={view.id}\n schema={view.form.schema}\n namePrefix=\"values\"\n />\n ) : null}\n <deps.DialogActions isSaving={isSaving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n}\n\nexport function createRuntimeSubformFieldComponent<\n C extends RuntimeSubformContracts,\n TSubform extends RuntimeSubformLike,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>) {\n return function RuntimeSubformField({\n subform,\n parentEntry,\n draftRows = [],\n onDraftRowsChange,\n }: RuntimeSubformFieldProps<TSubform, C[\"BuilderViewEntry\"]>) {\n const [isEntryDialogOpen, setEntryDialogOpen] = useState(false);\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const initializedDraft = useRef(false);\n const linkedValue = parentValue(parentEntry, subform.parentField);\n const isDraftMode = Boolean(onDraftRowsChange);\n const canFetchBackendRows = Boolean(linkedValue);\n const canUseBackendRows = canFetchBackendRows && !isDraftMode;\n const isReady = Boolean(\n subform.viewId && subform.childField && (linkedValue || onDraftRowsChange),\n );\n const tableState = deps.useDataTableState({ pageSize: 5 });\n const query = useMemo<C[\"ListBuilderViewEntriesQuery\"]>(\n () =>\n ({\n ...tableState.query,\n filterField: subform.childField,\n filterValue: linkedValue ?? \"\",\n }) as C[\"ListBuilderViewEntriesQuery\"],\n [linkedValue, subform.childField, tableState.query],\n );\n const viewQuery = deps.hooks.useRuntimeBuilderView(subform.viewId, Boolean(subform.viewId));\n const entriesQuery = deps.hooks.useBuilderViewEntries(\n subform.viewId,\n query,\n isReady && (canUseBackendRows || (isDraftMode && canFetchBackendRows)),\n );\n const save = deps.hooks.useSaveBuilderViewEntry(subform.viewId);\n const view = viewQuery.data as C[\"BuilderView\"] | undefined;\n const columns = useMemo(() => (view ? deps.buildColumns(view) : []), [view]);\n const rows = (canUseBackendRows ? (entriesQuery.data?.items ?? []) : draftRows).filter(\n (row) => row.values._delete !== true,\n );\n const table = deps.useDataTable({\n columns,\n data: rows,\n rowCount: canUseBackendRows ? (entriesQuery.data?.total ?? 0) : rows.length,\n state: tableState,\n getRowId: (row) => row.id,\n });\n const canOpen = isReady && Boolean(view?.form) && !viewQuery.isPending;\n const selectedIds = new Set(table.selectedIds);\n\n useEffect(() => {\n if (!isDraftMode || !view || initializedDraft.current || !entriesQuery.data) return;\n initializedDraft.current = true;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: entriesQuery.data.items,\n });\n }, [entriesQuery.data, isDraftMode, onDraftRowsChange, subform.key, view]);\n\n return (\n <deps.Shell\n label={subform.label}\n buttonLabel={subformButtonLabel(subform)}\n canOpen={canOpen}\n missingParentDescription={\n !linkedValue && !onDraftRowsChange\n ? `Эхлээд parent мөрийг хадгална, эсвэл ${subform.parentField} талбарын утгыг бөглөнө.`\n : undefined\n }\n onAdd={() => {\n setEditing(null);\n setEntryDialogOpen(true);\n }}\n >\n {view?.list && (linkedValue || draftRows.length > 0) ? (\n <deps.DataPanel\n controller={table}\n isLoading={viewQuery.isPending || (canUseBackendRows && entriesQuery.isPending)}\n showDraftDelete={isDraftMode && table.selectedIds.length > 0}\n onRowClick={(entry) => {\n setEditing(entry);\n setEntryDialogOpen(true);\n }}\n onDeleteSelected={() => {\n if (!view) return;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: draftRows\n .filter((row) => !(selectedIds.has(row.id) && row.values._draftNew === true))\n .map((row) =>\n selectedIds.has(row.id)\n ? { ...row, values: { ...row.values, _delete: true } }\n : row,\n ),\n });\n table.clearSelection();\n }}\n />\n ) : null}\n\n {view ? (\n <RuntimeSubformEntryDialog<C>\n open={isEntryDialogOpen}\n presentation={subform.presentation ?? \"dialog\"}\n title={subform.label}\n view={view}\n childField={subform.childField}\n parentValue={linkedValue}\n editing={editing}\n isSaving={canUseBackendRows ? save.isPending : false}\n deps={deps}\n onClose={() => {\n setEntryDialogOpen(false);\n setEditing(null);\n }}\n onSave={async (args) => {\n if (!isDraftMode && canUseBackendRows) {\n await save.mutateAsync(args);\n await entriesQuery.refetch();\n return;\n }\n if (!onDraftRowsChange) return;\n const nextEntry = {\n ...draftEntry(args.input, editing),\n viewId: view.id,\n } as C[\"BuilderViewEntry\"];\n onDraftRowsChange({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: editing\n ? draftRows.map((row) => (row.id === editing.id ? nextEntry : row))\n : [...draftRows, nextEntry],\n });\n }}\n />\n ) : null}\n </deps.Shell>\n );\n };\n}\n"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","FormProvider","useForm","jsx","jsxs","useState","useForm","useMemo","FormProvider","useEffect","useMemo","useState","FormProvider","useForm","jsx","jsxs","isDbTableSource","useMemo","useForm","FormProvider","useState","useEffect"]}
1
+ {"version":3,"sources":["../../src/components/DynamicForm.tsx","../../src/runtime/runtimeUtils.ts","../../src/components/DynamicList.tsx","../../src/components/DynamicView.tsx","../../src/components/RuntimeEntryDialog.tsx","../../src/components/RuntimeSubformField.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n createBuilderFormDefaultValues,\n} from \"../runtime\";\n\nexport type DynamicFormContracts = BuilderApiContracts & {\n BuilderForm: {\n id: string;\n title: string;\n schema: BuilderRuntimeFormSchemaLike;\n };\n CreateBuilderViewEntryInput: BuilderRuntimeFormValues;\n};\n\nexport type DynamicFormProps = {\n formId: string;\n};\n\nexport type DynamicFormShellProps = {\n title: string;\n children: ReactNode;\n};\n\nexport type DynamicFormFieldsProps<TSchema> = {\n formId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type DynamicFormSubmitProps = {\n isSaving: boolean;\n};\n\nexport type DynamicFormErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicFormNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type DynamicFormDependencies<C extends DynamicFormContracts> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderForm\" | \"useSaveRuntimeBuilderFormEntry\">;\n FormShell: ComponentType<DynamicFormShellProps>;\n FormFields: ComponentType<DynamicFormFieldsProps<C[\"BuilderForm\"][\"schema\"]>>;\n SubmitButton: ComponentType<DynamicFormSubmitProps>;\n ErrorState: ComponentType<DynamicFormErrorStateProps>;\n notifications: DynamicFormNotifications;\n};\n\nexport function createDynamicFormComponent<C extends DynamicFormContracts>(\n deps: DynamicFormDependencies<C>,\n) {\n return function DynamicForm({ formId }: DynamicFormProps) {\n const query = deps.hooks.useRuntimeBuilderForm(formId);\n const save = deps.hooks.useSaveRuntimeBuilderFormEntry(formId);\n const formValues = useMemo(\n () => (query.data ? createBuilderFormDefaultValues(query.data.schema) : undefined),\n [query.data],\n );\n const form = useForm<BuilderRuntimeFormValues>({\n defaultValues: createBuilderFormDefaultValues(query.data?.schema),\n values: formValues,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await save.mutateAsync(values as C[\"CreateBuilderViewEntryInput\"]);\n form.reset(createBuilderFormDefaultValues(query.data?.schema));\n deps.notifications.success(\"Form хадгалагдлаа\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"Form нээгдсэнгүй\"\n description={`«${formId}» id-тай form олдсонгүй.`}\n />\n );\n }\n\n if (!query.data) return null;\n\n return (\n <deps.FormShell title={query.data.title}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <deps.FormFields formId={formId} schema={query.data.schema} namePrefix=\"values\" />\n <deps.SubmitButton isSaving={save.isPending} />\n </form>\n </FormProvider>\n </deps.FormShell>\n );\n };\n}\n","export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n};\n\nexport type BuilderRuntimePresentation = \"dialog\" | \"drawer\";\n\nexport type BuilderRuntimeFormSchemaLike = {\n presentation?: BuilderRuntimePresentation;\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n","\"use client\";\n\nimport type { ComponentType } from \"react\";\nimport { useMemo } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\n\nexport type DynamicListContracts = BuilderApiContracts & {\n BuilderList: {\n id: string;\n title: string;\n description?: string | null;\n };\n BuilderViewEntry: {\n id: string;\n };\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicListProps = {\n listId: string;\n};\n\nexport type DynamicListDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n};\n\nexport type DynamicListErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicListDependencies<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderList\" | \"useRuntimeBuilderListEntries\">;\n buildColumns(list: C[\"BuilderList\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicListDataGridProps<TController>>;\n ErrorState: ComponentType<DynamicListErrorStateProps>;\n};\n\nexport function createDynamicListComponent<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicListDependencies<C, TColumn, TState, TController>) {\n return function DynamicList({ listId }: DynamicListProps) {\n const query = deps.hooks.useRuntimeBuilderList(listId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useRuntimeBuilderListEntries(listId, state.query);\n const columns = useMemo(() => (query.data ? deps.buildColumns(query.data) : []), [query.data]);\n const entries = entriesQuery.data?.items ?? [];\n const controller = deps.useDataTable({\n columns,\n data: entries as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"List нээгдсэнгүй\"\n description={`«${listId}» id-тай list олдсонгүй.`}\n />\n );\n }\n\n return (\n <deps.DataGrid\n title={query.data?.title ?? \"Dynamic List\"}\n description={query.data?.description ?? `/winu/list?id=${listId}`}\n controller={controller}\n isLoading={query.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ list-ийн datasource дээр мөр алга.\"\n />\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport type { BuilderRuntimeEntryLike } from \"../runtime\";\n\nexport type DynamicViewContracts = BuilderApiContracts & {\n BuilderView: {\n id: string;\n title: string;\n description?: string | null;\n form?: unknown | null;\n };\n BuilderViewEntry: BuilderRuntimeEntryLike;\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicViewProps = {\n viewId: string;\n};\n\nexport type DynamicViewInteractionEvent = {\n defaultPrevented?: boolean;\n target?: unknown;\n stopPropagation?(): void;\n};\n\nexport type DynamicViewColumnActions<TEntry> = {\n onEdit(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n onDelete(entry: TEntry, event?: DynamicViewInteractionEvent): void;\n};\n\nexport type DynamicViewDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n onRowClick?: (row: unknown, event?: DynamicViewInteractionEvent) => void;\n toolbarExtra?: ReactNode;\n};\n\nexport type DynamicViewAddButtonProps = {\n disabled: boolean;\n onAdd(): void;\n};\n\nexport type DynamicViewEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose(): void;\n onSave(args: { id?: string; input: TInput }): Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type DynamicViewDeleteDialogProps<TEntry> = {\n entry: TEntry | null;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type DynamicViewErrorStateProps = {\n title: string;\n description: string;\n};\n\ntype ClosestTarget = {\n closest(selector: string): unknown;\n};\n\nconst interactiveRowTargetSelector =\n \"button,a,input,select,textarea,[role='button'],[role='menuitem'],[data-builder-row-action]\";\n\nfunction hasClosest(target: unknown): target is ClosestTarget {\n return (\n typeof target === \"object\" &&\n target !== null &&\n \"closest\" in target &&\n typeof target.closest === \"function\"\n );\n}\n\nexport function shouldHandleDynamicViewRowClick(event?: DynamicViewInteractionEvent) {\n if (!event) return true;\n if (event.defaultPrevented) return false;\n return !hasClosest(event.target) || !event.target.closest(interactiveRowTargetSelector);\n}\n\nexport type DynamicViewDependencies<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n | \"useBuilderViewEntries\"\n | \"useDeleteBuilderViewEntry\"\n | \"useRuntimeBuilderView\"\n | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(\n view: C[\"BuilderView\"],\n actions: DynamicViewColumnActions<C[\"BuilderViewEntry\"]>,\n ): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicViewDataGridProps<TController>>;\n AddButton: ComponentType<DynamicViewAddButtonProps>;\n EntryDialog: ComponentType<\n DynamicViewEntryDialogProps<\n C[\"BuilderView\"],\n C[\"BuilderViewEntry\"],\n C[\"UpdateBuilderViewEntryInput\"]\n >\n >;\n DeleteDialog: ComponentType<DynamicViewDeleteDialogProps<C[\"BuilderViewEntry\"]>>;\n ErrorState: ComponentType<DynamicViewErrorStateProps>;\n};\n\nexport function createDynamicViewComponent<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicViewDependencies<C, TColumn, TState, TController>) {\n return function DynamicView({ viewId }: DynamicViewProps) {\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<C[\"BuilderViewEntry\"] | null>(null);\n\n const viewQuery = deps.hooks.useRuntimeBuilderView(viewId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useBuilderViewEntries(viewId, state.query);\n const save = deps.hooks.useSaveBuilderViewEntry(viewId);\n const remove = deps.hooks.useDeleteBuilderViewEntry(viewId);\n const view = viewQuery.data;\n\n const columns = useMemo(\n () =>\n view\n ? deps.buildColumns(view, {\n onEdit: (entry, event) => {\n event?.stopPropagation?.();\n setEditing(entry);\n setDialogOpen(true);\n },\n onDelete: (entry, event) => {\n event?.stopPropagation?.();\n setPendingDelete(entry);\n },\n })\n : [],\n [view],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: (entriesQuery.data?.items ?? []) as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (viewQuery.isError) {\n return (\n <deps.ErrorState\n title=\"View нээгдсэнгүй\"\n description={`«${viewId}» id-тай view олдсонгүй.`}\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={view?.title ?? \"Dynamic View\"}\n description={view?.description ?? `/winu/view?id=${viewId}`}\n controller={controller}\n isLoading={viewQuery.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ view дээр эхний мөрөө нэмээрэй.\"\n onRowClick={(entry, event) => {\n if (!shouldHandleDynamicViewRowClick(event)) return;\n setEditing(entry as C[\"BuilderViewEntry\"]);\n setDialogOpen(true);\n }}\n toolbarExtra={\n <deps.AddButton\n disabled={!view?.form}\n onAdd={() => {\n setEditing(null);\n setDialogOpen(true);\n }}\n />\n }\n />\n\n {view ? (\n <deps.EntryDialog\n open={isDialogOpen}\n view={view}\n editing={editing}\n onClose={() => setDialogOpen(false)}\n onSave={save.mutateAsync}\n isSaving={save.isPending}\n />\n ) : null}\n\n <deps.DeleteDialog\n entry={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 { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\n\ntype BuilderRuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeEntryDialogSubformLike = {\n key: string;\n};\n\nexport type RuntimeEntryDialogViewLike = BuilderRuntimeViewLike & {\n id: string;\n title: string;\n list?: {\n source?: BuilderRuntimeDatasourceLike;\n } | null;\n form?: {\n id: string;\n source?: BuilderRuntimeDatasourceLike;\n schema: BuilderRuntimeFormSchemaLike & {\n subforms?: readonly RuntimeEntryDialogSubformLike[];\n };\n } | null;\n};\n\nexport type RuntimeEntryDialogSaveArgs<TInput> = {\n id?: string;\n input: TInput;\n};\n\nexport type RuntimeEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose: () => void;\n onSave: (args: RuntimeEntryDialogSaveArgs<TInput>) => Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type RuntimeEntryDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport type RuntimeEntryDialogExtraItem = {\n key: string;\n render: () => ReactNode;\n};\n\nexport type RuntimeEntryDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n entry?: BuilderRuntimeEntryLike | null;\n schema: TSchema;\n namePrefix: \"values\";\n extraItems?: RuntimeEntryDialogExtraItem[];\n};\n\nexport type RuntimeEntryDialogActionsProps = {\n isSaving: boolean;\n onClose: () => void;\n};\n\nexport type RuntimeEntryDialogNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeEntryDialogDraftRowsChange<TEntry> = {\n subformKey: string;\n dataKey: string;\n rows: TEntry[];\n};\n\nexport type RuntimeEntryDialogSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: TEntry | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\ntype RuntimeEntryDialogDraftSubform<TEntry> = {\n dataKey: string;\n rows: TEntry[];\n};\n\ntype RuntimeCompositeData = Record<\n string,\n Record<string, unknown> | Array<Record<string, unknown>>\n>;\n\ntype RuntimeCompositeCreateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeCompositeUpdateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type RuntimeEntryDialogDependencies<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike = BuilderRuntimeEntryLike,\n> = {\n DialogShell: ComponentType<RuntimeEntryDialogShellProps>;\n FormFields: ComponentType<RuntimeEntryDialogFieldsProps<NonNullable<TView[\"form\"]>[\"schema\"]>>;\n Actions: ComponentType<RuntimeEntryDialogActionsProps>;\n formClassName?: string;\n SubformField?: ComponentType<\n RuntimeEntryDialogSubformFieldProps<\n NonNullable<NonNullable<TView[\"form\"]>[\"schema\"][\"subforms\"]>[number],\n TEntry\n >\n >;\n useCreateCompositeEntry?(viewId: string): RuntimeMutation<RuntimeCompositeCreateInput>;\n useUpdateCompositeEntry?(\n viewId: string,\n ): RuntimeMutation<{ id: string; input: RuntimeCompositeUpdateInput }>;\n notifications: RuntimeEntryDialogNotifications;\n};\n\nfunction isDbTableSource(\n source: BuilderRuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction runtimeViewTableName(view: RuntimeEntryDialogViewLike) {\n const listSource = view.list?.source;\n if (isDbTableSource(listSource)) return listSource.tableName;\n const formSource = view.form?.source;\n return isDbTableSource(formSource) ? formSource.tableName : undefined;\n}\n\nfunction cleanRowValues(values: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key === \"_delete\" || !key.startsWith(\"_\")),\n );\n}\n\nfunction childRowPayload(row: BuilderRuntimeEntryLike, includeIdentity: boolean) {\n const values = cleanRowValues(row.values);\n if (!includeIdentity || row.values._draftNew === true) return values;\n return {\n id: row.id,\n version: row.version,\n ...values,\n };\n}\n\nexport function createRuntimeEntryDialogComponent<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike,\n TInput extends BuilderRuntimeEntryValues,\n>(deps: RuntimeEntryDialogDependencies<TView, TEntry>) {\n return function RuntimeEntryDialog({\n open,\n view,\n editing,\n onClose,\n onSave,\n isSaving,\n }: RuntimeEntryDialogProps<TView, TEntry, TInput>) {\n const [draftSubforms, setDraftSubforms] = useState<\n Record<string, RuntimeEntryDialogDraftSubform<TEntry>>\n >({});\n const compositeCreate = deps.useCreateCompositeEntry?.(view.id);\n const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues: createBuilderEntryDefaultValues(view, editing),\n values: open ? createBuilderEntryDefaultValues(view, editing) : undefined,\n });\n const mainTableName = runtimeViewTableName(view);\n const hasDraftRows = useMemo(\n () => Object.values(draftSubforms).some((draft) => draft.rows.length > 0),\n [draftSubforms],\n );\n\n useEffect(() => {\n if (open) setDraftSubforms({});\n }, [open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n if (!editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeCreate) throw new Error(\"Composite create handler тохируулагдаагүй байна\");\n await compositeCreate.mutateAsync({\n data: {\n [mainTableName]: values.values,\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows\n .filter((row) => row.values._delete !== true)\n .map((row) => childRowPayload(row, false)),\n ]),\n ),\n },\n });\n } else if (editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeUpdate) throw new Error(\"Composite update handler тохируулагдаагүй байна\");\n await compositeUpdate.mutateAsync({\n id: editing.id,\n input: {\n data: {\n [mainTableName]: {\n id: editing.id,\n version: values.version,\n ...values.values,\n },\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows.map((row) => childRowPayload(row, true)),\n ]),\n ),\n },\n },\n });\n } else {\n await onSave({ id: editing?.id, input: values as TInput });\n }\n onClose();\n deps.notifications.success(editing ? \"Мөр хадгалагдлаа\" : \"Мөр нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);\n const extraItems: RuntimeEntryDialogExtraItem[] | undefined =\n deps.SubformField && view.form?.schema.subforms?.length\n ? view.form.schema.subforms.map((subform) => ({\n key: subform.key,\n render: () =>\n deps.SubformField ? (\n <deps.SubformField\n subform={subform}\n parentEntry={editing}\n draftRows={draftSubforms[subform.key]?.rows ?? []}\n onDraftRowsChange={({ subformKey, dataKey, rows }) => {\n setDraftSubforms((current) => ({\n ...current,\n [subformKey]: { dataKey, rows: rows as TEntry[] },\n }));\n }}\n />\n ) : null,\n }))\n : undefined;\n\n return (\n <deps.DialogShell\n open={open}\n presentation={view.form?.schema.presentation ?? \"dialog\"}\n title={editing ? \"Мөр засах\" : \"Мөр нэмэх\"}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className={deps.formClassName}>\n {view.form ? (\n <deps.FormFields\n formId={view.form.id}\n viewId={view.id}\n entry={editing}\n schema={view.form.schema}\n namePrefix=\"values\"\n extraItems={extraItems}\n />\n ) : null}\n <deps.Actions isSaving={saving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimePresentation,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\nimport type { RuntimeEntryDialogDraftRowsChange } from \"./RuntimeEntryDialog\";\n\ntype RuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeSubformLike = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n presentation?: BuilderRuntimePresentation;\n};\n\nexport type RuntimeSubformViewLike = {\n id: string;\n title: string;\n form?: {\n id: string;\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n list?: {\n source?: RuntimeDatasourceLike;\n schema: {\n columns: readonly {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n }[];\n };\n } | null;\n};\n\nexport type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {\n viewId: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype RuntimeSubformContracts = BuilderApiContracts & {\n BuilderView: RuntimeSubformViewLike;\n BuilderViewEntry: RuntimeSubformEntryLike;\n ListBuilderViewEntriesResponse: {\n items: RuntimeSubformEntryLike[];\n total: number;\n };\n UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;\n};\n\ntype ParentEntryLike = {\n id: string;\n values: Record<string, unknown>;\n};\n\nexport type RuntimeSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: ParentEntryLike | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\nexport type RuntimeSubformShellProps = {\n label: string;\n buttonLabel: string;\n canOpen: boolean;\n missingParentDescription?: ReactNode;\n onAdd(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDataPanelProps<TController, TEntry> = {\n controller: TController;\n isLoading: boolean;\n showDraftDelete: boolean;\n onRowClick(entry: TEntry): void;\n onDeleteSelected(): void;\n};\n\nexport type RuntimeSubformDialogShellProps = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n description: string;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type RuntimeSubformDialogActionsProps = {\n isSaving: boolean;\n submitLabel: string;\n onClose(): void;\n};\n\nexport type RuntimeSubformNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeSubformFieldDependencies<\n C extends RuntimeSubformContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n \"useBuilderViewEntries\" | \"useRuntimeBuilderView\" | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(view: C[\"BuilderView\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n Shell: ComponentType<RuntimeSubformShellProps>;\n DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C[\"BuilderViewEntry\"]>>;\n DialogShell: ComponentType<RuntimeSubformDialogShellProps>;\n DialogFields: ComponentType<\n RuntimeSubformDialogFieldsProps<NonNullable<C[\"BuilderView\"][\"form\"]>[\"schema\"]>\n >;\n DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;\n dialogFormClassName?: string;\n notifications: RuntimeSubformNotifications;\n};\n\nfunction subformButtonLabel(subform: RuntimeSubformLike) {\n return subform.buttonLabel?.trim() || subform.label;\n}\n\nfunction parentValue(entry: ParentEntryLike | null | undefined, field: string) {\n if (!entry) return undefined;\n const value = field === \"id\" ? entry.id : entry.values[field];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\nfunction isDbTableSource(\n source: RuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction subformFallbackKey(view: RuntimeSubformViewLike) {\n return view.id;\n}\n\nfunction viewTableName(view: RuntimeSubformViewLike) {\n const source = view.list?.source;\n return isDbTableSource(source) ? source.tableName : subformFallbackKey(view);\n}\n\nfunction draftEntry<TEntry extends RuntimeSubformEntryLike>(\n values: BuilderRuntimeEntryValues,\n editing: TEntry | null,\n) {\n const now = new Date().toISOString();\n return {\n id: editing?.id ?? crypto.randomUUID(),\n viewId: editing?.viewId ?? \"\",\n values: editing ? values.values : { ...values.values, _draftNew: true },\n version: editing?.version ?? 0,\n createdAt: editing?.createdAt ?? now,\n updatedAt: now,\n } satisfies RuntimeSubformEntryLike;\n}\n\ntype RuntimeSubformEntryDialogProps<C extends RuntimeSubformContracts> = {\n open: boolean;\n presentation: BuilderRuntimePresentation;\n title: string;\n view: C[\"BuilderView\"];\n childField: string;\n parentValue?: string;\n editing: C[\"BuilderViewEntry\"] | null;\n isDraft: boolean;\n isSaving: boolean;\n deps: Pick<\n RuntimeSubformFieldDependencies<\n C,\n unknown,\n { query: C[\"ListBuilderViewEntriesQuery\"] },\n { selectedIds: string[]; clearSelection(): void }\n >,\n \"DialogActions\" | \"DialogFields\" | \"DialogShell\" | \"dialogFormClassName\" | \"notifications\"\n >;\n onClose(): void;\n onSave(args: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }): Promise<unknown>;\n};\n\nfunction RuntimeSubformEntryDialog<C extends RuntimeSubformContracts>({\n open,\n presentation,\n title,\n view,\n childField,\n parentValue: linkedParentValue,\n editing,\n isDraft,\n isSaving,\n deps,\n onClose,\n onSave,\n}: RuntimeSubformEntryDialogProps<C>) {\n const defaultValues = useMemo(() => {\n const values = createBuilderEntryDefaultValues(view, editing);\n if (linkedParentValue) {\n values.values[childField] = editing?.values[childField] ?? linkedParentValue;\n }\n return values;\n }, [childField, editing, linkedParentValue, view]);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues,\n values: open ? defaultValues : undefined,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({\n id: editing?.id,\n input: {\n ...values,\n values: {\n ...values.values,\n ...(linkedParentValue ? { [childField]: linkedParentValue } : {}),\n },\n } as C[\"UpdateBuilderViewEntryInput\"],\n });\n onClose();\n if (!isDraft) {\n deps.notifications.success(editing ? \"Section хадгалагдлаа\" : \"Section нэмэгдлээ\");\n }\n } catch (error) {\n deps.notifications.error(\n deps.notifications.errorMessage(error, \"Subform хадгалахад алдаа гарлаа\"),\n );\n }\n });\n\n return (\n <deps.DialogShell\n open={open}\n presentation={presentation}\n title={title}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form\n className={deps.dialogFormClassName}\n onSubmit={(event) => {\n event.stopPropagation();\n void onSubmit(event);\n }}\n noValidate\n >\n {view.form ? (\n <deps.DialogFields\n formId={view.form.id}\n viewId={view.id}\n schema={view.form.schema}\n namePrefix=\"values\"\n />\n ) : null}\n <deps.DialogActions\n isSaving={isSaving}\n submitLabel={editing ? \"Шинэчлэх\" : \"Нэмэх\"}\n onClose={onClose}\n />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n}\n\nexport function createRuntimeSubformFieldComponent<\n C extends RuntimeSubformContracts,\n TSubform extends RuntimeSubformLike,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>) {\n return function RuntimeSubformField({\n subform,\n parentEntry,\n draftRows = [],\n onDraftRowsChange,\n }: RuntimeSubformFieldProps<TSubform, C[\"BuilderViewEntry\"]>) {\n const [isEntryDialogOpen, setEntryDialogOpen] = useState(false);\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const initializedDraft = useRef(false);\n const linkedValue = parentValue(parentEntry, subform.parentField);\n const isDraftMode = Boolean(onDraftRowsChange);\n const canFetchBackendRows = Boolean(linkedValue);\n const canUseBackendRows = canFetchBackendRows && !isDraftMode;\n const isReady = Boolean(\n subform.viewId && subform.childField && (linkedValue || onDraftRowsChange),\n );\n const tableState = deps.useDataTableState({ pageSize: 5 });\n const query = useMemo<C[\"ListBuilderViewEntriesQuery\"]>(\n () =>\n ({\n ...tableState.query,\n filterField: subform.childField,\n filterValue: linkedValue ?? \"\",\n }) as C[\"ListBuilderViewEntriesQuery\"],\n [linkedValue, subform.childField, tableState.query],\n );\n const viewQuery = deps.hooks.useRuntimeBuilderView(subform.viewId, Boolean(subform.viewId));\n const entriesQuery = deps.hooks.useBuilderViewEntries(\n subform.viewId,\n query,\n isReady && (canUseBackendRows || (isDraftMode && canFetchBackendRows)),\n );\n const save = deps.hooks.useSaveBuilderViewEntry(subform.viewId);\n const view = viewQuery.data as C[\"BuilderView\"] | undefined;\n const columns = useMemo(() => (view ? deps.buildColumns(view) : []), [view]);\n const rows = (canUseBackendRows ? (entriesQuery.data?.items ?? []) : draftRows).filter(\n (row) => row.values._delete !== true,\n );\n const table = deps.useDataTable({\n columns,\n data: rows,\n rowCount: canUseBackendRows ? (entriesQuery.data?.total ?? 0) : rows.length,\n state: tableState,\n getRowId: (row) => row.id,\n });\n const canOpen = isReady && Boolean(view?.form) && !viewQuery.isPending;\n const selectedIds = new Set(table.selectedIds);\n\n useEffect(() => {\n if (!isDraftMode || !view || initializedDraft.current || !entriesQuery.data) return;\n initializedDraft.current = true;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: entriesQuery.data.items,\n });\n }, [entriesQuery.data, isDraftMode, onDraftRowsChange, subform.key, view]);\n\n return (\n <deps.Shell\n label={subform.label}\n buttonLabel={subformButtonLabel(subform)}\n canOpen={canOpen}\n missingParentDescription={\n !linkedValue && !onDraftRowsChange\n ? `Эхлээд parent мөрийг хадгална, эсвэл ${subform.parentField} талбарын утгыг бөглөнө.`\n : undefined\n }\n onAdd={() => {\n setEditing(null);\n setEntryDialogOpen(true);\n }}\n >\n {view?.list && (linkedValue || draftRows.length > 0) ? (\n <deps.DataPanel\n controller={table}\n isLoading={viewQuery.isPending || (canUseBackendRows && entriesQuery.isPending)}\n showDraftDelete={isDraftMode && table.selectedIds.length > 0}\n onRowClick={(entry) => {\n setEditing(entry);\n setEntryDialogOpen(true);\n }}\n onDeleteSelected={() => {\n if (!view) return;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: draftRows\n .filter((row) => !(selectedIds.has(row.id) && row.values._draftNew === true))\n .map((row) =>\n selectedIds.has(row.id)\n ? { ...row, values: { ...row.values, _delete: true } }\n : row,\n ),\n });\n table.clearSelection();\n }}\n />\n ) : null}\n\n {view ? (\n <RuntimeSubformEntryDialog<C>\n open={isEntryDialogOpen}\n presentation={subform.presentation ?? \"dialog\"}\n title={subform.label}\n view={view}\n childField={subform.childField}\n parentValue={linkedValue}\n editing={editing}\n isDraft={isDraftMode}\n isSaving={canUseBackendRows ? save.isPending : false}\n deps={deps}\n onClose={() => {\n setEntryDialogOpen(false);\n setEditing(null);\n }}\n onSave={async (args) => {\n if (!isDraftMode && canUseBackendRows) {\n await save.mutateAsync(args);\n await entriesQuery.refetch();\n return;\n }\n if (!onDraftRowsChange) return;\n const nextEntry = {\n ...draftEntry(args.input, editing),\n viewId: view.id,\n } as C[\"BuilderViewEntry\"];\n onDraftRowsChange({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: editing\n ? draftRows.map((row) => (row.id === editing.id ? nextEntry : row))\n : [...draftRows, nextEntry],\n });\n }}\n />\n ) : null}\n </deps.Shell>\n );\n };\n}\n"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx","jsxs","useMemo","useState","FormProvider","useForm","jsx","jsxs","useState","useForm","useMemo","FormProvider","useEffect","useMemo","useState","FormProvider","useForm","jsx","jsxs","isDbTableSource","useMemo","useForm","FormProvider","useState","useEffect"]}
package/dist/index.d.ts CHANGED
@@ -1,18 +1,33 @@
1
1
  import * as react from 'react';
2
- import { ReactNode } from 'react';
2
+ import { ComponentType, ReactNode } from 'react';
3
3
  import { QueryClient } from '@tanstack/react-query';
4
4
  import { BuilderApiContracts, BuilderApiClient, BuilderApiTransport, BuilderFieldOptionsQuery } from './api/index.js';
5
5
  export { BuilderApiClientOptions, BuilderApiQuery, BuilderApiQueryValue, createBuilderApiClient } from './api/index.js';
6
6
  import { BuilderHooks } from './hooks/index.js';
7
7
  export { createBuilderHooks, createBuilderKeys } from './hooks/index.js';
8
8
  import { BuilderDbTable, BuilderForm as BuilderForm$1, BuilderList, BuilderView as BuilderView$1, BuilderViewEntry, ListBuilderFormsQuery, ListBuilderFormsResponse, CreateBuilderFormInput, UpdateBuilderFormInput, ListBuilderListsQuery, ListBuilderListsResponse, CreateBuilderListInput, UpdateBuilderListInput, ListBuilderViewsQuery, ListBuilderViewsResponse, CreateBuilderViewInput, UpdateBuilderViewInput, ReplicateBuilderEntityInput, CreateBuilderViewEntryInput, CreateCompositeBuilderViewEntryInput, UpdateCompositeBuilderViewEntryInput, UpdateBuilderViewEntryInput, ListBuilderFieldOptionsQuery, ListBuilderFieldOptionsResponse, RunBuilderFieldTriggerInput, BuilderFieldTriggerEvent, BuilderFieldTriggerResponse, ListBuilderViewEntriesQuery, ListBuilderViewEntriesResponse } from '@duke333/builder-contracts';
9
- export { B as BUILDER_EDITOR_NONE_VALUE, a as BuilderAdminPageContracts, b as BuilderAdminPagesOptions, c as BuilderAdminPagesRoutes, d as BuilderDefaultEntity, e as BuilderDefaultEntityListResult, f as BuilderDefaultEntityManagerDependencies, g as BuilderDefaultEntityManagerLabels, h as BuilderDefaultEntityManagerState, i as BuilderDefaultEntityMutation, j as BuilderDefaultEntityQueryResult, k as BuilderDefaultFormEditorBodyOptions, l as BuilderDefaultListEditorBodyOptions, m as BuilderDefaultOption, n as BuilderEditorDbTable, o as BuilderEditorSelectOption, p as BuilderEditorTriggerValues, q as BuilderFormEditorBodyProps, r as BuilderFormEditorEntity, s as BuilderFormEditorFieldValues, t as BuilderFormEditorPageDependencies, u as BuilderFormEditorValues, v as BuilderListEditorBodyProps, w as BuilderListEditorColumnValues, x as BuilderListEditorEntity, y as BuilderListEditorPageDependencies, z as BuilderListEditorValues, A as BuilderViewEditorEntity, C as BuilderViewEditorValues, D as builderEditorOptionsToText, E as builderEditorSearchFieldsToText, F as builderEditorTextToOptions, G as builderEditorTextToSearchFields, H as builderFormEditorFieldsFromTable, I as builderFormEditorInputFromValues, J as builderFormEditorValuesFromEntity, K as builderListEditorColumnsFromTable, L as builderListEditorInputFromValues, M as builderListEditorValuesFromEntity, N as builderViewEditorInputFromValues, O as builderViewEditorValuesFromEntity, P as createBuilderAdminPages, Q as createBuilderDefaultEntityManagerComponent, R as createBuilderDefaultFormEditorBody, S as createBuilderDefaultListEditorBody, T as createBuilderFormEditorPageComponent, U as createBuilderListEditorPageComponent, V as getBuilderEditorTriggerRoute } from './BuilderAdminPages-C-jaMLOa.js';
9
+ export { B as BUILDER_EDITOR_NONE_VALUE, a as BuilderAdminPageContracts, b as BuilderAdminPagesOptions, c as BuilderAdminPagesRoutes, d as BuilderDefaultEntity, e as BuilderDefaultEntityListResult, f as BuilderDefaultEntityManagerDependencies, g as BuilderDefaultEntityManagerLabels, h as BuilderDefaultEntityManagerState, i as BuilderDefaultEntityMutation, j as BuilderDefaultEntityQueryResult, k as BuilderDefaultFormEditorBodyOptions, l as BuilderDefaultListEditorBodyOptions, m as BuilderDefaultOption, n as BuilderEditorDbTable, o as BuilderEditorSelectOption, p as BuilderEditorTriggerValues, q as BuilderFormEditorBodyProps, r as BuilderFormEditorEntity, s as BuilderFormEditorFieldValues, t as BuilderFormEditorPageDependencies, u as BuilderFormEditorValues, v as BuilderListEditorBodyProps, w as BuilderListEditorColumnValues, x as BuilderListEditorEntity, y as BuilderListEditorOrderByValues, z as BuilderListEditorPageDependencies, A as BuilderListEditorValues, C as BuilderViewEditorEntity, D as BuilderViewEditorValues, E as builderEditorOptionsToText, F as builderEditorSearchFieldsToText, G as builderEditorTextToOptions, H as builderEditorTextToSearchFields, I as builderFormEditorFieldsFromTable, J as builderFormEditorInputFromValues, K as builderFormEditorValuesFromEntity, L as builderListEditorColumnsFromTable, M as builderListEditorInputFromValues, N as builderListEditorValuesFromEntity, O as builderViewEditorInputFromValues, P as builderViewEditorValuesFromEntity, Q as createBuilderAdminPages, R as createBuilderDefaultEntityManagerComponent, S as createBuilderDefaultFormEditorBody, T as createBuilderDefaultListEditorBody, U as createBuilderFormEditorPageComponent, V as createBuilderListEditorPageComponent, W as getBuilderEditorTriggerRoute } from './BuilderAdminPages-DrOrFyIX.js';
10
10
  export { BuilderDefaultViewEditorContracts, BuilderDefaultViewEditorPageOptions, BuilderEntityDialogManagerDependencies, BuilderEntityManagerActions, BuilderEntityManagerAddButtonProps, BuilderEntityManagerDataGridProps, BuilderEntityManagerDeleteDialogProps, BuilderEntityManagerDependencies, BuilderEntityManagerDialogAddButtonProps, BuilderEntityManagerEditorDialogProps, BuilderEntityManagerEntity, BuilderEntityManagerHookResult, BuilderEntityManagerLabels, BuilderEntityManagerMutation, BuilderFormLayoutDragPayload, BuilderFormLayoutItem, BuilderViewDialogBodyProps, BuilderViewDialogDependencies, BuilderViewDialogProps, BuilderViewDialogShellProps, builderFormLayoutDragDataType, clampBuilderFormLayoutSpan, createBuilderDefaultViewEditorPage, createBuilderEntityDialogManagerComponent, createBuilderEntityManagerComponent, createBuilderViewDialogComponent, nextBuilderFormLayoutGroupId, parseBuilderFormLayoutDragPayload, serializeBuilderFormLayoutDragPayload, swapBuilderFormLayoutItems, useBuilderFormLayoutEditor } from './admin/index.js';
11
11
  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 DynamicViewInteractionEvent, v as DynamicViewProps, w as RuntimeEntryDialogActionsProps, x as RuntimeEntryDialogDependencies, y as RuntimeEntryDialogFieldsProps, z as RuntimeEntryDialogNotifications, A as RuntimeEntryDialogProps, B as RuntimeEntryDialogSaveArgs, C as RuntimeEntryDialogShellProps, E as RuntimeEntryDialogViewLike, F as createDynamicFormComponent, G as createDynamicListComponent, H as createDynamicViewComponent, I as createRuntimeEntryDialogComponent, J as shouldHandleDynamicViewRowClick } from './RuntimeEntryDialog-Bw741XbS.js';
12
12
  export { BuilderRuntimeEntryLike, BuilderRuntimeEntryValues, BuilderRuntimeFieldLike, BuilderRuntimeFormSchemaLike, BuilderRuntimeFormValues, BuilderRuntimePresentation, BuilderRuntimeViewLike, createBuilderEntryDefaultValues, createBuilderFormDefaultValues, formatBuilderRuntimeValue } from './runtime/index.js';
13
13
  export { BuilderFrontendSetupValidation, BuilderIntegration, BuilderIntegrationConfig, BuilderIntegrationRoutes, createBuilderIntegration, createBuilderPortalIntegration, validateBuilderFrontendSetup } from './integration/index.js';
14
14
  import 'react-hook-form';
15
15
 
16
+ type BuilderFormProps = {
17
+ formId: string;
18
+ };
19
+ type BuilderGridProps = {
20
+ listId: string;
21
+ };
22
+ type BuilderViewProps = {
23
+ viewId: string;
24
+ };
25
+ type BuilderRuntimeComponents = {
26
+ Form?: ComponentType<BuilderFormProps>;
27
+ Grid?: ComponentType<BuilderGridProps>;
28
+ View?: ComponentType<BuilderViewProps>;
29
+ };
30
+
16
31
  type ReadyBuilderContracts = BuilderApiContracts & {
17
32
  BuilderDbTable: BuilderDbTable;
18
33
  BuilderForm: BuilderForm$1;
@@ -781,8 +796,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
781
796
  key: string;
782
797
  label: string;
783
798
  sortable: boolean;
799
+ hidden: boolean;
784
800
  align: "left" | "right";
785
801
  }[];
802
+ orderBy?: {
803
+ field: string;
804
+ direction: "asc" | "desc";
805
+ }[] | undefined;
786
806
  };
787
807
  triggers: {
788
808
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -822,8 +842,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
822
842
  key: string;
823
843
  label: string;
824
844
  sortable: boolean;
845
+ hidden: boolean;
825
846
  align: "left" | "right";
826
847
  }[];
848
+ orderBy?: {
849
+ field: string;
850
+ direction: "asc" | "desc";
851
+ }[] | undefined;
827
852
  };
828
853
  triggers: {
829
854
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -859,8 +884,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
859
884
  key: string;
860
885
  label: string;
861
886
  sortable: boolean;
887
+ hidden: boolean;
862
888
  align: "left" | "right";
863
889
  }[];
890
+ orderBy?: {
891
+ field: string;
892
+ direction: "asc" | "desc";
893
+ }[] | undefined;
864
894
  };
865
895
  triggers: {
866
896
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -877,8 +907,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
877
907
  key: string;
878
908
  label: string;
879
909
  sortable: boolean;
910
+ hidden: boolean;
880
911
  align: "left" | "right";
881
912
  }[];
913
+ orderBy?: {
914
+ field: string;
915
+ direction: "asc" | "desc";
916
+ }[] | undefined;
882
917
  };
883
918
  description?: string | null | undefined;
884
919
  source?: {
@@ -925,8 +960,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
925
960
  key: string;
926
961
  label: string;
927
962
  sortable: boolean;
963
+ hidden: boolean;
928
964
  align: "left" | "right";
929
965
  }[];
966
+ orderBy?: {
967
+ field: string;
968
+ direction: "asc" | "desc";
969
+ }[] | undefined;
930
970
  };
931
971
  triggers: {
932
972
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -943,8 +983,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
943
983
  key: string;
944
984
  label: string;
945
985
  sortable: boolean;
986
+ hidden: boolean;
946
987
  align: "left" | "right";
947
988
  }[];
989
+ orderBy?: {
990
+ field: string;
991
+ direction: "asc" | "desc";
992
+ }[] | undefined;
948
993
  };
949
994
  version: number;
950
995
  description?: string | null | undefined;
@@ -992,8 +1037,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
992
1037
  key: string;
993
1038
  label: string;
994
1039
  sortable: boolean;
1040
+ hidden: boolean;
995
1041
  align: "left" | "right";
996
1042
  }[];
1043
+ orderBy?: {
1044
+ field: string;
1045
+ direction: "asc" | "desc";
1046
+ }[] | undefined;
997
1047
  };
998
1048
  triggers: {
999
1049
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1031,8 +1081,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1031
1081
  key: string;
1032
1082
  label: string;
1033
1083
  sortable: boolean;
1084
+ hidden: boolean;
1034
1085
  align: "left" | "right";
1035
1086
  }[];
1087
+ orderBy?: {
1088
+ field: string;
1089
+ direction: "asc" | "desc";
1090
+ }[] | undefined;
1036
1091
  };
1037
1092
  triggers: {
1038
1093
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1172,8 +1227,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1172
1227
  key: string;
1173
1228
  label: string;
1174
1229
  sortable: boolean;
1230
+ hidden: boolean;
1175
1231
  align: "left" | "right";
1176
1232
  }[];
1233
+ orderBy?: {
1234
+ field: string;
1235
+ direction: "asc" | "desc";
1236
+ }[] | undefined;
1177
1237
  };
1178
1238
  triggers: {
1179
1239
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1315,8 +1375,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1315
1375
  key: string;
1316
1376
  label: string;
1317
1377
  sortable: boolean;
1378
+ hidden: boolean;
1318
1379
  align: "left" | "right";
1319
1380
  }[];
1381
+ orderBy?: {
1382
+ field: string;
1383
+ direction: "asc" | "desc";
1384
+ }[] | undefined;
1320
1385
  };
1321
1386
  triggers: {
1322
1387
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1468,8 +1533,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1468
1533
  key: string;
1469
1534
  label: string;
1470
1535
  sortable: boolean;
1536
+ hidden: boolean;
1471
1537
  align: "left" | "right";
1472
1538
  }[];
1539
+ orderBy?: {
1540
+ field: string;
1541
+ direction: "asc" | "desc";
1542
+ }[] | undefined;
1473
1543
  };
1474
1544
  triggers: {
1475
1545
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1622,8 +1692,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1622
1692
  key: string;
1623
1693
  label: string;
1624
1694
  sortable: boolean;
1695
+ hidden: boolean;
1625
1696
  align: "left" | "right";
1626
1697
  }[];
1698
+ orderBy?: {
1699
+ field: string;
1700
+ direction: "asc" | "desc";
1701
+ }[] | undefined;
1627
1702
  };
1628
1703
  triggers: {
1629
1704
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1763,8 +1838,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1763
1838
  key: string;
1764
1839
  label: string;
1765
1840
  sortable: boolean;
1841
+ hidden: boolean;
1766
1842
  align: "left" | "right";
1767
1843
  }[];
1844
+ orderBy?: {
1845
+ field: string;
1846
+ direction: "asc" | "desc";
1847
+ }[] | undefined;
1768
1848
  };
1769
1849
  triggers: {
1770
1850
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -1926,8 +2006,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
1926
2006
  key: string;
1927
2007
  label: string;
1928
2008
  sortable: boolean;
2009
+ hidden: boolean;
1929
2010
  align: "left" | "right";
1930
2011
  }[];
2012
+ orderBy?: {
2013
+ field: string;
2014
+ direction: "asc" | "desc";
2015
+ }[] | undefined;
1931
2016
  };
1932
2017
  triggers: {
1933
2018
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -2082,8 +2167,13 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
2082
2167
  key: string;
2083
2168
  label: string;
2084
2169
  sortable: boolean;
2170
+ hidden: boolean;
2085
2171
  align: "left" | "right";
2086
2172
  }[];
2173
+ orderBy?: {
2174
+ field: string;
2175
+ direction: "asc" | "desc";
2176
+ }[] | undefined;
2087
2177
  };
2088
2178
  triggers: {
2089
2179
  action: "callApi" | "webhook" | "audit" | "notify" | "validate";
@@ -2186,6 +2276,7 @@ declare function createBuilderClient({ transport, apiBasePath }: CreateBuilderCl
2186
2276
  };
2187
2277
  type BuilderContextValue = {
2188
2278
  client: BuilderClient;
2279
+ components: BuilderRuntimeComponents;
2189
2280
  hooks: BuilderHooks<ReadyBuilderContracts>;
2190
2281
  notify(notification: BuilderNotification): void;
2191
2282
  };
@@ -2194,29 +2285,21 @@ type BuilderProviderProps = {
2194
2285
  client?: BuilderClient;
2195
2286
  transport?: BuilderApiTransport;
2196
2287
  apiBasePath?: string;
2288
+ components?: BuilderRuntimeComponents;
2197
2289
  queryClient?: QueryClient;
2198
2290
  onNotify?(notification: BuilderNotification): void;
2199
2291
  };
2200
- declare function BuilderProvider({ children, client: configuredClient, transport, apiBasePath, queryClient, onNotify, }: BuilderProviderProps): react.JSX.Element;
2292
+ declare function BuilderProvider({ children, client: configuredClient, transport, apiBasePath, components, queryClient, onNotify, }: BuilderProviderProps): react.JSX.Element;
2201
2293
  declare function useBuilderRuntime(): BuilderContextValue;
2202
2294
  declare function builderErrorMessage(error: unknown, fallback: string): string;
2203
2295
 
2204
- type BuilderFormProps = {
2205
- formId: string;
2206
- };
2207
- type BuilderGridProps = {
2208
- listId: string;
2209
- };
2210
- type BuilderViewProps = {
2211
- viewId: string;
2212
- };
2213
- declare function BuilderForm({ formId }: BuilderFormProps): react.JSX.Element;
2214
- declare function BuilderGrid({ listId }: BuilderGridProps): react.JSX.Element;
2215
- declare function BuilderView({ viewId }: BuilderViewProps): react.JSX.Element;
2296
+ declare function BuilderForm(props: BuilderFormProps): react.JSX.Element;
2297
+ declare function BuilderGrid(props: BuilderGridProps): react.JSX.Element;
2298
+ declare function BuilderView(props: BuilderViewProps): react.JSX.Element;
2216
2299
 
2217
2300
  declare const builderUiPackage: {
2218
2301
  readonly name: "@duke333/builder-ui";
2219
2302
  readonly version: "0.2.2";
2220
2303
  };
2221
2304
 
2222
- export { BuilderApiClient, BuilderApiContracts, BuilderApiTransport, type BuilderClient, BuilderFieldOptionsQuery, BuilderForm, type BuilderFormProps, BuilderGrid, type BuilderGridProps, BuilderHooks, type BuilderNotification, BuilderProvider, type BuilderProviderProps, BuilderView, type BuilderViewProps, type CreateBuilderClientOptions, type ReadyBuilderContracts, builderErrorMessage, builderUiPackage, createBuilderClient, useBuilderRuntime };
2305
+ export { BuilderApiClient, BuilderApiContracts, BuilderApiTransport, type BuilderClient, BuilderFieldOptionsQuery, BuilderForm, type BuilderFormProps, BuilderGrid, type BuilderGridProps, BuilderHooks, type BuilderNotification, BuilderProvider, type BuilderProviderProps, type BuilderRuntimeComponents, BuilderView, type BuilderViewProps, type CreateBuilderClientOptions, type ReadyBuilderContracts, builderErrorMessage, builderUiPackage, createBuilderClient, useBuilderRuntime };