Skip to content

Commit

Permalink
Merge pull request #33 from strfx/main
Browse files Browse the repository at this point in the history
Install `remoteForm` directly onto passed element.
  • Loading branch information
theinterned authored Feb 19, 2024
2 parents 4646d67 + 029fed3 commit 1e66834
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
23 changes: 19 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ export interface Kicker {

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

let formHandlers: Map<string, RemoteFormHandler[]>
// remoteForm can be installed with a selector or reference to a <form>
// element.
type Installable = string | HTMLFormElement

let formHandlers: Map<Installable, RemoteFormHandler[]>
type Handler = (form: HTMLFormElement) => void

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

export function remoteForm(selector: string, fn: RemoteFormHandler): void {
export function remoteForm(selector: Installable, fn: RemoteFormHandler): void {
if (!formHandlers) {
formHandlers = new Map<string, RemoteFormHandler[]>()

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

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

function getMatches(el: HTMLElement): RemoteFormHandler[] {
const results = []

const hasMatch = (ref: Installable) => {
if (typeof ref === 'object') {
return ref === el
} else if (typeof ref === 'string') {
return el.matches(ref)
} else {
return false
}
}

for (const selector of formHandlers.keys()) {
if (el.matches(selector)) {
if (hasMatch(selector)) {
const handlers = formHandlers.get(selector) || []
results.push(...handlers)
}
Expand Down
9 changes: 9 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ describe('remoteForm', function () {
document.querySelector('button[type=submit]').click()
})

it('installs remoteForm on form reference', function (done) {
remoteForm(htmlForm, async form => {
assert.deepEqual(form, htmlForm)
done()
})

document.querySelector('button[type=submit]').click()
})

it('server failure scenario', function (done) {
htmlForm.action = 'server-error'

Expand Down

0 comments on commit 1e66834

Please sign in to comment.