aboutsummaryrefslogtreecommitdiff
path: root/kvision-modules/kvision-bootstrap-select-remote
diff options
context:
space:
mode:
Diffstat (limited to 'kvision-modules/kvision-bootstrap-select-remote')
-rw-r--r--kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemote.kt11
-rw-r--r--kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemoteInput.kt15
2 files changed, 17 insertions, 9 deletions
diff --git a/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemote.kt b/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemote.kt
index 930bea32..1cabb5dd 100644
--- a/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemote.kt
+++ b/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemote.kt
@@ -40,6 +40,7 @@ import pl.treksoft.kvision.utils.SnOn
* @param value selected value
* @param serviceManager multiplatform service manager
* @param function multiplatform service method returning the list of options
+ * @param stateFunction a function to generate the state object passed with the remote request
* @param name the name attribute of the generated HTML input element
* @param multiple allows multiple value selection (multiple values are comma delimited)
* @param ajaxOptions additional options for remote data source
@@ -50,7 +51,8 @@ import pl.treksoft.kvision.utils.SnOn
open class SelectRemote<T : Any>(
value: String? = null,
serviceManager: KVServiceManager<T>,
- function: T.(String?, String?) -> List<RemoteOption>,
+ function: T.(String?, String?, String?) -> List<RemoteOption>,
+ stateFunction: (() -> String)? = null,
name: String? = null,
multiple: Boolean = false,
ajaxOptions: AjaxOptions? = null,
@@ -148,7 +150,7 @@ open class SelectRemote<T : Any>(
private val idc = "kv_form_SelectRemote_$counter"
final override val input: SelectRemoteInput<T> = SelectRemoteInput(
- value, serviceManager, function, multiple, ajaxOptions,
+ value, serviceManager, function, stateFunction, multiple, ajaxOptions,
setOf("form-control")
).apply {
this.id = idc
@@ -256,8 +258,8 @@ open class SelectRemote<T : Any>(
fun <T : Any> Container.selectRemote(
value: String? = null,
serviceManager: KVServiceManager<T>,
- function: T.(String?, String?) -> List<RemoteOption>, name: String? = null,
- multiple: Boolean = false, ajaxOptions: AjaxOptions? = null, label: String? = null,
+ function: T.(String?, String?, String?) -> List<RemoteOption>, stateFunction: (() -> String)? = null,
+ name: String? = null, multiple: Boolean = false, ajaxOptions: AjaxOptions? = null, label: String? = null,
rich: Boolean = false, init: (SelectRemote<T>.() -> Unit)? = null
): SelectRemote<T> {
val selectRemote =
@@ -265,6 +267,7 @@ fun <T : Any> Container.selectRemote(
value,
serviceManager,
function,
+ stateFunction,
name,
multiple,
ajaxOptions,
diff --git a/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemoteInput.kt b/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemoteInput.kt
index 5a795c9c..e44c63d5 100644
--- a/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemoteInput.kt
+++ b/kvision-modules/kvision-bootstrap-select-remote/src/main/kotlin/pl/treksoft/kvision/form/select/SelectRemoteInput.kt
@@ -45,6 +45,7 @@ external fun decodeURIComponent(encodedURI: String): String
* @param value selected value
* @param serviceManager multiplatform service manager
* @param function multiplatform service method returning the list of options
+ * @param stateFunction a function to generate the state object passed with the remote request
* @param multiple allows multiple value selection (multiple values are comma delimited)
* @param ajaxOptions additional options for remote data source
* @param classes a set of CSS class names
@@ -53,7 +54,8 @@ external fun decodeURIComponent(encodedURI: String): String
open class SelectRemoteInput<T : Any>(
value: String? = null,
serviceManager: KVServiceManager<T>,
- function: T.(String?, String?) -> List<RemoteOption>,
+ function: T.(String?, String?, String?) -> List<RemoteOption>,
+ stateFunction: (() -> String)? = null,
multiple: Boolean = false,
ajaxOptions: AjaxOptions? = null,
classes: Set<String> = setOf()
@@ -85,15 +87,17 @@ open class SelectRemoteInput<T : Any>(
}, data = data, beforeSend = { _, b ->
@Suppress("UnsafeCastFromDynamic")
val q = decodeURIComponent(b.data.substring(2))
- b.data = JSON.plain.stringify(JsonRpcRequest(0, url, listOf(q, this.value)))
+ val state = stateFunction?.invoke()
+ b.data = JSON.plain.stringify(JsonRpcRequest(0, url, listOf(q, this.value, state)))
true
}, httpType = HttpType.valueOf(method.name), cache = false, preserveSelected = true)
if (value != null) {
GlobalScope.launch {
val callAgent = CallAgent()
+ val state = stateFunction?.invoke()
val initials = callAgent.remoteCall(
url,
- JSON.plain.stringify(JsonRpcRequest(0, url, listOf(null, value))),
+ JSON.plain.stringify(JsonRpcRequest(0, url, listOf(null, value, state))),
HttpMethod.POST
).asDeferred().await()
JSON.plain.parse(RemoteOption.serializer().list, initials.result as String).map {
@@ -123,13 +127,14 @@ open class SelectRemoteInput<T : Any>(
fun <T : Any> Container.selectRemoteInput(
value: String? = null,
serviceManager: KVServiceManager<T>,
- function: T.(String?, String?) -> List<RemoteOption>,
+ function: T.(String?, String?, String?) -> List<RemoteOption>,
+ stateFunction: (() -> String)? = null,
multiple: Boolean = false,
ajaxOptions: AjaxOptions? = null,
classes: Set<String> = setOf(), init: (SelectRemoteInput<T>.() -> Unit)? = null
): SelectRemoteInput<T> {
val selectRemoteInput =
- SelectRemoteInput(value, serviceManager, function, multiple, ajaxOptions, classes).apply {
+ SelectRemoteInput(value, serviceManager, function, stateFunction, multiple, ajaxOptions, classes).apply {
init?.invoke(this)
}
this.add(selectRemoteInput)