UNPKG

1.98 kBJavaScriptView Raw
1import BaseComponent from 'bootstrap/js/src/base-component.js'
2
3import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
4import EventHandler from 'bootstrap/js/src/dom/event-handler'
5
6const NAME = 'list'
7const DATA_KEY = 'bs.list'
8const EVENT_KEY = `.${DATA_KEY}`
9const DATA_API_KEY = '.data-api'
10
11const EVENT_CLICK = `click${EVENT_KEY}`
12const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
13
14const CLASS_NAME_ACTIVE = 'active'
15
16const SELECTOR_LIST = '[data-bs-list-checkbox]' //'.it-list'
17const SELECTOR_ITEM_CHECKBOX = 'input[type=checkbox]'
18
19class List extends BaseComponent {
20 constructor(element) {
21 super(element)
22
23 this._init()
24 }
25
26 // Getters
27
28 static get NAME() {
29 return NAME
30 }
31
32 // Public
33 toggleCheckbox(item) {
34 const input = SelectorEngine.findOne('input', item)
35 if (input) {
36 if (input.checked) {
37 input.checked = false
38 item.classList.remove(CLASS_NAME_ACTIVE)
39 } else {
40 input.checked = true
41 item.classList.add(CLASS_NAME_ACTIVE)
42 }
43 }
44 }
45
46 // Private
47 _init() {
48 this._initCheckbox()
49 }
50 _initCheckbox() {
51 SelectorEngine.find(SELECTOR_ITEM_CHECKBOX, this._element).forEach((item) => {
52 EventHandler.on(item.closest('a'), EVENT_CLICK, (evt) => {
53 evt.preventDefault()
54 this.toggleCheckbox(item.closest('a'))
55 })
56 })
57 }
58}
59
60/**
61 * ------------------------------------------------------------------------
62 * Data Api implementation
63 * ------------------------------------------------------------------------
64 */
65
66SelectorEngine.find(SELECTOR_LIST).forEach((list) => {
67 SelectorEngine.find(SELECTOR_ITEM_CHECKBOX, list).forEach((checkbox) => {
68 EventHandler.one(checkbox.closest('a'), EVENT_CLICK_DATA_API, (evt) => {
69 if (!List.getInstance(list)) {
70 evt.preventDefault()
71 const listObj = List.getOrCreateInstance(list)
72 listObj.toggleCheckbox(evt.currentTarget)
73 }
74 })
75 })
76})
77
78export default List