From 70d2f14d4a34f841a3161482eec5d355cbd755f6 Mon Sep 17 00:00:00 2001 From: Robert Jaros Date: Sun, 4 Feb 2018 21:49:23 +0100 Subject: Refactoring packages layout --- .../kotlin/pl/treksoft/kvision/ApplicationBase.kt | 23 ----- src/main/kotlin/pl/treksoft/kvision/HMR.kt | 34 ------- src/main/kotlin/pl/treksoft/kvision/KVManager.kt | 84 ++++++++++++++++ .../kotlin/pl/treksoft/kvision/core/Component.kt | 2 +- src/main/kotlin/pl/treksoft/kvision/core/Css.kt | 4 - .../kotlin/pl/treksoft/kvision/core/KVManager.kt | 81 ---------------- src/main/kotlin/pl/treksoft/kvision/core/Root.kt | 60 ------------ .../pl/treksoft/kvision/core/StyledComponent.kt | 1 - src/main/kotlin/pl/treksoft/kvision/core/Types.kt | 9 ++ src/main/kotlin/pl/treksoft/kvision/core/Widget.kt | 18 ++-- .../pl/treksoft/kvision/dropdown/DropDown.kt | 6 +- .../kotlin/pl/treksoft/kvision/form/FieldLabel.kt | 2 +- .../kotlin/pl/treksoft/kvision/form/FormPanel.kt | 2 +- .../pl/treksoft/kvision/form/check/CheckBox.kt | 4 +- .../pl/treksoft/kvision/form/check/CheckInput.kt | 4 +- .../kotlin/pl/treksoft/kvision/form/check/Radio.kt | 4 +- .../pl/treksoft/kvision/form/check/RadioGroup.kt | 4 +- .../pl/treksoft/kvision/form/select/AjaxOptions.kt | 6 +- .../pl/treksoft/kvision/form/select/Select.kt | 6 +- .../pl/treksoft/kvision/form/select/SelectInput.kt | 8 +- .../treksoft/kvision/form/select/SelectOptGroup.kt | 2 +- .../treksoft/kvision/form/select/SelectOption.kt | 2 +- .../pl/treksoft/kvision/form/spinner/Spinner.kt | 4 +- .../treksoft/kvision/form/spinner/SpinnerInput.kt | 6 +- .../pl/treksoft/kvision/form/text/AbstractText.kt | 4 +- .../kvision/form/text/AbstractTextInput.kt | 4 +- .../pl/treksoft/kvision/form/text/RichTextInput.kt | 2 +- .../pl/treksoft/kvision/form/text/TextAreaInput.kt | 2 +- .../pl/treksoft/kvision/form/text/TextInput.kt | 2 +- .../pl/treksoft/kvision/form/time/DateTime.kt | 4 +- .../pl/treksoft/kvision/form/time/DateTimeInput.kt | 6 +- .../pl/treksoft/kvision/helpers/CloseIcon.kt | 25 ----- .../pl/treksoft/kvision/hmr/ApplicationBase.kt | 23 +++++ src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt | 29 ++++++ src/main/kotlin/pl/treksoft/kvision/html/Button.kt | 4 +- src/main/kotlin/pl/treksoft/kvision/html/Image.kt | 4 +- src/main/kotlin/pl/treksoft/kvision/html/Link.kt | 2 +- src/main/kotlin/pl/treksoft/kvision/html/List.kt | 4 +- src/main/kotlin/pl/treksoft/kvision/html/Tag.kt | 4 +- .../kotlin/pl/treksoft/kvision/modal/CloseIcon.kt | 25 +++++ src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt | 9 +- .../kotlin/pl/treksoft/kvision/panel/FlexPanel.kt | 2 +- .../kotlin/pl/treksoft/kvision/panel/GridPanel.kt | 2 +- src/main/kotlin/pl/treksoft/kvision/panel/Root.kt | 60 ++++++++++++ .../kotlin/pl/treksoft/kvision/panel/SplitPanel.kt | 2 +- .../kotlin/pl/treksoft/kvision/routing/Routing.kt | 13 ++- .../kotlin/pl/treksoft/kvision/snabbdom/Types.kt | 107 --------------------- .../kotlin/pl/treksoft/kvision/utils/Snabbdom.kt | 106 ++++++++++++++++++++ src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt | 2 +- 49 files changed, 417 insertions(+), 406 deletions(-) delete mode 100644 src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/HMR.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/KVManager.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/core/Root.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/core/Types.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/panel/Root.kt delete mode 100644 src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt create mode 100644 src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt (limited to 'src/main/kotlin') diff --git a/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt b/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt deleted file mode 100644 index 83ad69ca..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @author Robert Jaros - */ -package pl.treksoft.kvision - -/** - * Base class for applications. - * - * Every application class should inherit from this abstract class. -*/ -abstract class ApplicationBase { -/** - * Starting point for an application. - * @param state Initial state between Hot Module Replacement (HMR). -*/ -abstract fun start(state: Map) - -/** - * Ending point for an application. - * @return final state for Hot Module Replacement (HMR). -*/ -abstract fun dispose(): Map -} diff --git a/src/main/kotlin/pl/treksoft/kvision/HMR.kt b/src/main/kotlin/pl/treksoft/kvision/HMR.kt deleted file mode 100644 index 6fb9dfed..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/HMR.kt +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @author Robert Jaros - */ -package pl.treksoft.kvision - -/** - * Helper variable for Hot Module Replacement (HMR). - */ -external val module: Module - -/** - * Helper interface for Hot Module Replacement (HMR). - */ -external interface Module { - val hot: Hot? -} - -/** - * Helper interface for Hot Module Replacement (HMR). - */ -external interface Hot { - val data: dynamic - - fun accept() - fun accept(dependency: String, callback: () -> Unit) - fun accept(dependencies: Array, callback: (updated: Array) -> Unit) - - fun dispose(callback: (data: dynamic) -> Unit) -} - -/** - * External function for loading CommonJS modules. - */ -external fun require(name: String): dynamic diff --git a/src/main/kotlin/pl/treksoft/kvision/KVManager.kt b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt new file mode 100644 index 00000000..5d5c03fa --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt @@ -0,0 +1,84 @@ +/** + * @author Robert Jaros + */ +package pl.treksoft.kvision + +import com.github.snabbdom.Snabbdom +import com.github.snabbdom.VNode +import com.github.snabbdom.attributesModule +import com.github.snabbdom.classModule +import com.github.snabbdom.datasetModule +import com.github.snabbdom.eventListenersModule +import com.github.snabbdom.propsModule +import com.github.snabbdom.styleModule +import kotlin.browser.document +import kotlin.dom.clear + +/** + * @suppress + * External function for loading CommonJS modules. + */ +external fun require(name: String): dynamic + +/** + * Internal singleton object which initializes and configures KVision framework. + */ +internal object KVManager { + internal const val AJAX_REQUEST_DELAY = 300 + internal const val KVNULL = "#kvnull" + + @Suppress("UnsafeCastFromDynamic") + private val bootstrapWebpack = if (js("typeof KV_NO_BOOTSTRAP_CSS !== 'undefined'")) { + require("bootstrap-webpack!./js/bootstrap.config.js") + } else { + require("bootstrap-webpack") + } + private val fontAwesomeWebpack = require("font-awesome-webpack") + private val resizable = require("jquery-resizable-dom") + private val awesomeBootstrapCheckbox = require("awesome-bootstrap-checkbox") + private val bootstrapSelectCss = + require("bootstrap-select/dist/css/bootstrap-select.min.css") + private val bootstrapSelect = require("bootstrap-select") + private val bootstrapSelectI18n = require("./js/bootstrap-select-i18n.min.js") + private val bootstrapSelectAjaxCss = + require("ajax-bootstrap-select/dist/css/ajax-bootstrap-select.min.css") + private val bootstrapSelectAjax = + require("ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min.js") + // private val bootstrapSelectAjaxI18n = +// require("ajax-bootstrap-select/dist/js/locale/ajax-bootstrap-select.pl-PL.min.js") + private val trixCss = require("trix/dist/trix.css") + private val trix = require("trix") + private val bootstrapDateTimePickerCss = + require("bootstrap-datetime-picker/css/bootstrap-datetimepicker.min.css") + private val bootstrapDateTimePicker = + require("bootstrap-datetime-picker/js/bootstrap-datetimepicker.min.js") + private val bootstrapTouchspinCss = + require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css") + private val bootstrapTouchspin = + require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js") + internal val fecha = require("fecha") + + private val sdPatch = Snabbdom.init( + arrayOf( + classModule, attributesModule, propsModule, styleModule, + eventListenersModule, datasetModule + ) + ) + private val sdVirtualize = require("snabbdom-virtualize/strings").default + private val styleCss = require("./css/style.css") + + internal fun patch(id: String, vnode: VNode): VNode { + val container = document.getElementById(id) + container?.clear() + return sdPatch(container, vnode) + } + + internal fun patch(oldVNode: VNode, newVNode: VNode): VNode { + return sdPatch(oldVNode, newVNode) + } + + @Suppress("UnsafeCastFromDynamic") + internal fun virtualize(html: String): VNode { + return sdVirtualize(html) + } +} diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt index bdd254ba..c322892c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt @@ -3,8 +3,8 @@ package pl.treksoft.kvision.core import com.github.snabbdom.VNode import org.w3c.dom.Node import pl.treksoft.jquery.JQuery +import pl.treksoft.kvision.panel.Root -@Suppress("TooManyFunctions") interface Component { var parent: Component? var visible: Boolean diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Css.kt b/src/main/kotlin/pl/treksoft/kvision/core/Css.kt index a5a85531..80860647 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Css.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Css.kt @@ -3,8 +3,6 @@ package pl.treksoft.kvision.core import pl.treksoft.kvision.utils.asString import pl.treksoft.kvision.utils.toHexString -typealias ResString = String - @Suppress("EnumNaming", "EnumEntryName") enum class UNIT(val unit: String) { px("px"), @@ -24,8 +22,6 @@ enum class UNIT(val unit: String) { auto("auto") } -typealias CssSize = Pair - enum class BORDERSTYLE(val borderStyle: String) { NONE("none"), HIDDEN("hidden"), diff --git a/src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt b/src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt deleted file mode 100644 index 7ca0ce26..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt +++ /dev/null @@ -1,81 +0,0 @@ -package pl.treksoft.kvision.core - -import com.github.snabbdom.Snabbdom -import com.github.snabbdom.VNode -import com.github.snabbdom.attributesModule -import com.github.snabbdom.classModule -import com.github.snabbdom.datasetModule -import com.github.snabbdom.eventListenersModule -import com.github.snabbdom.propsModule -import com.github.snabbdom.styleModule -import pl.treksoft.kvision.require -import pl.treksoft.kvision.routing.Routing -import pl.treksoft.kvision.routing.routing -import kotlin.browser.document -import kotlin.dom.clear - -external val kvBootstrap: Boolean? - -object KVManager { - internal const val AJAX_REQUEST_DELAY = 300 - internal const val KVNULL = "#kvnull" - - @Suppress("UnsafeCastFromDynamic") - private val bootstrapWebpack = if (js("typeof KV_NO_BOOTSTRAP_CSS !== 'undefined'")) { - require("bootstrap-webpack!./js/bootstrap.config.js") - } else { - require("bootstrap-webpack") - } - private val fontAwesomeWebpack = require("font-awesome-webpack") - private val resizable = require("jquery-resizable-dom") - private val awesomeBootstrapCheckbox = require("awesome-bootstrap-checkbox") - private val bootstrapSelectCss = require("bootstrap-select/dist/css/bootstrap-select.min.css") - private val bootstrapSelect = require("bootstrap-select") - private val bootstrapSelectI18n = require("./js/bootstrap-select-i18n.min.js") - private val bootstrapSelectAjaxCss = require("ajax-bootstrap-select/dist/css/ajax-bootstrap-select.min.css") - private val bootstrapSelectAjax = require("ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min.js") - // private val bootstrapSelectAjaxI18n = -// require("ajax-bootstrap-select/dist/js/locale/ajax-bootstrap-select.pl-PL.min.js") - private val trixCss = require("trix/dist/trix.css") - private val trix = require("trix") - private val bootstrapDateTimePickerCss = require("bootstrap-datetime-picker/css/bootstrap-datetimepicker.min.css") - private val bootstrapDateTimePicker = require("bootstrap-datetime-picker/js/bootstrap-datetimepicker.min.js") - private val bootstrapTouchspinCss = require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css") - private val bootstrapTouchspin = require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js") - internal val fecha = require("fecha") - - private val sdPatch = Snabbdom.init( - arrayOf( - classModule, attributesModule, propsModule, styleModule, - eventListenersModule, datasetModule - ) - ) - private val sdVirtualize = require("snabbdom-virtualize/strings").default - private val styleCss = require("./css/style.css") - - internal fun patch(id: String, vnode: VNode): VNode { - val container = document.getElementById(id) - container?.clear() - return sdPatch(container, vnode) - } - - internal fun patch(oldVNode: VNode, newVNode: VNode): VNode { - return sdPatch(oldVNode, newVNode) - } - - @Suppress("UnsafeCastFromDynamic") - internal fun virtualize(html: String): VNode { - return sdVirtualize(html) - } - - fun init() { - } - - fun start() { - routing = Routing() - } - - fun shutdown() { - routing.destroy() - } -} diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Root.kt b/src/main/kotlin/pl/treksoft/kvision/core/Root.kt deleted file mode 100644 index 9d968874..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/core/Root.kt +++ /dev/null @@ -1,60 +0,0 @@ -package pl.treksoft.kvision.core - -import com.github.snabbdom.VNode -import pl.treksoft.kvision.modal.Modal -import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair - -class Root(id: String, private val fixed: Boolean = false) : SimplePanel() { - private val modals: MutableList = mutableListOf() - private var rootVnode: VNode = renderVNode() - - internal var renderDisabled = false - - init { - rootVnode = KVManager.patch(id, this.renderVNode()) - this.id = id - roots.add(this) - } - - override fun render(): VNode { - return kvh("div#" + id, childrenVNodes() + modalsVNodes()) - } - - internal fun addModal(modal: Modal) { - modals.add(modal) - modal.parent = this - refresh() - } - - private fun modalsVNodes(): Array { - return modals.filter { it.visible }.map { it.renderVNode() }.toTypedArray() - } - - override fun getSnClass(): List { - val css = if (!fixed) "container-fluid" else "container" - return super.getSnClass() + (css to true) - } - - internal fun reRender(): Root { - if (!renderDisabled) { - rootVnode = KVManager.patch(rootVnode, renderVNode()) - } - return this - } - - override fun getRoot(): Root? { - return this - } - - companion object { - private val roots: MutableList = mutableListOf() - - internal fun getLastRoot(): Root? { - return if (roots.size > 0) - roots[roots.size - 1] - else - null - } - } -} diff --git a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt index b2676929..ed6def5f 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt @@ -1,6 +1,5 @@ package pl.treksoft.kvision.core -import pl.treksoft.kvision.snabbdom.StringPair import pl.treksoft.kvision.utils.asString abstract class StyledComponent : Component { diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Types.kt b/src/main/kotlin/pl/treksoft/kvision/core/Types.kt new file mode 100644 index 00000000..05a4bec7 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/core/Types.kt @@ -0,0 +1,9 @@ +package pl.treksoft.kvision.core + +typealias ResString = String + +typealias StringPair = Pair + +typealias StringBoolPair = Pair + +typealias CssSize = Pair diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt index 4ff7a640..08e67da0 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt @@ -7,15 +7,15 @@ import org.w3c.dom.CustomEventInit import org.w3c.dom.Node import pl.treksoft.jquery.JQuery import pl.treksoft.jquery.jQuery -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.hooks -import pl.treksoft.kvision.snabbdom.on -import pl.treksoft.kvision.snabbdom.snAttrs -import pl.treksoft.kvision.snabbdom.snClasses -import pl.treksoft.kvision.snabbdom.snOpt -import pl.treksoft.kvision.snabbdom.snStyle +import pl.treksoft.kvision.KVManager +import pl.treksoft.kvision.panel.Root +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.utils.hooks +import pl.treksoft.kvision.utils.on +import pl.treksoft.kvision.utils.snAttrs +import pl.treksoft.kvision.utils.snClasses +import pl.treksoft.kvision.utils.snOpt +import pl.treksoft.kvision.utils.snStyle @Suppress("TooManyFunctions", "LargeClass") open class Widget(classes: Set = setOf()) : StyledComponent() { diff --git a/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt b/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt index 587b89cd..2e32ff7c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt +++ b/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt @@ -11,9 +11,9 @@ import pl.treksoft.kvision.html.ListTag import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.utils.obj enum class DD(val type: String) { HEADER("DD#HEADER"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt b/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt index a28245d6..81275070 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt @@ -2,7 +2,7 @@ package pl.treksoft.kvision.form import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair open class FieldLabel( internal val forId: String, text: String? = null, rich: Boolean = false, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt index 6c98244d..4ab94df5 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt @@ -6,7 +6,7 @@ import pl.treksoft.kvision.form.check.Radio import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.core.StringBoolPair import kotlin.js.Json enum class FORMTYPE(val formType: String) { diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt index 6776b8eb..ea41c429 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt @@ -6,8 +6,8 @@ import pl.treksoft.kvision.form.BoolFormControl import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair enum class CHECKBOXSTYLE(val className: String) { DEFAULT("checkbox-default"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt index 7114b2c2..a7d562a2 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt @@ -4,8 +4,8 @@ import com.github.snabbdom.VNode import org.w3c.dom.events.MouseEvent import pl.treksoft.kvision.core.Widget import pl.treksoft.kvision.form.INPUTSIZE -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair enum class CHECKINPUTTYPE(val type: String) { CHECKBOX("checkbox"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt index d7fa502f..ac6df5b1 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt @@ -6,8 +6,8 @@ import pl.treksoft.kvision.form.BoolFormControl import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair enum class RADIOSTYLE(val className: String) { DEFAULT("radio-default"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt index fdf0e6a9..5060b6cb 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt @@ -7,8 +7,8 @@ import pl.treksoft.kvision.form.INPUTSIZE import pl.treksoft.kvision.form.StringFormControl import pl.treksoft.kvision.form.select.Select import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair open class RadioGroup( options: List? = null, value: String? = null, inline: Boolean = false, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt index 9ba13f84..774bb654 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt @@ -1,9 +1,9 @@ package pl.treksoft.kvision.form.select import pl.treksoft.jquery.JQueryXHR -import pl.treksoft.kvision.core.KVManager.AJAX_REQUEST_DELAY -import pl.treksoft.kvision.core.KVManager.KVNULL -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.KVManager.AJAX_REQUEST_DELAY +import pl.treksoft.kvision.KVManager.KVNULL +import pl.treksoft.kvision.utils.obj enum class HttpType(val type: String) { GET("GET"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt index 5f10191f..49259ab1 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt @@ -6,9 +6,9 @@ import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.form.StringFormControl import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair @Suppress("TooManyFunctions") open class Select( diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt index 6830823d..83eca138 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt @@ -3,13 +3,13 @@ package pl.treksoft.kvision.form.select import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.core.CssSize -import pl.treksoft.kvision.core.KVManager.KVNULL +import pl.treksoft.kvision.KVManager.KVNULL import pl.treksoft.kvision.form.INPUTSIZE import pl.treksoft.kvision.html.BUTTONSTYLE import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.utils.obj import pl.treksoft.kvision.utils.asString enum class SELECTWIDTHTYPE(val value: String) { diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt index cfd2be19..391ee6a3 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt @@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.select import com.github.snabbdom.VNode import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair open class SelectOptGroup( label: String, options: List? = null, maxOptions: Int? = null, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt index 020d8f4b..f5ea25cd 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt @@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.select import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Widget -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair open class SelectOption( value: String? = null, label: String? = null, subtext: String? = null, icon: String? = null, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt b/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt index 5e2c460b..c6b49684 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt @@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.form.NumberFormControl import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair open class Spinner( value: Number? = null, min: Int = 0, max: Int = DEFAULT_MAX, step: Double = DEFAULT_STEP, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt index 139a8ba9..ae064cdb 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt @@ -4,9 +4,9 @@ import com.github.snabbdom.VNode import pl.treksoft.jquery.JQuery import pl.treksoft.kvision.core.Widget import pl.treksoft.kvision.form.INPUTSIZE -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.utils.obj enum class BUTTONSTYPE { NONE, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt index 48b8d201..a3c89514 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt @@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.form.StringFormControl import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair abstract class AbstractText(label: String? = null, rich: Boolean = false) : SimplePanel(setOf("form-group")), StringFormControl { diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt index 85cf6cf7..95a5d98b 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt @@ -3,8 +3,8 @@ package pl.treksoft.kvision.form.text import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Widget import pl.treksoft.kvision.form.INPUTSIZE -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair abstract class AbstractTextInput( value: String? = null, diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt index c96bc371..9df58266 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt @@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.text import com.github.snabbdom.VNode import pl.treksoft.jquery.jQuery -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair import kotlin.browser.document open class RichTextInput(value: String? = null, classes: Set = setOf()) : diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt index 01b531fb..8efe0318 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt @@ -1,7 +1,7 @@ package pl.treksoft.kvision.form.text import com.github.snabbdom.VNode -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair open class TextAreaInput(cols: Int? = null, rows: Int? = null, value: String? = null, classes: Set = setOf()) : AbstractTextInput(value, classes + "form-control") { diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt index d735c82e..bd945590 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt @@ -1,7 +1,7 @@ package pl.treksoft.kvision.form.text import com.github.snabbdom.VNode -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair enum class TEXTINPUTTYPE(val type: String) { TEXT("text"), diff --git a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt index db9fdeb1..1750c1bd 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt @@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.DateFormControl import pl.treksoft.kvision.form.FieldLabel import pl.treksoft.kvision.form.HelpBlock import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.SnOn -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.utils.SnOn +import pl.treksoft.kvision.core.StringBoolPair import kotlin.js.Date open class DateTime( diff --git a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt index a7aa758b..cac9fbda 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt @@ -3,9 +3,9 @@ package pl.treksoft.kvision.form.time import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Widget import pl.treksoft.kvision.form.INPUTSIZE -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.utils.obj import pl.treksoft.kvision.utils.toDateF import pl.treksoft.kvision.utils.toStringF import kotlin.js.Date diff --git a/src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt b/src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt deleted file mode 100644 index b5f1a642..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt +++ /dev/null @@ -1,25 +0,0 @@ -package pl.treksoft.kvision.helpers - -import com.github.snabbdom.VNode -import pl.treksoft.kvision.core.KVManager -import pl.treksoft.kvision.core.Widget -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair - -open class CloseIcon(classes: Set = setOf()) : Widget(classes) { - - override fun render(): VNode { - return kvh("button", arrayOf(KVManager.virtualize(""))) - } - - override fun getSnClass(): List { - val cl = super.getSnClass().toMutableList() - cl.add("close" to true) - return cl - } - - override fun getSnAttrs(): List { - return super.getSnAttrs() + listOf("type" to "button", "aria-label" to "Close") - } - -} diff --git a/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt b/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt new file mode 100644 index 00000000..ceea0fbc --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt @@ -0,0 +1,23 @@ +/** + * @author Robert Jaros + */ +package pl.treksoft.kvision.hmr + +/** + * Base class for applications. + * + * Base class for applications supporting Hot Module Replacement (HMR). + */ +abstract class ApplicationBase { + /** + * Starting point for an application. + * @param state Initial state between Hot Module Replacement (HMR). + */ + abstract fun start(state: Map) + + /** + * Ending point for an application. + * @return final state for Hot Module Replacement (HMR). + */ + abstract fun dispose(): Map +} diff --git a/src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt b/src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt new file mode 100644 index 00000000..59b6fe00 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt @@ -0,0 +1,29 @@ +/** + * @author Robert Jaros + */ +package pl.treksoft.kvision.hmr + +/** + * Helper variable for Hot Module Replacement (HMR). + */ +external val module: Module + +/** + * Helper interface for Hot Module Replacement (HMR). + */ +external interface Module { + val hot: Hot? +} + +/** + * Helper interface for Hot Module Replacement (HMR). + */ +external interface Hot { + val data: dynamic + + fun accept() + fun accept(dependency: String, callback: () -> Unit) + fun accept(dependencies: Array, callback: (updated: Array) -> Unit) + + fun dispose(callback: (data: dynamic) -> Unit) +} diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Button.kt b/src/main/kotlin/pl/treksoft/kvision/html/Button.kt index 4e8f7b3e..bb48558f 100644 --- a/src/main/kotlin/pl/treksoft/kvision/html/Button.kt +++ b/src/main/kotlin/pl/treksoft/kvision/html/Button.kt @@ -4,8 +4,8 @@ import com.github.snabbdom.VNode import org.w3c.dom.events.MouseEvent import pl.treksoft.kvision.core.ResString import pl.treksoft.kvision.core.Widget -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair enum class BUTTONSTYLE(val className: String) { DEFAULT("btn-default"), diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Image.kt b/src/main/kotlin/pl/treksoft/kvision/html/Image.kt index 913735ef..38b8825a 100644 --- a/src/main/kotlin/pl/treksoft/kvision/html/Image.kt +++ b/src/main/kotlin/pl/treksoft/kvision/html/Image.kt @@ -3,8 +3,8 @@ package pl.treksoft.kvision.html import com.github.snabbdom.VNode import pl.treksoft.kvision.core.ResString import pl.treksoft.kvision.core.Widget -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair enum class IMAGESHAPE(val className: String) { ROUNDED("img-rounded"), diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Link.kt b/src/main/kotlin/pl/treksoft/kvision/html/Link.kt index c61e8a79..83f03676 100644 --- a/src/main/kotlin/pl/treksoft/kvision/html/Link.kt +++ b/src/main/kotlin/pl/treksoft/kvision/html/Link.kt @@ -3,7 +3,7 @@ package pl.treksoft.kvision.html import com.github.snabbdom.VNode import pl.treksoft.kvision.core.ResString import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair open class Link( label: String, url: String, icon: String? = null, image: ResString? = null, diff --git a/src/main/kotlin/pl/treksoft/kvision/html/List.kt b/src/main/kotlin/pl/treksoft/kvision/html/List.kt index eb006a33..c4aed749 100644 --- a/src/main/kotlin/pl/treksoft/kvision/html/List.kt +++ b/src/main/kotlin/pl/treksoft/kvision/html/List.kt @@ -2,9 +2,9 @@ package pl.treksoft.kvision.html import com.github.snabbdom.VNode import com.github.snabbdom.h -import pl.treksoft.kvision.core.KVManager +import pl.treksoft.kvision.KVManager import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.core.StringBoolPair enum class LIST(val tagName: String) { UL("ul"), diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt b/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt index d94505a8..11c935b2 100644 --- a/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt +++ b/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt @@ -1,9 +1,9 @@ package pl.treksoft.kvision.html import com.github.snabbdom.VNode -import pl.treksoft.kvision.core.KVManager +import pl.treksoft.kvision.KVManager import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair +import pl.treksoft.kvision.core.StringBoolPair @Suppress("EnumNaming") enum class TAG(val tagName: String) { diff --git a/src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt b/src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt new file mode 100644 index 00000000..8751b03c --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt @@ -0,0 +1,25 @@ +package pl.treksoft.kvision.modal + +import com.github.snabbdom.VNode +import pl.treksoft.kvision.KVManager +import pl.treksoft.kvision.core.Widget +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair + +open class CloseIcon(classes: Set = setOf()) : Widget(classes) { + + override fun render(): VNode { + return kvh("button", arrayOf(KVManager.virtualize(""))) + } + + override fun getSnClass(): List { + val cl = super.getSnClass().toMutableList() + cl.add("close" to true) + return cl + } + + override fun getSnAttrs(): List { + return super.getSnAttrs() + listOf("type" to "button", "aria-label" to "Close") + } + +} diff --git a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt index 2c83077a..b5c985b7 100644 --- a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt +++ b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt @@ -2,16 +2,15 @@ package pl.treksoft.kvision.modal import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Component -import pl.treksoft.kvision.core.Root import pl.treksoft.kvision.core.Widget -import pl.treksoft.kvision.helpers.CloseIcon import pl.treksoft.kvision.html.Button import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag +import pl.treksoft.kvision.panel.Root import pl.treksoft.kvision.panel.SimplePanel -import pl.treksoft.kvision.snabbdom.StringBoolPair -import pl.treksoft.kvision.snabbdom.StringPair -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.utils.obj enum class MODALSIZE(val className: String) { LARGE("modal-lg"), diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt index 66f2d422..ad3522ea 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt @@ -3,7 +3,7 @@ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.core.StyledComponent import pl.treksoft.kvision.core.WidgetWrapper -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair import pl.treksoft.kvision.utils.px enum class FLEXDIR(val dir: String) { diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt index 3b226102..549f7631 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt @@ -2,7 +2,7 @@ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.core.WidgetWrapper -import pl.treksoft.kvision.snabbdom.StringPair +import pl.treksoft.kvision.core.StringPair enum class GRIDJUSTIFY(val justify: String) { START("start"), diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt new file mode 100644 index 00000000..88634bea --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt @@ -0,0 +1,60 @@ +package pl.treksoft.kvision.panel + +import com.github.snabbdom.VNode +import pl.treksoft.kvision.KVManager +import pl.treksoft.kvision.modal.Modal +import pl.treksoft.kvision.core.StringBoolPair + +class Root(id: String, private val fixed: Boolean = false) : SimplePanel() { + private val modals: MutableList = mutableListOf() + private var rootVnode: VNode = renderVNode() + + internal var renderDisabled = false + + init { + rootVnode = KVManager.patch(id, this.renderVNode()) + this.id = id + roots.add(this) + } + + override fun render(): VNode { + return kvh("div#" + id, childrenVNodes() + modalsVNodes()) + } + + internal fun addModal(modal: Modal) { + modals.add(modal) + modal.parent = this + refresh() + } + + private fun modalsVNodes(): Array { + return modals.filter { it.visible }.map { it.renderVNode() }.toTypedArray() + } + + override fun getSnClass(): List { + val css = if (!fixed) "container-fluid" else "container" + return super.getSnClass() + (css to true) + } + + internal fun reRender(): Root { + if (!renderDisabled) { + rootVnode = KVManager.patch(rootVnode, renderVNode()) + } + return this + } + + override fun getRoot(): Root? { + return this + } + + companion object { + private val roots: MutableList = mutableListOf() + + internal fun getLastRoot(): Root? { + return if (roots.size > 0) + roots[roots.size - 1] + else + null + } + } +} diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt index 722f60e6..10595a37 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt @@ -7,7 +7,7 @@ import pl.treksoft.kvision.core.StyledComponent import pl.treksoft.kvision.core.UNIT import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag -import pl.treksoft.kvision.snabbdom.obj +import pl.treksoft.kvision.utils.obj enum class DIRECTION(val dir: String) { HORIZONTAL("horizontal"), diff --git a/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt b/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt index fab8643c..4c9aa98d 100644 --- a/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt +++ b/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt @@ -2,6 +2,17 @@ package pl.treksoft.kvision.routing import pl.treksoft.navigo.Navigo -open class Routing : Navigo(null, true, "#!") +open class Routing : Navigo(null, true, "#!") { + + companion object { + fun start() { + routing = Routing() + } + + fun shutdown() { + routing.destroy() + } + } +} var routing = Routing() diff --git a/src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt b/src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt deleted file mode 100644 index 0367633c..00000000 --- a/src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt +++ /dev/null @@ -1,107 +0,0 @@ -package pl.treksoft.kvision.snabbdom - -import com.github.snabbdom.Attrs -import com.github.snabbdom.Classes -import com.github.snabbdom.Hooks -import com.github.snabbdom.On -import com.github.snabbdom.Props -import com.github.snabbdom.VNodeData -import com.github.snabbdom.VNodeStyle -import org.w3c.dom.CustomEvent -import org.w3c.dom.CustomEventInit -import pl.treksoft.jquery.JQueryEventObject -import pl.treksoft.kvision.core.Widget - -external class Object - -fun obj(init: dynamic.() -> Unit): dynamic { - return (Object()).apply(init) -} - -@Suppress("UnsafeCastFromDynamic") -private fun vNodeData(): VNodeData = js("({})") - -interface KvJQueryEventObject : JQueryEventObject { - val clickedIndex: Int -} - -@Suppress("UnsafeCastFromDynamic") -class KvEvent(type: String, eventInitDict: CustomEventInit) : CustomEvent(type, eventInitDict) { - override val detail: KvJQueryEventObject = obj {} -} - -interface BtOn : On { - var showBsDropdown: ((KvEvent) -> kotlin.Unit)? - var shownBsDropdown: ((KvEvent) -> kotlin.Unit)? - var hideBsDropdown: ((KvEvent) -> kotlin.Unit)? - var hiddenBsDropdown: ((KvEvent) -> kotlin.Unit)? - var showBsModal: ((KvEvent) -> kotlin.Unit)? - var shownBsModal: ((KvEvent) -> kotlin.Unit)? - var hideBsModal: ((KvEvent) -> kotlin.Unit)? - var hiddenBsModal: ((KvEvent) -> kotlin.Unit)? - var dragSplitPanel: ((KvEvent) -> kotlin.Unit)? - var dragEndSplitPanel: ((KvEvent) -> kotlin.Unit)? - var showBsSelect: ((KvEvent) -> kotlin.Unit)? - var shownBsSelect: ((KvEvent) -> kotlin.Unit)? - var hideBsSelect: ((KvEvent) -> kotlin.Unit)? - var hiddenBsSelect: ((KvEvent) -> kotlin.Unit)? - var loadedBsSelect: ((KvEvent) -> kotlin.Unit)? - var renderedBsSelect: ((KvEvent) -> kotlin.Unit)? - var refreshedBsSelect: ((KvEvent) -> kotlin.Unit)? - var changedBsSelect: ((KvEvent) -> kotlin.Unit)? - var changeDate: ((KvEvent) -> kotlin.Unit)? - var showBsDateTime: ((KvEvent) -> kotlin.Unit)? - var hideBsDateTime: ((KvEvent) -> kotlin.Unit)? - var onMinBsSpinner: ((KvEvent) -> kotlin.Unit)? - var onMaxBsSpinner: ((KvEvent) -> kotlin.Unit)? - var updateModel: ((KvEvent) -> kotlin.Unit)? -} - -interface SnOn : BtOn { - var self: T -} - -fun snOpt(block: VNodeData.() -> Unit) = (vNodeData()::apply)(block) - -@Suppress("UnsafeCastFromDynamic") -internal fun on(widget: Widget): SnOn { - val obj = js("({})") - obj["self"] = widget - return obj -} - -@Suppress("UnsafeCastFromDynamic") -internal fun hooks(): Hooks { - return js("({})") -} - -typealias StringPair = Pair -typealias StringBoolPair = Pair - -@Suppress("UnsafeCastFromDynamic") -fun snStyle(pairs: List): VNodeStyle { - return obj { - pairs.forEach { (key, value) -> this[key] = value } - } -} - -@Suppress("UnsafeCastFromDynamic") -fun snProps(pairs: List): Props { - return obj { - pairs.forEach { (key, value) -> this[key] = value } - } -} - -@Suppress("UnsafeCastFromDynamic") -fun snClasses(pairs: List): Classes { - return obj { - pairs.forEach { (key, value) -> this[key] = value } - } -} - -@Suppress("UnsafeCastFromDynamic") -fun snAttrs(pairs: List): Attrs { - return obj { - pairs.forEach { (key, value) -> this[key] = value } - } -} diff --git a/src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt b/src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt new file mode 100644 index 00000000..269fa6cb --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt @@ -0,0 +1,106 @@ +package pl.treksoft.kvision.utils + +import com.github.snabbdom.Attrs +import com.github.snabbdom.Classes +import com.github.snabbdom.Hooks +import com.github.snabbdom.On +import com.github.snabbdom.Props +import com.github.snabbdom.VNodeData +import com.github.snabbdom.VNodeStyle +import org.w3c.dom.CustomEvent +import org.w3c.dom.CustomEventInit +import pl.treksoft.jquery.JQueryEventObject +import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.core.Widget + +external class Object + +fun obj(init: dynamic.() -> Unit): dynamic { + return (Object()).apply(init) +} + +@Suppress("UnsafeCastFromDynamic") +private fun vNodeData(): VNodeData = js("({})") + +interface KvJQueryEventObject : JQueryEventObject { + val clickedIndex: Int +} + +@Suppress("UnsafeCastFromDynamic") +class KvEvent(type: String, eventInitDict: CustomEventInit) : CustomEvent(type, eventInitDict) { + override val detail: KvJQueryEventObject = obj {} +} + +interface BtOn : On { + var showBsDropdown: ((KvEvent) -> kotlin.Unit)? + var shownBsDropdown: ((KvEvent) -> kotlin.Unit)? + var hideBsDropdown: ((KvEvent) -> kotlin.Unit)? + var hiddenBsDropdown: ((KvEvent) -> kotlin.Unit)? + var showBsModal: ((KvEvent) -> kotlin.Unit)? + var shownBsModal: ((KvEvent) -> kotlin.Unit)? + var hideBsModal: ((KvEvent) -> kotlin.Unit)? + var hiddenBsModal: ((KvEvent) -> kotlin.Unit)? + var dragSplitPanel: ((KvEvent) -> kotlin.Unit)? + var dragEndSplitPanel: ((KvEvent) -> kotlin.Unit)? + var showBsSelect: ((KvEvent) -> kotlin.Unit)? + var shownBsSelect: ((KvEvent) -> kotlin.Unit)? + var hideBsSelect: ((KvEvent) -> kotlin.Unit)? + var hiddenBsSelect: ((KvEvent) -> kotlin.Unit)? + var loadedBsSelect: ((KvEvent) -> kotlin.Unit)? + var renderedBsSelect: ((KvEvent) -> kotlin.Unit)? + var refreshedBsSelect: ((KvEvent) -> kotlin.Unit)? + var changedBsSelect: ((KvEvent) -> kotlin.Unit)? + var changeDate: ((KvEvent) -> kotlin.Unit)? + var showBsDateTime: ((KvEvent) -> kotlin.Unit)? + var hideBsDateTime: ((KvEvent) -> kotlin.Unit)? + var onMinBsSpinner: ((KvEvent) -> kotlin.Unit)? + var onMaxBsSpinner: ((KvEvent) -> kotlin.Unit)? + var updateModel: ((KvEvent) -> kotlin.Unit)? +} + +interface SnOn : BtOn { + var self: T +} + +fun snOpt(block: VNodeData.() -> Unit) = (vNodeData()::apply)(block) + +@Suppress("UnsafeCastFromDynamic") +internal fun on(widget: Widget): SnOn { + val obj = js("({})") + obj["self"] = widget + return obj +} + +@Suppress("UnsafeCastFromDynamic") +internal fun hooks(): Hooks { + return js("({})") +} + +@Suppress("UnsafeCastFromDynamic") +fun snStyle(pairs: List): VNodeStyle { + return obj { + pairs.forEach { (key, value) -> this[key] = value } + } +} + +@Suppress("UnsafeCastFromDynamic") +fun snProps(pairs: List): Props { + return obj { + pairs.forEach { (key, value) -> this[key] = value } + } +} + +@Suppress("UnsafeCastFromDynamic") +fun snClasses(pairs: List): Classes { + return obj { + pairs.forEach { (key, value) -> this[key] = value } + } +} + +@Suppress("UnsafeCastFromDynamic") +fun snAttrs(pairs: List): Attrs { + return obj { + pairs.forEach { (key, value) -> this[key] = value } + } +} diff --git a/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt b/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt index 80a7c482..7ba01135 100644 --- a/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt +++ b/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt @@ -2,8 +2,8 @@ package pl.treksoft.kvision.utils +import pl.treksoft.kvision.KVManager import pl.treksoft.kvision.core.CssSize -import pl.treksoft.kvision.core.KVManager import pl.treksoft.kvision.core.UNIT import kotlin.js.Date -- cgit