diff options
| author | Robbie Cronin <robert.cronin@uqconnect.edu.au> | 2019-06-21 13:17:30 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-21 13:17:30 +0800 |
| commit | 2f8e0060308b0f5b1eeac9541600bfed3ad5acc9 (patch) | |
| tree | 80d40364c5f5957da8c82578dd1152adac06912e /src | |
| parent | 9038555f9e46a32a0a725112304e64cdd408bf8e (diff) | |
| parent | d9f1a90c772719d14540eb2bf7bc3b8384fa7a72 (diff) | |
| download | kvision-2f8e0060308b0f5b1eeac9541600bfed3ad5acc9.tar.gz kvision-2f8e0060308b0f5b1eeac9541600bfed3ad5acc9.tar.bz2 kvision-2f8e0060308b0f5b1eeac9541600bfed3ad5acc9.zip | |
Merge pull request #1 from rjaros/master
merge
Diffstat (limited to 'src')
82 files changed, 808 insertions, 192 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/KVManager.kt b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt index faa0b77c..d1a4a8be 100644 --- a/src/main/kotlin/pl/treksoft/kvision/KVManager.kt +++ b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt @@ -29,6 +29,7 @@ import com.github.snabbdom.datasetModule import com.github.snabbdom.eventListenersModule import com.github.snabbdom.propsModule import com.github.snabbdom.styleModule +import org.w3c.dom.HTMLElement import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.utils.isIE11 import kotlin.browser.document @@ -72,6 +73,10 @@ internal object KVManager { return sdPatch(container, vnode) } + internal fun patch(element: HTMLElement, vnode: VNode): VNode { + return sdPatch(element, vnode) + } + internal fun patch(oldVNode: VNode, newVNode: VNode): VNode { return sdPatch(oldVNode, newVNode) } diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt index 411eae8d..fe5569d4 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt @@ -97,6 +97,26 @@ interface Component { fun removeSurroundingCssClass(css: Style): Component /** + * Returns the value of an additional attribute. + * @param name the name of the attribute + * @return the value of the attribute + */ + fun getAttribute(name: String): String? + + /** + * Sets the value of additional attribute. + * @param name the name of the attribute + * @param value the value of the attribute + */ + fun setAttribute(name: String, value: String): Component + + /** + * Removes the value of additional attribute. + * @param name the name of the attribute + */ + fun removeAttribute(name: String): Component + + /** * @suppress * Internal function * Renders current component as a Snabbdom vnode. diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Style.kt b/src/main/kotlin/pl/treksoft/kvision/core/Style.kt index 282d2e7e..ff91c429 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Style.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Style.kt @@ -21,11 +21,6 @@ */ package pl.treksoft.kvision.core -import com.github.snabbdom.VNode -import com.github.snabbdom.h -import org.w3c.dom.Node -import pl.treksoft.jquery.JQuery -import pl.treksoft.kvision.panel.Root import kotlin.reflect.KProperty /** @@ -41,8 +36,6 @@ open class Style(className: String? = null, parentStyle: Style? = null, init: (S StyledComponent() { private val propertyValues: MutableMap<String, Any?> = mutableMapOf() - override var parent: Container? = Root.getFirstRoot() - private val newClassName: String = if (parentStyle == null) { className ?: "kv_styleclass_${counter++}" } else { @@ -55,86 +48,19 @@ open class Style(className: String? = null, parentStyle: Style? = null, init: (S var className: String by refreshOnUpdate(newClassName) init { + @Suppress("LeakingThis") styles.add(this) @Suppress("LeakingThis") init?.invoke(this) } - override var visible: Boolean = true - set(value) { - val oldField = field - field = value - if (oldField != field) refresh() - } - - override fun addCssClass(css: String): Component { - return this - } - - override fun removeCssClass(css: String): Component { - return this - } - - override fun addSurroundingCssClass(css: String): Component { - return this - } - - override fun removeSurroundingCssClass(css: String): Component { - return this - } - - override fun addCssClass(css: Style): Component { - return this - } - - override fun removeCssClass(css: Style): Component { - return this - } - - override fun addSurroundingCssClass(css: Style): Component { - return this - } - - override fun removeSurroundingCssClass(css: Style): Component { - return this - } - - override fun renderVNode(): VNode { - return h("style", arrayOf(generateStyle())) - } - internal fun generateStyle(): String { - val styles = getSnStyle() + val styles = getSnStyleInternal() return ".$className {\n" + styles.joinToString("\n") { "${it.first}: ${it.second};" } + "\n}" } - override fun getElement(): Node? { - return null - } - - override fun getElementJQuery(): JQuery? { - return null - } - - override fun getElementJQueryD(): dynamic { - return null - } - - override fun clearParent(): Component { - this.parent = null - return this - } - - override fun getRoot(): Root? { - return this.parent?.getRoot() - } - - override fun dispose() { - styles.remove(this) - } - protected fun <T> refreshOnUpdate(refreshFunction: ((T) -> Unit) = { this.refresh() }) = RefreshDelegateProvider<T>(null, refreshFunction) diff --git a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt index aa3f26bb..d9fa63fc 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt @@ -29,7 +29,7 @@ import kotlin.reflect.KProperty * Base class for components supporting CSS styling. */ @Suppress("LargeClass") -abstract class StyledComponent : Component { +abstract class StyledComponent { private val propertyValues: MutableMap<String, Any?> = mutableMapOf() /** diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt index 3388a011..fbcd89da 100644 --- a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt +++ b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt @@ -53,11 +53,12 @@ import kotlin.reflect.KProperty * @param classes Set of CSS class names */ @Suppress("TooManyFunctions", "LargeClass") -open class Widget(classes: Set<String> = setOf()) : StyledComponent() { +open class Widget(classes: Set<String> = setOf()) : StyledComponent(), Component { private val propertyValues: MutableMap<String, Any?> = mutableMapOf() internal val classes = classes.toMutableSet() internal val surroundingClasses: MutableSet<String> = mutableSetOf() + internal val attributes: MutableMap<String, String> = mutableMapOf() internal val internalListeners = mutableListOf<SnOn<Widget>.() -> Unit>() internal val listeners = mutableListOf<SnOn<Widget>.() -> Unit>() @@ -243,6 +244,9 @@ open class Widget(classes: Set<String> = setOf()) : StyledComponent() { if (draggable == true) { snattrs.add("draggable" to "true") } + if (attributes.isNotEmpty()) { + snattrs += attributes.toList() + } return snattrs } @@ -565,6 +569,22 @@ open class Widget(classes: Set<String> = setOf()) : StyledComponent() { return removeSurroundingCssClass(css.className) } + override fun getAttribute(name: String): String? { + return this.attributes[name] + } + + override fun setAttribute(name: String, value: String): Widget { + this.attributes[name] = value + refresh() + return this + } + + override fun removeAttribute(name: String): Widget { + this.attributes.remove(name) + refresh() + return this + } + override fun getElement(): Node? { return this.vnode?.elm } diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FormControl.kt b/src/main/kotlin/pl/treksoft/kvision/form/FormControl.kt index 57ce88eb..3019fb6f 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/FormControl.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/FormControl.kt @@ -47,6 +47,16 @@ interface FormInput : Component { * The name attribute of the generated HTML input element. */ var name: String? + + /** + * Makes the input element focused. + */ + fun focus() + + /** + * Makes the input element blur. + */ + fun blur() } /** 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 6973efe9..07b86b4c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt @@ -152,14 +152,14 @@ abstract class CheckInput( /** * Makes the input element focused. */ - open fun focus() { + override fun focus() { getElementJQuery()?.focus() } /** * Makes the input element blur. */ - open fun blur() { + override fun blur() { getElementJQuery()?.blur() } diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroupInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroupInput.kt index 98839982..fca681f6 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroupInput.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroupInput.kt @@ -150,11 +150,11 @@ open class RadioGroupInput( } } - fun focus() { + override fun focus() { getChildren().filterIsInstance<Radio>().firstOrNull()?.focus() } - fun blur() { + override fun blur() { getChildren().filterIsInstance<Radio>().firstOrNull()?.blur() } diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SimpleSelect.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SimpleSelect.kt new file mode 100644 index 00000000..4d278ad2 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SimpleSelect.kt @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2017-present Robert Jaros |
