Add bridge form controller.

This commit is contained in:
Denis Švara
2026-01-07 09:58:06 +01:00
parent 367edfcbac
commit c61942d57b
2 changed files with 53 additions and 0 deletions
@@ -0,0 +1,49 @@
import { BridgeComponent } from "@hotwired/hotwire-native-bridge"
import { BridgeElement } from "@hotwired/hotwire-native-bridge"
export default class extends BridgeComponent {
static component = "form"
static targets = [ "submit" ]
static values = { submitTitle: String }
connect() {
super.connect()
if (!this.hasSubmitTarget) return
this.notifyBridgeOfConnect()
this.observeSubmitTarget()
}
disconnect() {
super.disconnect()
this.submitObserver?.disconnect()
}
notifyBridgeOfConnect() {
const submitButton = new BridgeElement(this.submitTarget)
const title = submitButton.title
const displaysNavButtonMenu = submitButton.displaysNavButtonMenu()
this.send("connect", { title, displaysNavButtonMenu }, () => {
this.submitTarget.click()
})
}
observeSubmitTarget() {
this.submitObserver = new MutationObserver(() => {
this.send(this.submitTarget.disabled ? "submitDisabled" : "submitEnabled")
})
this.submitObserver.observe(this.submitTarget, {
attributes: true,
attributeFilter: [ "disabled" ]
})
}
submitStart() {
this.send("submitStart")
}
submitEnd() {
this.send("submitEnd")
}
}
@@ -43,3 +43,7 @@ BridgeElement.prototype.getOrder = function() {
BridgeElement.prototype.shouldDisplayAsFormSubmitMenu = function() {
return this.bridgeAttribute("display-as-form-submit-menu") === "true"
}
BridgeElement.prototype.displaysNavButtonMenu = function() {
return this.bridgeAttribute("displays-nav-button-menu") === "true"
}