From 2011c50d03e4b09d968707a142e57891a3d8c5fe Mon Sep 17 00:00:00 2001 From: Robert Jaros Date: Thu, 4 Apr 2019 12:41:48 +0200 Subject: Fix modals rendering. --- src/main/kotlin/pl/treksoft/kvision/core/Style.kt | 9 +++---- src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt | 28 ++++++++++++++++------ src/main/kotlin/pl/treksoft/kvision/panel/Root.kt | 25 ++++++++++++------- 3 files changed, 40 insertions(+), 22 deletions(-) (limited to 'src/main/kotlin/pl/treksoft/kvision') diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Style.kt b/src/main/kotlin/pl/treksoft/kvision/core/Style.kt index 62154f77..549aa44c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Style.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Style.kt @@ -25,7 +25,6 @@ import com.github.snabbdom.VNode import com.github.snabbdom.h import org.w3c.dom.Node import pl.treksoft.jquery.JQuery -import pl.treksoft.jquery.jQuery import pl.treksoft.kvision.panel.Root /** @@ -66,8 +65,6 @@ open class Style(className: String? = null, parentStyle: Style? = null, init: (S if (oldField != field) refresh() } - private var vnode: VNode? = null - override fun addCssClass(css: String): Component { return this } @@ -112,15 +109,15 @@ open class Style(className: String? = null, parentStyle: Style? = null, init: (S } override fun getElement(): Node? { - return this.vnode?.elm + return null } override fun getElementJQuery(): JQuery? { - return getElement()?.let { jQuery(it) } + return null } override fun getElementJQueryD(): dynamic { - return getElement()?.let { jQuery(it).asDynamic() } + return null } override fun clearParent(): Component { diff --git a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt index a0456e7e..5f911539 100644 --- a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt +++ b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt @@ -23,6 +23,7 @@ package pl.treksoft.kvision.modal import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Component +import pl.treksoft.kvision.core.Container import pl.treksoft.kvision.core.StringBoolPair import pl.treksoft.kvision.core.StringPair import pl.treksoft.kvision.core.Widget @@ -60,6 +61,8 @@ open class Modal( classes: Set = setOf(), init: (Modal.() -> Unit)? = null ) : SimplePanel(classes) { + override var parent: Container? = Root.getFirstRoot() + /** * Window caption text. */ @@ -125,13 +128,7 @@ open class Modal( content.add(header) content.add(body) content.add(footer) - val root = Root.getLastRoot() - if (root != null) { - @Suppress("LeakingThis") - root.addModal(this) - } else { - println("At least one Root object is required to create a modal!") - } + modals.add(this) @Suppress("LeakingThis") init?.invoke(this) } @@ -258,6 +255,23 @@ open class Modal( private fun hideInternal() { getElementJQueryD()?.modal("hide") } + + override fun clearParent(): Widget { + this.parent = null + return this + } + + override fun getRoot(): Root? { + return this.parent?.getRoot() + } + + override fun dispose() { + modals.remove(this) + } + + companion object { + internal var modals = mutableListOf() + } } /** diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt index 16d3a0f8..c17ea1a4 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt @@ -46,13 +46,12 @@ import pl.treksoft.kvision.utils.snOpt */ @Suppress("TooManyFunctions") class Root(id: String, private val fixed: Boolean = false, init: (Root.() -> Unit)? = null) : SimplePanel() { - private val modals: MutableList = mutableListOf() private val contextMenus: MutableList = mutableListOf() private var rootVnode: VNode = renderVNode() internal var renderDisabled = false - private val isFirstRoot = roots.isEmpty() + val isFirstRoot = roots.isEmpty() init { rootVnode = KVManager.patch(id, this.renderVNode()) @@ -60,6 +59,7 @@ class Root(id: String, private val fixed: Boolean = false, init: (Root.() -> Uni roots.add(this) if (isFirstRoot) { Style.styles.forEach { it.parent = this } + Modal.modals.forEach { it.parent = this } } @Suppress("LeakingThis") init?.invoke(this) @@ -75,12 +75,6 @@ class Root(id: String, private val fixed: Boolean = false, init: (Root.() -> Uni } } - internal fun addModal(modal: Modal) { - modals.add(modal) - modal.parent = this - refresh() - } - internal fun addContextMenu(contextMenu: ContextMenu) { contextMenus.add(contextMenu) contextMenu.parent = this @@ -108,7 +102,11 @@ class Root(id: String, private val fixed: Boolean = false, init: (Root.() -> Uni } private fun modalsVNodes(): Array { - return modals.filter { it.visible }.map { it.renderVNode() }.toTypedArray() + return if (isFirstRoot) { + Modal.modals.filter { it.visible }.map { it.renderVNode() }.toTypedArray() + } else { + arrayOf() + } } private fun contextMenusVNodes(): Array { @@ -141,10 +139,19 @@ class Root(id: String, private val fixed: Boolean = false, init: (Root.() -> Uni roots.remove(this) if (isFirstRoot) { Style.styles.clear() + Modal.modals.clear() } } companion object { + /** + * @suppress internal function + */ + fun shutdown() { + roots.forEach { it.dispose() } + roots.clear() + } + internal val roots: MutableList = mutableListOf() internal fun getFirstRoot(): Root? { -- cgit