add builders for html field

This commit is contained in:
Alexander Nozik 2023-12-03 20:17:48 +03:00
parent c877fcbce3
commit fbb402de90
3 changed files with 37 additions and 5 deletions

View File

@ -25,8 +25,13 @@ public inline fun VisionOfPlainHtml.content(block: TagConsumer<*>.() -> Unit) {
content = createHTML().apply(block).finalize() content = createHTML().apply(block).finalize()
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.html(
block: VisionOfPlainHtml.() -> Unit,
): VisionOfPlainHtml = VisionOfPlainHtml().apply(block)
@Serializable @Serializable
public enum class InputFeedbackMode{ public enum class InputFeedbackMode {
/** /**
* Fire feedback event on `onchange` event * Fire feedback event on `onchange` event
*/ */
@ -47,13 +52,18 @@ public enum class InputFeedbackMode{
@SerialName("html.input") @SerialName("html.input")
public open class VisionOfHtmlInput( public open class VisionOfHtmlInput(
public val inputType: String, public val inputType: String,
public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE,
) : VisionOfHtml() { ) : VisionOfHtml() {
public var value: Value? by properties.value() public var value: Value? by properties.value()
public var disabled: Boolean by properties.boolean { false } public var disabled: Boolean by properties.boolean { false }
public var fieldName: String? by properties.string() public var fieldName: String? by properties.string()
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.htmlInput(
inputType: String,
block: VisionOfHtmlInput.() -> Unit = {},
): VisionOfHtmlInput = VisionOfHtmlInput(inputType).apply(block)
@Serializable @Serializable
@SerialName("html.text") @SerialName("html.text")
@ -61,18 +71,34 @@ public class VisionOfTextField : VisionOfHtmlInput(InputType.text.realValue) {
public var text: String? by properties.string(key = VisionOfHtmlInput::value.name.asName()) public var text: String? by properties.string(key = VisionOfHtmlInput::value.name.asName())
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.htmlTextField(
block: VisionOfTextField.() -> Unit = {},
): VisionOfTextField = VisionOfTextField().apply(block)
@Serializable @Serializable
@SerialName("html.checkbox") @SerialName("html.checkbox")
public class VisionOfCheckbox : VisionOfHtmlInput(InputType.checkBox.realValue) { public class VisionOfCheckbox : VisionOfHtmlInput(InputType.checkBox.realValue) {
public var checked: Boolean? by properties.boolean(key = VisionOfHtmlInput::value.name.asName()) public var checked: Boolean? by properties.boolean(key = VisionOfHtmlInput::value.name.asName())
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.htmlCheckBox(
block: VisionOfCheckbox.() -> Unit = {},
): VisionOfCheckbox = VisionOfCheckbox().apply(block)
@Serializable @Serializable
@SerialName("html.number") @SerialName("html.number")
public class VisionOfNumberField : VisionOfHtmlInput(InputType.number.realValue) { public class VisionOfNumberField : VisionOfHtmlInput(InputType.number.realValue) {
public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName())
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.htmlNumberField(
block: VisionOfNumberField.() -> Unit = {},
): VisionOfNumberField = VisionOfNumberField().apply(block)
@Serializable @Serializable
@SerialName("html.range") @SerialName("html.range")
public class VisionOfRangeField( public class VisionOfRangeField(
@ -83,3 +109,11 @@ public class VisionOfRangeField(
public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName())
} }
@Suppress("UnusedReceiverParameter")
public inline fun VisionOutput.htmlRangeField(
min: Double,
max: Double,
step: Double = 1.0,
block: VisionOfRangeField.() -> Unit = {},
): VisionOfRangeField = VisionOfRangeField(min, max, step).apply(block)

View File

@ -1,7 +1,6 @@
package space.kscience.visionforge.meta package space.kscience.visionforge.meta
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.take
@ -24,7 +23,6 @@ private class TestScheme : Scheme() {
companion object : SchemeSpec<TestScheme>(::TestScheme) companion object : SchemeSpec<TestScheme>(::TestScheme)
} }
@OptIn(ExperimentalCoroutinesApi::class)
internal class VisionPropertyTest { internal class VisionPropertyTest {
private val manager = Global.request(VisionManager) private val manager = Global.request(VisionManager)

View File

@ -194,7 +194,7 @@ internal fun FormData.toMeta(): Meta {
} }
internal val formVisionRenderer: ElementVisionRenderer = internal val formVisionRenderer: ElementVisionRenderer =
ElementVisionRenderer<VisionOfHtmlForm> { visionName, vision, _ -> ElementVisionRenderer<VisionOfHtmlForm> { _, vision, _ ->
val form = document.getElementById(vision.formId) as? HTMLFormElement val form = document.getElementById(vision.formId) as? HTMLFormElement
?: error("An element with id = '${vision.formId} is not a form") ?: error("An element with id = '${vision.formId} is not a form")