Form

fun Form(editor: DocumentEditor, config: FormConfig = editor.config, navigation: @Composable (navigator: PageCollection, state: PageCollectionState) -> Unit? = { navigator, state -> if (state.pages.isNotEmpty()) { JoyPageSelector( state = state, isPageDuplicateEnabled = config.pages.enableDuplicates && config.mode != Mode.readonly, onDuplicate = { page, keepValues -> navigator.duplicate(page, page.name, keepValues) config.events.onChange?.invoke(ComponentEvent.PageEvent.PageCreate(page = page)) }, onChange = { val page = navigator.navigate(it) ?: return@JoyPageSelector }, allowDeletingPages = config.pages.enableDeletes && config.mode != Mode.readonly, onDelete = { val isDeleted = navigator.delete(it) if (!isDeleted) return@JoyPageSelector config.events.onChange?.invoke(ComponentEvent.PageEvent.PageDelete(page = it)) }, ) } }, error: @Composable (Error) -> Unit = { ErrorFormState(it) }, modifier: Modifier = Modifier, arrangement: Arrangement.Vertical = Arrangement.spacedBy(16.dp), contentPadding: PaddingValues = PaddingValues(0.dp))

High-level composable to render a document using a DocumentEditor.

This is the preferred entry point: pass the same FormConfig you used to build the editor (defaults to DocumentEditor.config). All rendering behaviour — mode, events, display flags, page capabilities and decorators — is sourced from config.

Parameters

editor

Editor providing pages, fields and validation.

config

Unified configuration; defaults to the config the editor was created with.

navigation

Slot for a custom page navigator; provided default shows page tabs.

error

Error UI when editor.error is non-null.

modifier

Layout modifier for the content area.

arrangement

Vertical spacing arrangement between rows.

contentPadding

Padding applied to the list of components.


fun Form(editor: DocumentEditor, mode: Mode = Mode.fill, maxAllowedSizeMB: Int? = null, onUpload: suspend (ComponentEvent<AbstractFileEditor>) -> List<String>? = null, onCapture: suspend (ComponentEvent<AbstractCompStringEditor>) -> String?? = null, onBlur: (event: ComponentEvent<*>) -> Unit? = null, onFocus: (event: ComponentEvent<*>) -> Unit? = null, license: String? = Secrets.LICENSE, isPageDuplicateEnabled: Boolean = false, isPageDeleteEnabled: Boolean = false, singleClickRowEdit: Boolean = false, onFieldChange: (event: ComponentEvent<*>) -> Unit? = null, navigation: @Composable (navigator: PageCollection, state: PageCollectionState) -> Unit? = { navigator, state -> if (state.pages.isNotEmpty()) { JoyPageSelector( state = state, isPageDuplicateEnabled = isPageDuplicateEnabled && mode != Mode.readonly, onDuplicate = { page, keepValues -> navigator.duplicate(page, page.name, keepValues) val component = ComponentEvent.PageEvent.PageCreate(page = page) onFieldChange?.invoke(component) }, onChange = { val page = navigator.navigate(it) ?: return@JoyPageSelector }, allowDeletingPages = isPageDeleteEnabled && mode != Mode.readonly, onDelete = { val isDeleted = navigator.delete(it) if (!isDeleted) return@JoyPageSelector val component = ComponentEvent.PageEvent.PageDelete(page = it) onFieldChange?.invoke(component) }, ) } }, error: @Composable (Error) -> Unit = { ErrorFormState(it) }, showUnsupportedFields: Boolean = false, showUnsupportedColumns: Boolean = true, showRowNumbers: Boolean = true, modifier: Modifier = Modifier, arrangement: Arrangement.Vertical = Arrangement.spacedBy(16.dp), contentPadding: PaddingValues = PaddingValues(0.dp), inlineFields: Boolean = false, decoratorConfig: DecoratorConfig = DecoratorConfig.Default)

Deprecated

Use Form(editor, config) instead. Build a FormConfig and pass it to both rememberDocumentEditor and Form.

High-level composable to render a document using a DocumentEditor. Orchestrates page navigation, component rendering and event emission.

Parameters

editor

Editor providing pages, fields and validation.

mode

Rendering mode (e.g., fill vs readonly) controlling interactivity.

maxAllowedSizeMB

Optional file upload size limit (MB) for file components.

onUpload

Async handler to upload files; used by file/image components.

onCapture

Async handler to capture barcode/signature content.

onBlur

Callback when a component or page loses focus.

onFocus

Callback when a component or page gains focus.

license

License string used to enable licensed features.

isPageDuplicateEnabled

Whether user can duplicate pages via navigation UI.

singleClickRowEdit

Whether user can single click to edit table rows.

isPageDeleteEnabled

Whether user can delete pages via navigation UI.

navigation

Slot for a custom page navigator; provided default shows page tabs.

error

Error UI when editor.error is non-null.

onFieldChange

Callback invoked on component value changes.

showUnsupportedFields

If true, render a placeholder for unsupported editors.

showUnsupportedColumns

If true, render placeholder for unsupported table columns.

showRowNumbers

If true, display row numbers in table components.

modifier

Layout modifier for the content area.

arrangement

Vertical spacing arrangement between rows.

contentPadding

Padding applied to the list of components.

inlineFields

When true, openable fields (e.g. table) render inline instead of in a dialog, so surrounding UI stays accessible.