Skip to content

Commit f618848

Browse files
committed
Fix comments, data_key, and cleanup some code; add tests too
1 parent e3228fc commit f618848

2 files changed

Lines changed: 76 additions & 8 deletions

File tree

js/src/toggler.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* --------------------------------------------------------------------------
3-
* Bootstrap (v5.1.3): toggler.js
3+
* Bootstrap toggler.js
44
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
55
* --------------------------------------------------------------------------
66
*/
@@ -14,7 +14,7 @@ import { eventActionOnPlugin } from './util/component-functions.js'
1414
*/
1515

1616
const NAME = 'toggler'
17-
const DATA_KEY = 'bs.toggle'
17+
const DATA_KEY = 'bs.toggler'
1818
const EVENT_KEY = `.${DATA_KEY}`
1919

2020
const EVENT_TOGGLE = `toggle${EVENT_KEY}`
@@ -51,11 +51,7 @@ class Toggler extends BaseComponent {
5151
return NAME
5252
}
5353

54-
_configAfterMerge(config) {
55-
return config
56-
}
57-
58-
// Private
54+
// Public
5955
toggle() {
6056
const toggleEvent = EventHandler.trigger(this._element, EVENT_TOGGLE)
6157

@@ -68,6 +64,7 @@ class Toggler extends BaseComponent {
6864
EventHandler.trigger(this._element, EVENT_TOGGLED)
6965
}
7066

67+
// Private
7168
_execute() {
7269
const { attribute, value } = this._config
7370

@@ -80,7 +77,8 @@ class Toggler extends BaseComponent {
8077
return
8178
}
8279

83-
if (this._element.getAttribute(attribute) === value) {
80+
// Compare as strings since getAttribute() always returns a string
81+
if (this._element.getAttribute(attribute) === String(value)) {
8482
this._element.removeAttribute(attribute)
8583
return
8684
}

js/tests/unit/toggler.spec.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,5 +191,75 @@ describe('Toggler', () => {
191191
togglerEl.click()
192192
expect(togglerEl.getAttribute('id')).toBeNull()
193193
})
194+
195+
it('should toggle class on target element via data-bs-target with ID selector', () => {
196+
fixtureEl.innerHTML = [
197+
'<button data-bs-toggle="toggler" data-bs-target="#target-element"></button>',
198+
'<div id="target-element" data-bs-value="bg-info" data-bs-attribute="class"></div>'
199+
].join('')
200+
201+
const triggerEl = fixtureEl.querySelector('[data-bs-toggle="toggler"]')
202+
const targetEl = fixtureEl.querySelector('#target-element')
203+
204+
triggerEl.click()
205+
expect(targetEl.classList.contains('bg-info')).toBeTrue()
206+
207+
triggerEl.click()
208+
expect(targetEl.classList.contains('bg-info')).toBeFalse()
209+
})
210+
211+
it('should toggle class on multiple target elements via data-bs-target with class selector', () => {
212+
fixtureEl.innerHTML = [
213+
'<button data-bs-toggle="toggler" data-bs-target=".target-class"></button>',
214+
'<div class="target-class" data-bs-value="bg-warning" data-bs-attribute="class"></div>',
215+
'<div class="target-class" data-bs-value="bg-info" data-bs-attribute="class"></div>',
216+
'<div class="target-class" data-bs-value="bg-danger" data-bs-attribute="class"></div>'
217+
].join('')
218+
219+
const triggerEl = fixtureEl.querySelector('[data-bs-toggle="toggler"]')
220+
const targetEls = fixtureEl.querySelectorAll('.target-class')
221+
222+
triggerEl.click()
223+
expect(targetEls[0].classList.contains('bg-warning')).toBeTrue()
224+
expect(targetEls[1].classList.contains('bg-info')).toBeTrue()
225+
expect(targetEls[2].classList.contains('bg-danger')).toBeTrue()
226+
227+
triggerEl.click()
228+
expect(targetEls[0].classList.contains('bg-warning')).toBeFalse()
229+
expect(targetEls[1].classList.contains('bg-info')).toBeFalse()
230+
expect(targetEls[2].classList.contains('bg-danger')).toBeFalse()
231+
})
232+
233+
it('should toggle attribute on target element via data-bs-target', () => {
234+
fixtureEl.innerHTML = [
235+
'<button data-bs-toggle="toggler" data-bs-target="#target-fieldset"></button>',
236+
'<fieldset id="target-fieldset" data-bs-value="disabled" data-bs-attribute="disabled"></fieldset>'
237+
].join('')
238+
239+
const triggerEl = fixtureEl.querySelector('[data-bs-toggle="toggler"]')
240+
const targetEl = fixtureEl.querySelector('#target-fieldset')
241+
242+
triggerEl.click()
243+
expect(targetEl.getAttribute('disabled')).toEqual('disabled')
244+
245+
triggerEl.click()
246+
expect(targetEl.hasAttribute('disabled')).toBeFalse()
247+
})
248+
249+
it('should toggle target element via href attribute as fallback', () => {
250+
fixtureEl.innerHTML = [
251+
'<a data-bs-toggle="toggler" href="#target-via-href"></a>',
252+
'<div id="target-via-href" data-bs-value="active" data-bs-attribute="class"></div>'
253+
].join('')
254+
255+
const triggerEl = fixtureEl.querySelector('[data-bs-toggle="toggler"]')
256+
const targetEl = fixtureEl.querySelector('#target-via-href')
257+
258+
triggerEl.click()
259+
expect(targetEl.classList.contains('active')).toBeTrue()
260+
261+
triggerEl.click()
262+
expect(targetEl.classList.contains('active')).toBeFalse()
263+
})
194264
})
195265
})

0 commit comments

Comments
 (0)