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 providing pages, fields and validation.
Unified configuration; defaults to the config the editor was created with.
Slot for a custom page navigator; provided default shows page tabs.
Error UI when editor.error is non-null.
Layout modifier for the content area.
Vertical spacing arrangement between rows.
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 providing pages, fields and validation.
Rendering mode (e.g., fill vs readonly) controlling interactivity.
Optional file upload size limit (MB) for file components.
Async handler to upload files; used by file/image components.
Async handler to capture barcode/signature content.
Callback when a component or page loses focus.
Callback when a component or page gains focus.
License string used to enable licensed features.
Whether user can duplicate pages via navigation UI.
Whether user can single click to edit table rows.
Whether user can delete pages via navigation UI.
Slot for a custom page navigator; provided default shows page tabs.
Error UI when editor.error is non-null.
Callback invoked on component value changes.
If true, render a placeholder for unsupported editors.
If true, render placeholder for unsupported table columns.
If true, display row numbers in table components.
Layout modifier for the content area.
Vertical spacing arrangement between rows.
Padding applied to the list of components.
When true, openable fields (e.g. table) render inline instead of in a dialog, so surrounding UI stays accessible.