Skip to content

Commit

Permalink
[compose-dom] Let classes lists get merged instead of overriding earl…
Browse files Browse the repository at this point in the history
…ier calls
  • Loading branch information
Oleksandr Karpovich authored and eymar committed May 25, 2021
1 parent 619a0a4 commit 2b788ef
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
3 changes: 3 additions & 0 deletions web/core/src/jsMain/kotlin/androidx/compose/web/DomApplier.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ class DomNodeWrapper(val node: Node) {

fun updateProperties(list: List<Pair<(HTMLElement, Any) -> Unit, Any>>) {
val htmlElement = node as? HTMLElement ?: return

if (node.className.isNotEmpty()) node.className = ""

list.forEach { it.first(htmlElement, it.second) }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,5 @@ class ClassesAttrBuilder {
}

val setClassList: (HTMLElement, Array<out String>) -> Unit = { e, classList ->
e.className = ""
e.classList.add(*classList)
}
85 changes: 85 additions & 0 deletions web/core/src/jsTest/kotlin/elements/AttributesTests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.web.attributes.disabled
import androidx.compose.web.attributes.forId
import androidx.compose.web.elements.Button
import androidx.compose.web.elements.Div
import androidx.compose.web.elements.Label
import androidx.compose.web.elements.Text
import org.w3c.dom.HTMLButtonElement
import org.w3c.dom.HTMLDivElement
import runTest
import kotlin.test.Test
import kotlin.test.assertEquals
Expand Down Expand Up @@ -80,4 +82,87 @@ class AttributesTests {

assertEquals("", btn.getAttribute("disabled"))
}

@Test
fun multipleClassesCallsAddMoreClasses() = runTest {
composition {
Div(attrs = {
classes("a", "b")
classes("c", "d")
}) {}
}

val div = root.firstChild as HTMLDivElement
assertEquals(
expected = "a b c d",
actual = div.getAttribute("class")
)
}

@Test
fun multipleClassesBuildersCallsAddMoreClasses() = runTest {
composition {
Div(attrs = {
classes("a", "b")
classes {
+"c"
+"d"
}
}) {}
}

val div = root.firstChild as HTMLDivElement
assertEquals(
expected = "a b c d",
actual = div.getAttribute("class")
)
}


@Test
fun multipleClassesBuildersCallsAddMoreClasses2() = runTest {
composition {
Div(attrs = {
classes {
+"c"
+"d"
}
classes("a", "b")
}) {}
}

val div = root.firstChild as HTMLDivElement
assertEquals(
expected = "c d a b",
actual = div.getAttribute("class")
)
}

@Test
fun multipleClassesBuildersCallsWithConditionsAddCorrectClasses() = runTest {
val addClassD = mutableStateOf(true)
composition {
Div(attrs = {
classes {
+"c"
if (addClassD.value) +"d"
}
classes("a", "b")
}) {}
}

val div = root.firstChild as HTMLDivElement
assertEquals(
expected = "c d a b",
actual = div.getAttribute("class")
)

addClassD.value = false
waitChanges()

assertEquals(
expected = "c a b",
actual = div.getAttribute("class")
)
}
}

0 comments on commit 2b788ef

Please sign in to comment.