JSUIKitKBindings/src/jsMain/kotlin/dev/inmo/jsuikit/elements/Table.kt

105 lines
3.5 KiB
Kotlin
Raw Permalink Normal View History

2022-01-12 10:27:49 +00:00
package dev.inmo.jsuikit.elements
2021-12-22 08:38:12 +00:00
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.modifiers.UIKitModifier
import dev.inmo.jsuikit.modifiers.include
import org.jetbrains.compose.web.attributes.AttrsScope
2021-12-22 08:38:12 +00:00
import org.jetbrains.compose.web.dom.*
2022-01-13 15:36:39 +00:00
import org.jetbrains.compose.web.dom.Text
import org.w3c.dom.*
2021-12-22 08:38:12 +00:00
@Composable
fun <T> DefaultTable(
headerBuilders: List<ContentBuilder<HTMLTableCellElement>>,
dataList: Iterable<T>,
vararg tableModifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLTableElement> = {},
2022-01-25 14:13:03 +00:00
headerCustomizer: AttrBuilderContext<HTMLTableSectionElement> = {},
headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int) -> Unit = {},
rowAttributes: AttrsScope<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
betweenHeaderAndBodyFiller: ContentBuilder<HTMLTableElement> = {},
cellFiller: @Composable ElementScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit
2021-12-22 08:38:12 +00:00
) {
val headingIndexes = headerBuilders.indices
2021-12-22 08:38:12 +00:00
Table(
{
classes("uk-table")
include(*tableModifiers)
attributesCustomizer()
2021-12-22 08:38:12 +00:00
}
) {
2022-01-25 14:13:03 +00:00
Thead(headerCustomizer) {
2021-12-22 08:38:12 +00:00
Tr {
headerBuilders.forEachIndexed { i, t ->
2021-12-22 08:38:12 +00:00
Th(
{
headerCellCustomizer(i)
2021-12-22 08:38:12 +00:00
}
) {
t()
2021-12-22 08:38:12 +00:00
}
}
}
}
betweenHeaderAndBodyFiller()
2021-12-22 08:38:12 +00:00
Tbody {
dataList.forEach {
Tr(
{
rowAttributes(it)
}
) {
2021-12-22 08:38:12 +00:00
headingIndexes.forEach { i ->
Td(
{
cellCustomizer(i, it)
}
) {
2021-12-22 08:38:12 +00:00
cellFiller(i, it)
}
}
}
}
}
}
}
@Composable
fun <T> DefaultTable(
heading: List<String>,
dataList: Iterable<T>,
vararg tableModifiers: UIKitModifier,
attributesCustomizer: AttrBuilderContext<HTMLTableElement> = {},
2022-01-25 14:13:03 +00:00
headerCustomizer: AttrBuilderContext<HTMLTableSectionElement> = {},
headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, title: String) -> Unit = { _, _ -> },
rowAttributes: AttrsScope<HTMLTableRowElement>.(t: T) -> Unit = {},
cellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit = { _, _ -> },
betweenHeaderAndBodyFiller: ContentBuilder<HTMLTableElement> = {},
cellFiller: @Composable ElementScope<HTMLTableCellElement>.(i: Int, t: T) -> Unit
) {
val headersByIndex = heading.mapIndexed { index, s -> index to s }.toMap()
val headerCellCustomizer: AttrsScope<HTMLTableCellElement>.(i: Int) -> Unit = { i ->
val header = headersByIndex[i]
if (header != null) {
headerCellCustomizer(i, header)
}
}
inline fun headerFactory(header: String): ContentBuilder<HTMLTableCellElement> = {
Text(header)
}
val headerBuilders = heading.map(::headerFactory)
return DefaultTable(
headerBuilders,
dataList,
tableModifiers = tableModifiers,
attributesCustomizer,
2022-01-25 14:13:03 +00:00
headerCustomizer,
headerCellCustomizer,
rowAttributes,
cellCustomizer,
betweenHeaderAndBodyFiller,
cellFiller
)
}