From 147c934819a9084bc38d23a1bb5f678e53d39ab7 Mon Sep 17 00:00:00 2001 From: rnentjes Date: Thu, 24 Feb 2022 15:12:57 +0100 Subject: [PATCH] Fix update & replace options --- build.gradle.kts | 4 ++ .../nl/astraeus/komp/ElementExtentions.kt | 6 ++- .../kotlin/nl/astraeus/komp/HtmlBuilder.kt | 42 ++++++++++--------- .../kotlin/nl/astraeus/komp/Komponent.kt | 3 +- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e290d49..f9c2b2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,6 +68,7 @@ val javadocJar by tasks.registering(Jar::class) { publishing { repositories { mavenLocal() +/* maven { name = "releases" // change to point to your repo, e.g. http://my.org/repo @@ -100,6 +101,7 @@ publishing { password = ossrhPassword } } +*/ } // Configure all publications @@ -132,7 +134,9 @@ publishing { } } } +/* signing { sign(publishing.publications) } +*/ diff --git a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt index 854a64f..340314d 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/ElementExtentions.kt @@ -1,5 +1,3 @@ -@file:OptIn(ExperimentalStdlibApi::class) - package nl.astraeus.komp import org.w3c.dom.Element @@ -129,6 +127,10 @@ internal fun Element.setKompEvent(name: String, event: (Event) -> Unit) { name } + if (Komponent.updateMode.isUpdate) { + getKompEvents()[eventName] = event + } + this.addEventListener(eventName, event) } diff --git a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt index 05c7c5d..98c5ea8 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/HtmlBuilder.kt @@ -51,6 +51,14 @@ private fun ArrayList.currentElement(): Node? { return null } +private fun ArrayList.currentPosition(): ElementIndex? { + return if (this.size < 2) { + null + } else { + this[this.size-2] + } +} + private fun ArrayList.nextElement() { this.lastOrNull()?.let { it.setAttr.clear() @@ -79,7 +87,7 @@ private fun Node.asElement() = this as? HTMLElement class HtmlBuilder( private val komponent: Komponent?, parent: Element, - childIndex: Int = 0, + childIndex: Int = 0 ) : HtmlConsumer { private var currentPosition = arrayListOf() private var inDebug = false @@ -135,6 +143,7 @@ class HtmlBuilder( override fun onTagStart(tag: Tag) { logReplace { "onTagStart, [${tag.tagName}, ${tag.namespace}], currentPosition: $currentPosition" } + currentNode = currentPosition.currentElement() if (currentNode == null) { @@ -169,8 +178,6 @@ class HtmlBuilder( currentPosition.replace(currentNode!!) } - check(currentNode == currentPosition.currentElement()) - currentElement = currentNode as? Element ?: currentElement if (currentNode is Element) { @@ -179,17 +186,17 @@ class HtmlBuilder( root = currentNode as Element } - if (Komponent.updateMode.isReplace) { + if (Komponent.updateMode.isUpdate) { currentElement?.clearKompEvents() } + currentPosition.lastOrNull()?.setAttr?.clear() for (entry in tag.attributesEntries) { currentElement!!.setKompAttribute(entry.key, entry.value) - console.log("onTagStart - set attribute", entry.key) currentPosition.lastOrNull()?.setAttr?.add(entry.key) } - if (tag.namespace != null) { + if (tag.namespace != null && Komponent.updateMode.isReplace) { //logReplace"onTagStart, same node type") (currentNode as? Element)?.innerHTML = "" @@ -219,10 +226,9 @@ class HtmlBuilder( currentElement?.setKompAttribute(attribute, value) if (value == null || value.isEmpty()) { - currentPosition.lastOrNull()?.setAttr?.remove(attribute) + currentPosition.currentPosition()?.setAttr?.remove(attribute) } else { - console.log("onTagAttributeChange - set attribute", attribute) - currentPosition.lastOrNull()?.setAttr?.add(attribute) + currentPosition.currentPosition()?.setAttr?.add(attribute) } } @@ -251,15 +257,8 @@ class HtmlBuilder( checkTag(tag) } - currentPosition.pop() - - currentNode = currentPosition.currentElement() - currentElement = currentNode as? Element ?: currentElement - if (currentElement != null) { - val setAttrs: Set = currentPosition.lastOrNull()?.setAttr ?: setOf() - - console.log("onTagEnd - set attr:", setAttrs.joinToString(",")) + val setAttrs: Set = currentPosition.currentPosition()?.setAttr ?: setOf() // remove attributes that where not set val element = currentElement @@ -273,7 +272,6 @@ class HtmlBuilder( !setAttrs.contains(attr) && attr != "style" ) { - console.log("remove attr", attr) if (element is HTMLInputElement) { when (attr) { "checked" -> { @@ -295,6 +293,11 @@ class HtmlBuilder( } } + currentPosition.pop() + + currentNode = currentPosition.currentElement() + currentElement = currentNode as? Element ?: currentElement + currentPosition.nextElement() currentElement = currentElement?.parentElement as? HTMLElement @@ -398,7 +401,6 @@ class HtmlBuilder( exceptionThrown = true if (exception !is KomponentException) { - console.log("onTagError", tag, exception) val position = mutableListOf() var ce = currentElement while (ce != null) { @@ -441,7 +443,7 @@ class HtmlBuilder( companion object { fun create(content: HtmlBuilder.() -> Unit): Element { val container = document.createElement("div") as HTMLElement - val consumer = HtmlBuilder(null, container, 0) + val consumer = HtmlBuilder(null, container) content.invoke(consumer) return consumer.root ?: error("No root element found after render!") } diff --git a/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt b/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt index 15e04d1..f52bf4c 100644 --- a/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt +++ b/src/jsMain/kotlin/nl/astraeus/komp/Komponent.kt @@ -146,7 +146,6 @@ abstract class Komponent { } } val builder = HtmlBuilder(this, parent, childIndex) - builder.root = null try { currentKomponent = this @@ -186,7 +185,7 @@ abstract class Komponent { var logRenderEvent = false var logReplaceEvent = false var enableAssertions = false - var updateMode = UpdateMode.REPLACE + var updateMode = UpdateMode.UPDATE var unsafeMode = UnsafeMode.UNSAFE_DISABLED fun create(parent: HTMLElement, component: Komponent) {