Reuben Firmin
04/13/2024, 7:50 PMdata class AuxResponse(val target: HTMXTarget, val tag: TagConsumer<*>.() -> CommonAttributeGroupFacade)
fun render(target: HTMXTarget,
vararg composed: AuxResponse,
block: FlowContent.() -> Unit): Response {
which ideally users of the library could call with:
render(someTarget,
AuxResponse(someOtherTarget) {
some_adapter {
p {
+"Hello world supplemented"
}
}
)) {
p {
+"Hello world main"
}
Reuben Firmin
04/13/2024, 9:05 PMfun Context.render(target: HTMXTarget,
vararg composed: AuxResponse,
block: FlowContent.() -> Unit): Response {
return Response(buildString {
with(appendHTML()) {
div(classes = "wrapper") {
// take off the wrapper div.
noWrapper()
block()
}
composed.forEach {
div {
id = it.target.id
attributes["hx-swap-oob"] = "true"
it.subrender(this@div, this@render)
}
}
}
}, target)
}
+
data class AuxResponse(
val target: HTMXTarget,
val subrender: FlowContent.(Context) -> Unit)
Reuben Firmin
04/13/2024, 9:06 PMclass ExperimentPage @Inject constructor(): Api {
val experimentTarget = HTMXTarget("foo")
val experiment2Target = HTMXTarget("foo2")
val experiment3Target = HTMXTarget("foo3")
@GET("/experiment")
fun getPage() = page {
div {
target(experiment2Target)
}
div {
target(experiment3Target)
}
+"Hello world"
div {
// this makes an api call from the browser
onLoad(::helloName) {
it.param("name", "james")
.param("num_arrows", "5")
}
target(experimentTarget)
}
}
@GET("/hello")
fun helloName(context: Context) = context.render(experimentTarget,
AuxResponse(experiment2Target) {
helloOut()
},
AuxResponse(experiment3Target) { ctx ->
val numArrows = ctx.queryParamStrict("num_arrows")!!.toInt()
arrows(numArrows)
}
) {
val name = context.queryParamStrict("name")
p {
+"Hello $name"
}
deleteIcon("")
}
private fun FlowContent.helloOut() {
p {
+"Hello first out of band target!"
}
}
private fun FlowContent.arrows(n: Int) {
repeat(n) {
rightArrowIcon("w-5 h-5")
}
}
}
Reuben Firmin
04/13/2024, 9:13 PMReuben Firmin
04/13/2024, 9:27 PM@GET("/billing/payment_method", Role.USER)
fun getPaymentMethod(ctx: Context): Response {
val payment = paymentService.getPaymentMethod(userDAO.get(ctx.authUser().identity!!.userId))
return if (payment == null) {
ctx.render(paymentMethodTarget) {
paymentMethodForm(ctx.authUser().withNoEntity())
}
} else {
ctx.render(paymentMethodTarget,
AuxResponse(subscriptionDetailsTarget) {
subscriptionDetails()
}
) {
paymentMethodSummary(payment.first, payment.second)
}
}
}
Ahmed
07/12/2024, 6:18 PMAhmed
07/12/2024, 6:18 PM