Skip to content

Commit 11f2406

Browse files
use ts
1 parent 1135860 commit 11f2406

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

spec/index.test.ts

+31-3
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,32 @@ describe('#nestedForm', (): void => {
1212

1313
document.body.innerHTML = `
1414
<form data-controller="nested-form">
15-
<template data-nested-form-target="template">
15+
<template data-nested-form-target="template" data-model-template="todo">
1616
<div class="nested-form-wrapper" data-new-record="true">
1717
<label for="NEW_RECORD">New todo</label>
1818
</div>
1919
</template>
2020
21+
<template data-nested-form-target="template" data-model-template="note">
22+
<div class="nested-form-wrapper" data-new-record="true">
23+
<label for="NEW_RECORD">New note</label>
24+
</div>
25+
</template>
26+
2127
<div>
2228
<label>Your todo</label>
2329
</div>
2430
25-
<div data-nested-form-target="target"></div>
31+
<div id="nested-form-target-todo" data-nested-form-target="target" data-model-target="todo"></div>
32+
<button type="button" data-action="nested-form#add" data-model="todo" class="nested-form-action">Add todo</button>
33+
34+
<div>
35+
<label>Your note</label>
36+
</div>
37+
38+
<div id="nested-form-target-note" data-nested-form-target="target" data-model-target="note"></div>
2639
27-
<button type="button" data-action="nested-form#add">Add todo</button>
40+
<button type="button" data-action="nested-form#add" data-model="note" class="nested-form-action">Add note</button>
2841
</form>
2942
`
3043
})
@@ -39,4 +52,19 @@ describe('#nestedForm', (): void => {
3952

4053
expect(target.previousElementSibling.innerHTML).toContain('New todo')
4154
})
55+
56+
it('should toggle with many nested forms', (): void => {
57+
const todoButton: HTMLButtonElement = document.querySelector('[data-model="todo"]')
58+
const todoTarget: HTMLElement = document.querySelector('#nested-form-target-todo')
59+
const noteButton: HTMLButtonElement = document.querySelector('[data-model="note"]')
60+
const noteTarget: HTMLElement = document.querySelector('#nested-form-target-note')
61+
62+
expect(todoTarget.previousElementSibling.innerHTML).toContain('Your todo')
63+
todoButton.click()
64+
expect(todoTarget.previousElementSibling.innerHTML).toContain('New todo')
65+
66+
expect(noteTarget.previousElementSibling.innerHTML).toContain('Your note')
67+
noteButton.click()
68+
expect(noteTarget.previousElementSibling.innerHTML).toContain('New note')
69+
})
4270
})

src/index.ts

+23-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ export default class extends Controller {
55
templateTarget: HTMLElement
66
wrapperSelectorValue: string
77
wrapperSelector: string
8+
actionSelector: string
9+
actionSelectorValue: string
10+
templateTargets: HTMLElement[]
11+
targetTargets: HTMLElement[]
812

913
static targets = ['target', 'template']
1014
static values = {
@@ -20,8 +24,25 @@ export default class extends Controller {
2024
add (e: Event) {
2125
e.preventDefault()
2226

23-
const content: string = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, new Date().getTime().toString())
24-
this.targetTarget.insertAdjacentHTML('beforebegin', content)
27+
// @ts-ignore
28+
const actionSelector: HTMLElement = e.target.closest(this.actionSelector)
29+
const insertHTML = (target: HTMLElement, content: string) => {
30+
target.insertAdjacentHTML('beforebegin', content)
31+
}
32+
33+
const stringifyTimestamp: string = new Date().getTime().toString()
34+
35+
if (actionSelector) {
36+
const model = actionSelector.dataset.model
37+
const templateTarget = this.templateTargets.find(el => el.dataset.modelTemplate === model)
38+
const target = this.targetTargets.find(el => el.dataset.modelTarget === model)
39+
const content = templateTarget.innerHTML.replace(/NEW_RECORD/g, stringifyTimestamp)
40+
insertHTML(target, content)
41+
} else {
42+
const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, stringifyTimestamp)
43+
this.targetTarget.insertAdjacentHTML('beforebegin', content)
44+
insertHTML(this.targetTarget, content)
45+
}
2546
}
2647

2748
remove (e: Event): void {

0 commit comments

Comments
 (0)