aboutsummaryrefslogtreecommitdiff
path: root/kvision-modules
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2019-03-17 00:42:42 +0100
committerRobert Jaros <rjaros@finn.pl>2019-03-17 00:42:42 +0100
commit1842f7940348d6659fa4436c7132abc73a3d9b4f (patch)
treec04444d802c498d64b31e8051cb1bb4282dfd382 /kvision-modules
parent0a79457b94307f14bc4494f617ce09fab3505cdf (diff)
downloadkvision-1842f7940348d6659fa4436c7132abc73a3d9b4f.tar.gz
kvision-1842f7940348d6659fa4436c7132abc73a3d9b4f.tar.bz2
kvision-1842f7940348d6659fa4436c7132abc73a3d9b4f.zip
Move suspending functions for getting file content to the kvision-upload module.
Diffstat (limited to 'kvision-modules')
-rw-r--r--kvision-modules/kvision-upload/build.gradle4
-rw-r--r--kvision-modules/kvision-upload/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt73
2 files changed, 77 insertions, 0 deletions
diff --git a/kvision-modules/kvision-upload/build.gradle b/kvision-modules/kvision-upload/build.gradle
index 8b90532c..21ac7eab 100644
--- a/kvision-modules/kvision-upload/build.gradle
+++ b/kvision-modules/kvision-upload/build.gradle
@@ -1,5 +1,9 @@
apply from: "../shared.gradle"
+dependencies {
+ compile "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$coroutinesVersion"
+}
+
kotlinFrontend {
npm {
diff --git a/kvision-modules/kvision-upload/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt b/kvision-modules/kvision-upload/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt
new file mode 100644
index 00000000..bdae5091
--- /dev/null
+++ b/kvision-modules/kvision-upload/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017-present Robert Jaros
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package pl.treksoft.kvision.utils
+
+import kotlinx.coroutines.suspendCancellableCoroutine
+import org.w3c.files.File
+import org.w3c.files.FileReader
+import pl.treksoft.kvision.form.Form
+import pl.treksoft.kvision.form.FormPanel
+import pl.treksoft.kvision.form.KFilesFormControl
+import kotlin.coroutines.resume
+import kotlin.coroutines.resumeWithException
+
+/**
+ * Suspending extension function to get file content.
+ * @return file content
+ */
+suspend fun File.getContent(): String = suspendCancellableCoroutine { cont ->
+ val reader = FileReader()
+ reader.onload = {
+ @Suppress("UnsafeCastFromDynamic")
+ cont.resume(reader.result)
+ }
+ reader.onerror = { e ->
+ cont.resumeWithException(Exception(e.type))
+ }
+ reader.readAsDataURL(this@getContent)
+}
+
+/**
+ * Returns current data model with file content read for all KFiles controls.
+ * @return data model
+ */
+suspend fun <K : Any> Form<K>.getDataWithFileContent(): K {
+ val map = this.fields.entries.associateBy({ it.key }, {
+ val value = it.value
+ if (value is KFilesFormControl) {
+ value.getValue()?.map {
+ it.copy(content = value.getNativeFile(it)?.getContent())
+ }
+ } else {
+ value.getValue()
+ }
+ })
+ return this.modelFactory(map.withDefault { null })
+}
+
+/**
+ * Returns current data model with file content read for all KFiles controls.
+ * @return data model
+ */
+suspend fun <K : Any> FormPanel<K>.getDataWithFileContent(): K {
+ return this.form.getDataWithFileContent()
+}