From 8c2ce7b75df91c69464b7b72649a22c1d98cd031 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 15 Apr 2022 13:05:20 +0600 Subject: [PATCH 1/4] start 0.0.51 --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2ad81a..08eb91f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.0.51 + ## 0.0.50 * Add opportunity to customize content in title of `Nav` after text diff --git a/gradle.properties b/gradle.properties index 4f89d07..bdf42d5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,4 +9,4 @@ android.enableJetifier=true # Project data group=dev.inmo -version=0.0.50 +version=0.0.51 From ebb350c688efdc44e11e6af7d7d40ff8d20a374d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 15 Apr 2022 13:06:14 +0600 Subject: [PATCH 2/4] Improvements in Dropdowns and new attribute in NavItemElement --- CHANGELOG.md | 3 ++ .../jsuikit/UIKitAttributeValueBuilder.kt | 5 +- .../dev/inmo/jsuikit/elements/Dropdown.kt | 49 +++++++++++++------ .../kotlin/dev/inmo/jsuikit/elements/Nav.kt | 3 +- .../inmo/jsuikit/modifiers/UIKitDropdown.kt | 48 ++++++++++++++++++ .../kotlin/dev/inmo/jsuikit/types/Dropdown.kt | 44 +++++++++++++++++ .../kotlin/dev/inmo/jsuikit/types/UIKit.kt | 3 ++ .../inmo/jsuikit/utils/AttributeBuilder.kt | 34 ++++++------- .../inmo/jsuikit/utils/ParametersBuilder.kt | 38 ++++++++++++++ 9 files changed, 190 insertions(+), 37 deletions(-) create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt create mode 100644 src/jsMain/kotlin/dev/inmo/jsuikit/utils/ParametersBuilder.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 08eb91f..75a325d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.0.51 +* New interface `Dropdown` which will be used to create (or retrieve) dropdown for an element +* New attribute in `NavItemElement` for configuration of `A` element + ## 0.0.50 * Add opportunity to customize content in title of `Nav` after text diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/UIKitAttributeValueBuilder.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/UIKitAttributeValueBuilder.kt index cbfee2c..d6f23b9 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/UIKitAttributeValueBuilder.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/UIKitAttributeValueBuilder.kt @@ -1,8 +1,7 @@ package dev.inmo.jsuikit import dev.inmo.jsuikit.modifiers.AttributeValue -import dev.inmo.jsuikit.utils.AttributeBuilder -import dev.inmo.jsuikit.utils.buildAttribute +import dev.inmo.jsuikit.utils.* import org.jetbrains.compose.web.attributes.AttrsScope @Deprecated("Will be removed soon") @@ -25,7 +24,7 @@ class UIKitAttributeValueBuilder { fun AttrsScope<*>.buildAndAddAttribute( attributeName: String, skipNullValues: Boolean = true, - block: AttributeBuilder.() -> Unit + block: ParametersBuilder.() -> Unit ) { buildAttribute(attributeName, skipNullValues, block).let { attr(it.first, it.second) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Dropdown.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Dropdown.kt index 43b1751..c74e357 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Dropdown.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Dropdown.kt @@ -3,10 +3,26 @@ package dev.inmo.jsuikit.elements import androidx.compose.runtime.Composable import dev.inmo.jsuikit.buildAndAddAttribute import dev.inmo.jsuikit.modifiers.* +import dev.inmo.jsuikit.types.DropdownOptions import dev.inmo.jsuikit.utils.Milliseconds import org.jetbrains.compose.web.dom.* import org.w3c.dom.HTMLDivElement +@Composable +fun Dropdown( + vararg modifiers: UIKitModifier, + dropdownOptions: DropdownOptions, + attributesCustomizer: AttrBuilderContext = {}, + contentBuilder: ContentBuilder +) { + Div( + { + include(UIKitDropdown(dropdownOptions), *modifiers) + attributesCustomizer() + }, + contentBuilder + ) +} @Composable fun Dropdown( vararg modifiers: UIKitModifier, @@ -26,21 +42,24 @@ fun Dropdown( ) { Div( { - buildAndAddAttribute("uk-dropdown") { - "toggle" to toggle - "pos" to pos - "mode" to mode - "delayShow" to delayShow - "delayHide" to delayHide - "boundary" to boundary - "boundaryAlign" to boundaryAlign - "flip" to flip - "offset" to offset - "animation" to animation - "duration" to duration - } - classes("uk-dropdown") - include(*modifiers) + include( + UIKitDropdown( + DropdownOptions( + toggle = toggle, + pos = pos, + mode = mode, + delayShow = delayShow, + delayHide = delayHide, + boundary = boundary, + boundaryAlign = boundaryAlign, + flip = flip, + offset = offset, + animation = animation, + duration = duration + ) + ), + *modifiers + ) attributesCustomizer() }, contentBuilder diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Nav.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Nav.kt index 0f083b7..93cccba 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Nav.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Nav.kt @@ -249,6 +249,7 @@ fun NavHeader( fun NavItemElement( vararg modifiers: UIKitModifier, attributesCustomizer: AttrBuilderContext = {}, + anchorAttributesCustomizer: AttrBuilderContext = {}, contentAllocator: ContentBuilder ) { Li( @@ -257,7 +258,7 @@ fun NavItemElement( attributesCustomizer() } ) { - A("#") { + A("#", attrs = anchorAttributesCustomizer) { contentAllocator() } } diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDropdown.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDropdown.kt index b1f4f1b..a429b63 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDropdown.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/modifiers/UIKitDropdown.kt @@ -1,5 +1,9 @@ package dev.inmo.jsuikit.modifiers +import dev.inmo.jsuikit.types.DropdownOptions +import dev.inmo.jsuikit.utils.Milliseconds +import dev.inmo.jsuikit.utils.buildAttribute + sealed class UIKitDropdown(classname: String) : UIKitModifier { override val classes: Array = arrayOf(classname) @@ -64,4 +68,48 @@ sealed class UIKitDropdown(classname: String) : UIKitModifier { } + class Custom( + dropdownOptions: DropdownOptions + ) : UIKitDropdown("uk-dropdown") { + override val otherAttrs: Map = mapOf( + buildAttribute( + "uk-dropdown" + ) { + dropdownOptions.includeParameters(this) + } + ) + } + + companion object { + operator fun invoke( + dropdownOptions: DropdownOptions + ) = Custom(dropdownOptions) + operator fun invoke( + toggle: String? = null, + pos: Position? = null, + mode: Mode? = null, + delayShow: Milliseconds? = null, + delayHide: Milliseconds? = null, + boundary: String? = null, + boundaryAlign: Boolean? = null, + flip: Flip? = null, + offset: Int? = null, + animation: UIKitAnimation? = null, + duration: Milliseconds? = null, + ) = Custom( + DropdownOptions( + toggle = toggle, + pos = pos, + mode = mode, + delayShow = delayShow, + delayHide = delayHide, + boundary = boundary, + boundaryAlign = boundaryAlign, + flip = flip, + offset = offset, + animation = animation, + duration = duration + ) + ) + } } diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt new file mode 100644 index 0000000..f50a378 --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt @@ -0,0 +1,44 @@ +package dev.inmo.jsuikit.types + +import dev.inmo.jsuikit.modifiers.UIKitAnimation +import dev.inmo.jsuikit.modifiers.UIKitDropdown +import dev.inmo.jsuikit.utils.* + +external interface Dropdown { + fun show() + fun hide(delay: Boolean) + fun hide(delay: Milliseconds) +} + +data class DropdownOptions( + private val toggle: String? = null, + private val pos: UIKitDropdown.Position? = null, + private val mode: UIKitDropdown.Mode? = null, + private val delayShow: Milliseconds? = null, + private val delayHide: Milliseconds? = null, + private val boundary: String? = null, + private val boundaryAlign: Boolean? = null, + private val flip: UIKitDropdown.Flip? = null, + private val offset: Int? = null, + private val animation: UIKitAnimation? = null, + private val duration: Milliseconds? = null, +) { + fun includeParameters(parametersBuilder: ParametersBuilder) { + with(parametersBuilder) { + "toggle" to toggle + "pos" to pos + "mode" to mode + "delayShow" to delayShow + "delayHide" to delayHide + "boundary" to boundary + "boundaryAlign" to boundaryAlign + "flip" to flip + "offset" to offset + "animation" to animation + "duration" to duration + } + } + fun parameters() = buildParametersWithoutNulls { + includeParameters(this) + } +} diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/types/UIKit.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/types/UIKit.kt index 3bf29fa..8b5b718 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/types/UIKit.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/types/UIKit.kt @@ -13,4 +13,7 @@ external interface UIKit { fun modal(element: Element): UIKitDialog fun modal(selector: String): UIKitDialog? + + fun dropdown(element: Element, options: DropdownOptions = definedExternally): Dropdown + fun dropdown(selector: String, options: DropdownOptions = definedExternally): Dropdown? } diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributeBuilder.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributeBuilder.kt index a0ae1d7..1139b92 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributeBuilder.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/AttributeBuilder.kt @@ -2,26 +2,24 @@ package dev.inmo.jsuikit.utils class AttributeBuilder ( val attributeName: String, - val skipNullValues: Boolean = true, - private val parametersPreset: MutableMap = mutableMapOf() + val parametersBuilder: ParametersBuilder ) { - - fun add(k: String, v: Any? = null) { - if (v != null || !skipNullValues) { - parametersPreset[k] = v ?.toString() - } + fun build(): Pair = parametersBuilder.build().run { + Pair( + attributeName, toList().joinToString(";") { + "${it.first}${it.second ?.let { ": $it" } ?: ""}" + } + ) } - infix fun String.to(value: Any?) = add(this, value) - operator fun String.unaryPlus() = add(this, null) - - fun build(): Pair = Pair( - attributeName, parametersPreset.toList().joinToString(";") { - "${it.first}${it.second ?.let { ": $it" } ?: ""}" - } - ) } -inline fun buildAttribute(attributeName: String, skipNullValues: Boolean = true, block: AttributeBuilder.() -> Unit) = AttributeBuilder( +inline fun buildAttribute( + attributeName: String, + skipNullValues: Boolean = true, + block: ParametersBuilder.() -> Unit +) = AttributeBuilder( attributeName, - skipNullValues -).apply(block).build() + ParametersBuilder(skipNullValues) +).apply { + parametersBuilder.block() +}.build() diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/utils/ParametersBuilder.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/ParametersBuilder.kt new file mode 100644 index 0000000..edde3f3 --- /dev/null +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/utils/ParametersBuilder.kt @@ -0,0 +1,38 @@ +package dev.inmo.jsuikit.utils + + +class ParametersBuilder( + val skipNullValues: Boolean = true, + private val parameters: MutableMap = mutableMapOf() +) { + fun add(k: String, v: Any? = null) { + if (v != null || !skipNullValues) { + parameters[k] = v ?.toString() + } + } + infix fun String.to(value: Any?) = add(this, value) + operator fun String.unaryPlus() = add(this, null) + + operator fun Map.unaryPlus() = forEach { + + } + + fun build() = parameters.toMap() + fun buildNotNullable() = parameters.mapNotNull { (k, v) -> + if (v != null) { + Pair(k, v) + } else { + null + } + }.toMap() +} + +fun buildParameters( + skipNullValues: Boolean = true, + block: ParametersBuilder.() -> Unit +) = ParametersBuilder(skipNullValues).apply(block).build() + +fun buildParametersWithoutNulls( + skipNullValues: Boolean = true, + block: ParametersBuilder.() -> Unit +) = ParametersBuilder(skipNullValues).apply(block).buildNotNullable() From 4b697938ac81ab447043043f85db1f0acb9c2604 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 15 Apr 2022 13:12:04 +0600 Subject: [PATCH 3/4] a little fix in hide of dropdown --- src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt index f50a378..7c9a536 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt @@ -6,7 +6,7 @@ import dev.inmo.jsuikit.utils.* external interface Dropdown { fun show() - fun hide(delay: Boolean) + fun hide(delay: Boolean? = definedExternally) fun hide(delay: Milliseconds) } From ed6582c98d41a2073f3a1bdb46e610c12708dc17 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 15 Apr 2022 13:20:30 +0600 Subject: [PATCH 4/4] now it is impossible to pass null in hide fun of dropdown --- src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt index 7c9a536..bac466c 100644 --- a/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt +++ b/src/jsMain/kotlin/dev/inmo/jsuikit/types/Dropdown.kt @@ -6,7 +6,7 @@ import dev.inmo.jsuikit.utils.* external interface Dropdown { fun show() - fun hide(delay: Boolean? = definedExternally) + fun hide(delay: Boolean = definedExternally) fun hide(delay: Milliseconds) }