One object/class, version 0.0.4
This commit is contained in:
@@ -1,50 +0,0 @@
|
||||
package nl.astraeus.komp
|
||||
|
||||
import kotlinx.html.DIV
|
||||
import kotlinx.html.TagConsumer
|
||||
import kotlinx.html.dom.create
|
||||
import org.w3c.dom.HTMLElement
|
||||
import kotlin.browser.document
|
||||
|
||||
fun DIV.include(component: HtmlComponent) {
|
||||
val result = component.render(this.consumer as TagConsumer<HTMLElement>)
|
||||
|
||||
component.element = result
|
||||
Komp.define(result, component)
|
||||
}
|
||||
|
||||
abstract class HtmlComponent {
|
||||
var element: HTMLElement? = null
|
||||
var rendered = false
|
||||
|
||||
fun create(): HTMLElement {
|
||||
var elem =element
|
||||
if (elem != null) {
|
||||
Komp.remove(elem)
|
||||
}
|
||||
|
||||
elem = render(document.create)
|
||||
rendered = true
|
||||
|
||||
Komp.define(elem, this)
|
||||
|
||||
this.element = elem
|
||||
|
||||
return elem
|
||||
}
|
||||
|
||||
abstract fun render(consumer: TagConsumer<HTMLElement>): HTMLElement
|
||||
|
||||
open fun refresh() {
|
||||
if (rendered) {
|
||||
Komp.refresh(element)
|
||||
} else {
|
||||
update()
|
||||
}
|
||||
}
|
||||
|
||||
open fun update() {
|
||||
Komp.refresh(element)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
package nl.astraeus.komp
|
||||
|
||||
import org.w3c.dom.HTMLElement
|
||||
import kotlin.collections.component1
|
||||
import kotlin.collections.component2
|
||||
import kotlin.collections.set
|
||||
|
||||
/**
|
||||
* User: rnentjes
|
||||
* Date: 29-3-17
|
||||
* Time: 15:46
|
||||
*/
|
||||
|
||||
object Komp {
|
||||
|
||||
private val elements: MutableMap<HTMLElement, HtmlComponent> = HashMap()
|
||||
private val elementList: MutableList<HtmlComponent> = ArrayList()
|
||||
|
||||
fun define(element: HTMLElement, component: HtmlComponent) {
|
||||
elements[element] = component
|
||||
elementList.add(component)
|
||||
}
|
||||
|
||||
fun create(parent: HTMLElement, component: HtmlComponent, insertAsFirst: Boolean = false) {
|
||||
val element = component.create()
|
||||
|
||||
if (insertAsFirst && parent.childElementCount > 0) {
|
||||
parent.insertBefore(element, parent.firstChild)
|
||||
} else {
|
||||
parent.appendChild(element)
|
||||
}
|
||||
|
||||
elements[element] = component
|
||||
elementList.add(component)
|
||||
}
|
||||
|
||||
fun remove(element: HTMLElement) {
|
||||
val component = elements[element]
|
||||
|
||||
elements.remove(element)
|
||||
elementList.remove(component)
|
||||
}
|
||||
|
||||
@JsName("remove")
|
||||
fun remove(component: HtmlComponent) {
|
||||
for ((key, value) in elements) {
|
||||
if (value == component) {
|
||||
elements.remove(key)
|
||||
}
|
||||
}
|
||||
elementList.remove(component)
|
||||
}
|
||||
|
||||
fun refresh(component: HtmlComponent) {
|
||||
refresh(component.element)
|
||||
}
|
||||
|
||||
fun refresh(element: HTMLElement?) {
|
||||
if (element != null) {
|
||||
val comp = elements[element]
|
||||
|
||||
if (element is HTMLElement && comp != null) {
|
||||
val parent = element.parentElement
|
||||
val newElement = comp.create()
|
||||
|
||||
parent?.replaceChild(newElement, element)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
105
src/main/kotlin/nl/astraeus/komp/Komponent.kt
Normal file
105
src/main/kotlin/nl/astraeus/komp/Komponent.kt
Normal file
@@ -0,0 +1,105 @@
|
||||
package nl.astraeus.komp
|
||||
|
||||
import kotlinx.html.DIV
|
||||
import kotlinx.html.TagConsumer
|
||||
import kotlinx.html.dom.create
|
||||
import org.w3c.dom.HTMLElement
|
||||
import kotlin.browser.document
|
||||
|
||||
fun DIV.include(component: Komponent) {
|
||||
val result = component.render(this.consumer as TagConsumer<HTMLElement>)
|
||||
|
||||
component.element = result
|
||||
Komponent.define(result, component)
|
||||
}
|
||||
|
||||
abstract class Komponent {
|
||||
var element: HTMLElement? = null
|
||||
var rendered = false
|
||||
|
||||
fun create(): HTMLElement {
|
||||
var elem =element
|
||||
if (elem != null) {
|
||||
remove(elem)
|
||||
}
|
||||
|
||||
elem = render(document.create)
|
||||
rendered = true
|
||||
|
||||
define(elem, this)
|
||||
|
||||
this.element = elem
|
||||
|
||||
return elem
|
||||
}
|
||||
|
||||
abstract fun render(consumer: TagConsumer<HTMLElement>): HTMLElement
|
||||
|
||||
open fun refresh() {
|
||||
if (rendered) {
|
||||
refresh(element)
|
||||
} else {
|
||||
update()
|
||||
}
|
||||
}
|
||||
|
||||
open fun update() {
|
||||
refresh(element)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
private val elements: MutableMap<HTMLElement, Komponent> = HashMap()
|
||||
private val elementList: MutableList<Komponent> = ArrayList()
|
||||
|
||||
fun define(element: HTMLElement, component: Komponent) {
|
||||
elements[element] = component
|
||||
elementList.add(component)
|
||||
}
|
||||
|
||||
fun create(parent: HTMLElement, component: Komponent, insertAsFirst: Boolean = false) {
|
||||
val element = component.create()
|
||||
|
||||
if (insertAsFirst && parent.childElementCount > 0) {
|
||||
parent.insertBefore(element, parent.firstChild)
|
||||
} else {
|
||||
parent.appendChild(element)
|
||||
}
|
||||
|
||||
elements[element] = component
|
||||
elementList.add(component)
|
||||
}
|
||||
|
||||
fun remove(element: HTMLElement) {
|
||||
val component = elements[element]
|
||||
|
||||
elements.remove(element)
|
||||
elementList.remove(component)
|
||||
}
|
||||
|
||||
@JsName("remove")
|
||||
fun remove(component: Komponent) {
|
||||
for ((key, value) in elements) {
|
||||
if (value == component) {
|
||||
elements.remove(key)
|
||||
}
|
||||
}
|
||||
elementList.remove(component)
|
||||
}
|
||||
|
||||
fun refresh(component: Komponent) {
|
||||
refresh(component.element)
|
||||
}
|
||||
|
||||
fun refresh(element: HTMLElement?) {
|
||||
if (element != null) {
|
||||
elements[element]?.let {
|
||||
val parent = element.parentElement
|
||||
val newElement = it.create()
|
||||
|
||||
parent?.replaceChild(newElement, element)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user