From de937aa0f2045515855a6443ced5b55598608902 Mon Sep 17 00:00:00 2001 From: Robert Jaros Date: Sun, 19 Apr 2020 19:11:25 +0200 Subject: New kvision-toast module (#69) --- kvision-modules/kvision-toast/build.gradle.kts | 48 ++++++ .../kotlin/pl/treksoft/kvision/KVManagerToast.kt | 38 +++++ .../main/kotlin/pl/treksoft/kvision/toast/Toast.kt | 178 +++++++++++++++++++++ .../kvision-toast/webpack.config.d/bootstrap.js | 3 + .../kvision-toast/webpack.config.d/css.js | 2 + .../kvision-toast/webpack.config.d/file.js | 9 ++ 6 files changed, 278 insertions(+) create mode 100644 kvision-modules/kvision-toast/build.gradle.kts create mode 100644 kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/KVManagerToast.kt create mode 100644 kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/toast/Toast.kt create mode 100644 kvision-modules/kvision-toast/webpack.config.d/bootstrap.js create mode 100644 kvision-modules/kvision-toast/webpack.config.d/css.js create mode 100644 kvision-modules/kvision-toast/webpack.config.d/file.js (limited to 'kvision-modules') diff --git a/kvision-modules/kvision-toast/build.gradle.kts b/kvision-modules/kvision-toast/build.gradle.kts new file mode 100644 index 00000000..36ea4949 --- /dev/null +++ b/kvision-modules/kvision-toast/build.gradle.kts @@ -0,0 +1,48 @@ +buildscript { + extra.set("production", (findProperty("prod") ?: findProperty("production") ?: "false") == "true") +} + +plugins { + kotlin("js") + id("maven-publish") +} + +repositories() + +kotlin { + kotlinJsTargets() +} + +dependencies { + implementation(kotlin("stdlib-js")) + api(rootProject) + implementation(npm("toastr", "2.1.4")) + testImplementation(kotlin("test-js")) +} + +val sourcesJar by tasks.registering(Jar::class) { + archiveClassifier.set("sources") + from(kotlin.sourceSets.main.get().kotlin) +} + +publishing { + publications { + create("kotlin") { + from(components["kotlin"]) + artifact(tasks["sourcesJar"]) + pom { + defaultPom() + } + } + } +} + +setupPublication() + +tasks { + getByName("JsJar", Jar::class) { + from("${rootProject.buildDir}/js/packages/kvision-${project.name}/package.json") { + filter { it.replace("\"main\": \"kotlin/kvision-kvision", "\"main\": \"kvision-kvision") } + } + } +} diff --git a/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/KVManagerToast.kt b/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/KVManagerToast.kt new file mode 100644 index 00000000..5c6e1441 --- /dev/null +++ b/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/KVManagerToast.kt @@ -0,0 +1,38 @@ +/* + * 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 + +internal val kVManagerToastInit = KVManagerToast.init() + +/** + * Internal singleton object which initializes and configures KVision Toast module. + */ +internal object KVManagerToast { + + init { + require("toastr/build/toastr.min.css") + } + + internal val toastr = require("toastr/build/toastr.min.js") + + internal fun init() {} +} diff --git a/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/toast/Toast.kt b/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/toast/Toast.kt new file mode 100644 index 00000000..99201dc5 --- /dev/null +++ b/kvision-modules/kvision-toast/src/main/kotlin/pl/treksoft/kvision/toast/Toast.kt @@ -0,0 +1,178 @@ +/* + * 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.toast + +import pl.treksoft.kvision.KVManagerToast +import pl.treksoft.kvision.utils.obj + +/** + * Toast message types. + */ +internal enum class ToastType(internal val type: String) { + INFO("info"), + SUCCESS("success"), + WARNING("warning"), + ERROR("error") +} + +/** + * Toast positions. + */ +enum class ToastPosition(internal val position: String) { + TOPRIGHT("toast-top-right"), + BOTTOMRIGHT("toast-bottom-right"), + BOTTOMLEFT("toast-bottom-left"), + TOPLEFT("toast-top-left"), + TOPFULLWIDTH("toast-top-full-width"), + BOTTOMFULLWIDTH("toast-bottom-full-width"), + TOPCENTER("toast-top-center"), + BOTTOMCENTER("toast-bottom-center") +} + +/** + * Toast easings. + */ +enum class ToastEasing(internal val easing: String) { + SWING("swing"), + LINEAR("linear") +} + +/** + * Toast animation methods. + */ +enum class ToastMethod(internal val method: String) { + FADEIN("fadeIn"), + FADEOUT("fadeOut"), + SLIDEUP("slideUp"), + SLIDEDOWN("slideDown"), + SHOW("show"), + HIDE("hide") +} + +/** + * Toast options. + */ +data class ToastOptions( + val positionClass: ToastPosition? = null, + val escapeHtml: Boolean? = null, + val closeButton: Boolean? = null, + val closeHtml: String? = null, + val closeDuration: Int? = null, + val newestOnTop: Boolean? = null, + val showEasing: ToastEasing? = null, + val hideEasing: ToastEasing? = null, + val closeEasing: ToastEasing? = null, + val showMethod: ToastMethod? = null, + val hideMethod: ToastMethod? = null, + val closeMethod: ToastMethod? = null, + val preventDuplicates: Boolean? = null, + val timeOut: Int? = null, + val extendedTimeOut: Int? = null, + val progressBar: Boolean? = null, + val rtl: Boolean? = null, + val onShown: (() -> Unit)? = null, + val onHidden: (() -> Unit)? = null, + val onClick: (() -> Unit)? = null, + val onCloseClick: (() -> Unit)? = null +) + +internal fun ToastOptions.toJs(): dynamic { + return obj { + if (positionClass != null) this.positionClass = positionClass.position + if (escapeHtml != null) this.escapeHtml = escapeHtml + if (closeButton != null) this.closeButton = closeButton + if (closeHtml != null) this.closeHtml = closeHtml + if (closeDuration != null) this.closeDuration = closeDuration + if (newestOnTop != null) this.newestOnTop = newestOnTop + if (showEasing != null) this.showEasing = showEasing.easing + if (hideEasing != null) this.hideEasing = hideEasing.easing + if (closeEasing != null) this.closeEasing = closeEasing.easing + if (showMethod != null) this.showMethod = showMethod.method + if (hideMethod != null) this.hideMethod = hideMethod.method + if (closeMethod != null) this.closeMethod = closeMethod.method + if (preventDuplicates != null) this.preventDuplicates = preventDuplicates + if (timeOut != null) this.timeOut = timeOut + if (extendedTimeOut != null) this.extendedTimeOut = extendedTimeOut + if (progressBar != null) this.progressBar = progressBar + if (rtl != null) this.rtl = rtl + if (onShown != null) this.onShown = onShown + if (onHidden != null) this.onHidden = onHidden + if (onClick != null) this.onClick = onClick + if (onCloseClick != null) this.onCloseClick = onCloseClick + } +} + +/** + * Toast component object. + */ +object Toast { + + /** + * Shows a success toast. + * @param message a toast message + * @param title a toast title + * @param options toast options + */ + fun success(message: String, title: String? = null, options: ToastOptions? = null) { + show(ToastType.SUCCESS, message, title, options) + } + + /** + * Shows an info toast. + * @param message a toast message + * @param title a toast title + * @param options toast options + */ + fun info(message: String, title: String? = null, options: ToastOptions? = null) { + show(ToastType.INFO, message, title, options) + } + + /** + * Shows a warning toast. + * @param message a toast message + * @param title a toast title + * @param options toast options + */ + fun warning(message: String, title: String? = null, options: ToastOptions? = null) { + show(ToastType.WARNING, message, title, options) + } + + /** + * Shows an error toast. + * @param message a toast message + * @param title a toast title + * @param options toast options + */ + fun error(message: String, title: String? = null, options: ToastOptions? = null) { + show(ToastType.ERROR, message, title, options) + } + + private fun show(type: ToastType, message: String, title: String? = null, options: ToastOptions? = null) { + if (options != null) { + KVManagerToast.toastr[type.type](message, title, options.toJs()) + } else { + KVManagerToast.toastr[type.type](message, title) + } + } + +} diff --git a/kvision-modules/kvision-toast/webpack.config.d/bootstrap.js b/kvision-modules/kvision-toast/webpack.config.d/bootstrap.js new file mode 100644 index 00000000..35b28e6a --- /dev/null +++ b/kvision-modules/kvision-toast/webpack.config.d/bootstrap.js @@ -0,0 +1,3 @@ +config.module.rules.push({test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff'}); +config.module.rules.push({test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?limit=10000&mimetype=application/octet-stream'}); +config.module.rules.push({test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file-loader'}); diff --git a/kvision-modules/kvision-toast/webpack.config.d/css.js b/kvision-modules/kvision-toast/webpack.config.d/css.js new file mode 100644 index 00000000..5d710d35 --- /dev/null +++ b/kvision-modules/kvision-toast/webpack.config.d/css.js @@ -0,0 +1,2 @@ +config.module.rules.push({ test: /\.css$/, loader: "style-loader!css-loader" }); + diff --git a/kvision-modules/kvision-toast/webpack.config.d/file.js b/kvision-modules/kvision-toast/webpack.config.d/file.js new file mode 100644 index 00000000..653ca21f --- /dev/null +++ b/kvision-modules/kvision-toast/webpack.config.d/file.js @@ -0,0 +1,9 @@ +config.module.rules.push( + { + test: /\.(jpe?g|png|gif|svg)$/i, + loader: 'file-loader', + options: { + esModule: false, + }, + } +); -- cgit