Skip to content

Commit 1e66834

Browse files
authored
Merge pull request #33 from strfx/main
Install `remoteForm` directly onto passed element.
2 parents 4646d67 + 029fed3 commit 1e66834

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

src/index.ts

+19-4
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

+9
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ 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 form => {
50+
assert.deepEqual(form, htmlForm)
51+
done()
52+
})
53+
54+
document.querySelector('button[type=submit]').click()
55+
})
56+
4857
it('server failure scenario', function (done) {
4958
htmlForm.action = 'server-error'
5059

0 commit comments

Comments
 (0)