Skip to content

Commit 3ec7f20

Browse files
committed
Install remoteForm directly onto passed element.
remoteForm can install itself onto any element that matches passed selector. In some cases, you might want to install remoteForm onto a specific form element without having to assign this form an `id` just to make it selectable. This change allows passing a `HTMLFormElement` reference to remoteForm directly.
1 parent 4646d67 commit 3ec7f20

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/index.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ export interface Kicker {
6161

6262
export type RemoteFormHandler = (form: HTMLFormElement, kicker: Kicker, req: SimpleRequest) => void
6363

64-
let formHandlers: Map<string, RemoteFormHandler[]>
64+
// remoteForm can be installed with a selector or reference to a <form>
65+
// element.
66+
type Installable = string | HTMLFormElement
67+
68+
let formHandlers: Map<Installable, RemoteFormHandler[]>
6569
type Handler = (form: HTMLFormElement) => void
6670

6771
const afterHandlers: Handler[] = []
@@ -75,7 +79,7 @@ export function beforeRemote(fn: Handler): void {
7579
beforeHandlers.push(fn)
7680
}
7781

78-
export function remoteForm(selector: string, fn: RemoteFormHandler): void {
82+
export function remoteForm(selector: Installable, fn: RemoteFormHandler): void {
7983
if (!formHandlers) {
8084
formHandlers = new Map<string, RemoteFormHandler[]>()
8185

@@ -87,7 +91,7 @@ export function remoteForm(selector: string, fn: RemoteFormHandler): void {
8791
formHandlers.set(selector, [...handlers, fn])
8892
}
8993

90-
export function remoteUninstall(selector: string, fn: RemoteFormHandler): void {
94+
export function remoteUninstall(selector: Installable, fn: RemoteFormHandler): void {
9195
if (formHandlers) {
9296
const handlers = formHandlers.get(selector) || []
9397
formHandlers.set(
@@ -99,8 +103,19 @@ export function remoteUninstall(selector: string, fn: RemoteFormHandler): void {
99103

100104
function getMatches(el: HTMLElement): RemoteFormHandler[] {
101105
const results = []
106+
107+
const hasMatch = (ref: Installable) => {
108+
if (typeof ref === 'object') {
109+
return ref === el
110+
} else if (typeof ref === 'string') {
111+
return el.matches(ref)
112+
} else {
113+
return false
114+
}
115+
}
116+
102117
for (const selector of formHandlers.keys()) {
103-
if (el.matches(selector)) {
118+
if (hasMatch(selector)) {
104119
const handlers = formHandlers.get(selector) || []
105120
results.push(...handlers)
106121
}

test/test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ describe('remoteForm', function () {
4545
document.querySelector('button[type=submit]').click()
4646
})
4747

48+
it('installs remoteForm on form reference', function (done) {
49+
remoteForm(htmlForm, async () => done())
50+
document.querySelector('button[type=submit]').click()
51+
})
52+
4853
it('server failure scenario', function (done) {
4954
htmlForm.action = 'server-error'
5055

0 commit comments

Comments
 (0)