Skip to content

Commit 9eb35d4

Browse files
authored
add hx-params support to TriggerDsl (#85)
1 parent 04e7da1 commit 9eb35d4

File tree

3 files changed

+96
-7
lines changed

3 files changed

+96
-7
lines changed

spring-funk-htmx/src/main/kotlin/com/github/wakingrufus/funk/htmx/HtmlExtensions.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ fun HTMLTag.hxSelect(selector: String) {
1515
attributes["hx-select"] = selector
1616
}
1717

18+
@SpringDslMarker
19+
fun HTMLTag.hxParams(params: String) {
20+
attributes["hx-params"] = params
21+
}
22+
1823
@SpringDslMarker
1924
fun HTMLTag.hxPushUrl(value: Boolean) {
2025
attributes["hx-push-url"] = value.toString()

spring-funk-htmx/src/main/kotlin/com/github/wakingrufus/funk/htmx/TriggerDsl.kt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ import com.github.wakingrufus.funk.htmx.trigger.HxTriggerDsl
99
import kotlinx.html.HTMLTag
1010

1111
@SpringDslMarker
12-
class TriggerDsl(
13-
val verb: HttpVerb,
14-
val path: String,
15-
var target: String? = null,
16-
var hxPushUrl: Boolean? = null,
17-
var hxSelect: String? = null
18-
) {
12+
class TriggerDsl(val verb: HttpVerb, val path: String) {
1913
private var swap: HxSwap? = null
2014
private var trigger: HxTrigger? = null
15+
private var hxParams: String? = null
16+
private var target: String? = null
17+
private var hxPushUrl: Boolean? = null
18+
private var hxSelect: String? = null
2119

2220
@SpringDslMarker
2321
fun swap(type: HxSwapType, dsl: HxSwapDsl.() -> Unit = {}) {
@@ -29,6 +27,25 @@ class TriggerDsl(
2927
trigger = HxTriggerDsl().apply(dsl)()
3028
}
3129

30+
@SpringDslMarker
31+
fun allParams() {
32+
hxParams = "*"
33+
}
34+
35+
@SpringDslMarker
36+
fun noParams() {
37+
hxParams = "none"
38+
}
39+
40+
@SpringDslMarker
41+
fun excludeParams(vararg params: String) {
42+
hxParams = "not " + params.joinToString(",")
43+
}
44+
45+
@SpringDslMarker
46+
fun includeParams(vararg params: String) {
47+
hxParams = params.joinToString(",")
48+
}
3249

3350
operator fun invoke(element: HTMLTag) {
3451
element.apply {
@@ -38,6 +55,7 @@ class TriggerDsl(
3855
target?.let { hxTarget(it) }
3956
hxPushUrl?.let { hxPushUrl(it) }
4057
hxSelect?.let { hxSelect(it) }
58+
hxParams?.let { hxParams(it) }
4159
}
4260
}
4361
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.github.wakingrufus.funk.htmx
2+
3+
import kotlinx.html.div
4+
import kotlinx.html.stream.appendHTML
5+
import org.assertj.core.api.Assertions.assertThat
6+
import org.junit.jupiter.api.Test
7+
8+
class TriggerDslTest {
9+
@Test
10+
fun `test default params`() {
11+
val actual = buildString {
12+
appendHTML(false).div {
13+
TriggerDsl(HttpVerb.GET, "/")(this)
14+
}
15+
}
16+
assertThat(actual).isEqualTo("""<div hx-get="/"></div>""")
17+
}
18+
19+
@Test
20+
fun `test no params`() {
21+
val actual = buildString {
22+
appendHTML(false).div {
23+
TriggerDsl(HttpVerb.GET, "/").apply {
24+
noParams()
25+
}(this)
26+
}
27+
}
28+
assertThat(actual).isEqualTo("""<div hx-get="/" hx-params="none"></div>""")
29+
}
30+
31+
@Test
32+
fun `test all params`() {
33+
val actual = buildString {
34+
appendHTML(false).div {
35+
TriggerDsl(HttpVerb.GET, "/").apply {
36+
allParams()
37+
}(this)
38+
}
39+
}
40+
assertThat(actual).isEqualTo("""<div hx-get="/" hx-params="*"></div>""")
41+
}
42+
43+
@Test
44+
fun `test include params`() {
45+
val actual = buildString {
46+
appendHTML(false).div {
47+
TriggerDsl(HttpVerb.GET, "/").apply {
48+
includeParams("1", "2")
49+
}(this)
50+
}
51+
}
52+
assertThat(actual).isEqualTo("""<div hx-get="/" hx-params="1,2"></div>""")
53+
}
54+
55+
@Test
56+
fun `test exclude params`() {
57+
val actual = buildString {
58+
appendHTML(false).div {
59+
TriggerDsl(HttpVerb.GET, "/").apply {
60+
excludeParams("1", "2")
61+
}(this)
62+
}
63+
}
64+
assertThat(actual).isEqualTo("""<div hx-get="/" hx-params="not 1,2"></div>""")
65+
}
66+
}

0 commit comments

Comments
 (0)