bootstrap-italia 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/bootstrap-italia.esm.js +3 -6
  2. package/dist/bootstrap-italia.esm.js.map +1 -1
  3. package/dist/css/bootstrap-italia-comuni.min.css +1 -1
  4. package/dist/css/bootstrap-italia.min.css +1 -1
  5. package/dist/css/bootstrap-italia.min.css.map +1 -1
  6. package/dist/js/bootstrap-italia.bundle.min.js +369 -67
  7. package/dist/plugins/accordion.js +13 -5
  8. package/dist/plugins/accordion.js.map +1 -1
  9. package/dist/plugins/backToTop.js +3 -5
  10. package/dist/plugins/backToTop.js.map +1 -1
  11. package/dist/plugins/carousel-bi.js +0 -1
  12. package/dist/plugins/carousel-bi.js.map +1 -1
  13. package/dist/plugins/cookiebar.js.map +1 -1
  14. package/dist/plugins/dimmer.js +22 -19
  15. package/dist/plugins/dimmer.js.map +1 -1
  16. package/dist/plugins/fonts-loader.js +253 -249
  17. package/dist/plugins/fonts-loader.js.map +1 -1
  18. package/dist/plugins/forward.js +11 -6
  19. package/dist/plugins/forward.js.map +1 -1
  20. package/dist/plugins/header-sticky.js +74 -31
  21. package/dist/plugins/header-sticky.js.map +1 -1
  22. package/dist/plugins/history-back.js +13 -6
  23. package/dist/plugins/history-back.js.map +1 -1
  24. package/dist/plugins/init.js +14 -0
  25. package/dist/plugins/init.js.map +1 -0
  26. package/dist/plugins/input-label.js +4 -0
  27. package/dist/plugins/input-label.js.map +1 -1
  28. package/dist/plugins/input-number.js +48 -23
  29. package/dist/plugins/input-number.js.map +1 -1
  30. package/dist/plugins/input-password.js +84 -33
  31. package/dist/plugins/input-password.js.map +1 -1
  32. package/dist/plugins/input-search-autocomplete.js +24 -5
  33. package/dist/plugins/input-search-autocomplete.js.map +1 -1
  34. package/dist/plugins/input.js +32 -9
  35. package/dist/plugins/input.js.map +1 -1
  36. package/dist/plugins/navscroll.js +2 -3
  37. package/dist/plugins/navscroll.js.map +1 -1
  38. package/dist/plugins/select-autocomplete.js +0 -1
  39. package/dist/plugins/select-autocomplete.js.map +1 -1
  40. package/dist/plugins/sticky.js +2 -3
  41. package/dist/plugins/sticky.js.map +1 -1
  42. package/dist/plugins/transfer.js +12 -3
  43. package/dist/plugins/transfer.js.map +1 -1
  44. package/dist/plugins/upload-dragdrop.js +22 -5
  45. package/dist/plugins/upload-dragdrop.js.map +1 -1
  46. package/dist/plugins/util/observer.js +23 -9
  47. package/dist/plugins/util/observer.js.map +1 -1
  48. package/dist/version.js +1 -1
  49. package/dist/version.js.map +1 -1
  50. package/package.json +3 -3
  51. package/src/js/bootstrap-italia.entry.js +8 -12
  52. package/src/js/bootstrap-italia.esm.js +3 -6
  53. package/src/js/plugins/accordion.js +9 -1
  54. package/src/js/plugins/backToTop.js +3 -5
  55. package/src/js/plugins/carousel-bi.js +0 -1
  56. package/src/js/plugins/cookiebar.js +0 -11
  57. package/src/js/plugins/dimmer.js +16 -14
  58. package/src/js/plugins/fonts-loader.js +250 -248
  59. package/src/js/plugins/forward.js +8 -2
  60. package/src/js/plugins/header-sticky.js +75 -30
  61. package/src/js/plugins/history-back.js +8 -2
  62. package/src/js/plugins/init.js +14 -0
  63. package/src/js/plugins/input-label.js +4 -0
  64. package/src/js/plugins/input-number.js +35 -10
  65. package/src/js/plugins/input-password.js +64 -13
  66. package/src/js/plugins/input-search-autocomplete.js +22 -2
  67. package/src/js/plugins/input.js +27 -4
  68. package/src/js/plugins/navscroll.js +2 -3
  69. package/src/js/plugins/select-autocomplete.js +0 -1
  70. package/src/js/plugins/sticky.js +2 -3
  71. package/src/js/plugins/transfer.js +11 -2
  72. package/src/js/plugins/upload-dragdrop.js +21 -4
  73. package/src/js/plugins/util/observer.js +23 -9
  74. package/src/js/version.js +1 -1
  75. package/src/scss/custom/_accessible-autocomplete.scss +4 -0
  76. package/src/scss/custom/_carousel.scss +4 -0
  77. package/src/scss/custom/_dimmer.scss +5 -1
  78. package/src/scss/custom/_form-password.scss +7 -0
  79. package/src/scss/custom/_version.scss +1 -1
@@ -1,8 +1,13 @@
1
1
  import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
2
2
  import { isVisible } from 'bootstrap/js/src/util'
3
3
 
4
+ import Sticky from './sticky'
5
+
6
+ import onDocumentScroll from './util/on-document-scroll'
7
+
4
8
  const CLASS_NAME_CLONED_HEADER = 'cloned-element'
5
9
  const CLASS_NAME_SHOW = 'show'
10
+ const CLASS_NAME_ISTICKY = 'is-sticky'
6
11
 
7
12
  const SELECTOR_HEADER = '.it-header-sticky'
8
13
  const SELECTOR_TOGGLER = '.custom-navbar-toggler'
@@ -12,35 +17,69 @@ const SELECTOR_SEARCH_WRAPPER = '.it-search-wrapper'
12
17
  const SELECTOR_USER_WRAPPER = '.it-user-wrapper'
13
18
  const SELECTOR_CLONED = `.${CLASS_NAME_CLONED_HEADER}`
14
19
 
15
- const toggleClonedElement = (targetHeader, toAdd = true) => {
16
- const isDesktop = !isVisible(SelectorEngine.findOne(SELECTOR_TOGGLER, targetHeader))
20
+ // eslint-disable-next-line no-undef
21
+ const dataSet = new Map()
17
22
 
18
- if (isDesktop) {
19
- const target = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, targetHeader)
23
+ class HeaderSticky {
24
+ //HeaderSticky uses Sticky so it can't be a Bootstrap BaseComponent
25
+ constructor(element) {
26
+ if (dataSet.get(element)) {
27
+ return null
28
+ }
20
29
 
21
- if (toAdd) {
22
- const elBrand = SelectorEngine.findOne(SELECTOR_BRAND_WRAPPER, targetHeader)
23
- const elSearch = SelectorEngine.findOne(SELECTOR_SEARCH_WRAPPER, targetHeader)
24
- const elUser = SelectorEngine.findOne(SELECTOR_USER_WRAPPER, targetHeader)
30
+ this._element = element
31
+ this._elementObj = Sticky.getOrCreateInstance(element)
25
32
 
26
- const clonedBrand = elBrand ? elBrand.cloneNode(true) : null
27
- const clonedSearch = elSearch ? elSearch.cloneNode(true) : null
28
- const clonedUser = elUser ? elUser.cloneNode(true) : null
33
+ dataSet.set(element, this._elementObj)
29
34
 
30
- if (clonedBrand) {
31
- target.insertBefore(clonedBrand, target.childNodes[0]).classList.add(CLASS_NAME_CLONED_HEADER)
32
- }
33
- if (clonedSearch) {
34
- target.appendChild(clonedSearch).classList.add(CLASS_NAME_CLONED_HEADER)
35
- }
36
- if (clonedUser) {
37
- target.appendChild(clonedUser).classList.add(CLASS_NAME_CLONED_HEADER)
38
- target.appendChild(clonedUser).classList.remove(CLASS_NAME_SHOW)
35
+ this._bindEvents()
36
+
37
+ this._toggleClonedElement(this._element.classList.contains(CLASS_NAME_ISTICKY))
38
+ }
39
+
40
+ //Static
41
+
42
+ static getOrCreateInstance(element) {
43
+ return dataSet.get(element) || new this(element)
44
+ }
45
+
46
+ //Private
47
+
48
+ _bindEvents() {
49
+ this._element.addEventListener('on.bs.sticky', () => this._toggleClonedElement(true))
50
+ this._element.addEventListener('off.bs.sticky', () => this._toggleClonedElement(false))
51
+ }
52
+
53
+ _toggleClonedElement(toAdd = true) {
54
+ const isDesktop = !isVisible(SelectorEngine.findOne(SELECTOR_TOGGLER, this._element))
55
+
56
+ if (isDesktop) {
57
+ const target = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element)
58
+
59
+ if (toAdd) {
60
+ const elBrand = SelectorEngine.findOne(SELECTOR_BRAND_WRAPPER, this._element)
61
+ const elSearch = SelectorEngine.findOne(SELECTOR_SEARCH_WRAPPER, this._element)
62
+ const elUser = SelectorEngine.findOne(SELECTOR_USER_WRAPPER, this._element)
63
+
64
+ const clonedBrand = elBrand ? elBrand.cloneNode(true) : null
65
+ const clonedSearch = elSearch ? elSearch.cloneNode(true) : null
66
+ const clonedUser = elUser ? elUser.cloneNode(true) : null
67
+
68
+ if (clonedBrand) {
69
+ target.insertBefore(clonedBrand, target.childNodes[0]).classList.add(CLASS_NAME_CLONED_HEADER)
70
+ }
71
+ if (clonedSearch) {
72
+ target.appendChild(clonedSearch).classList.add(CLASS_NAME_CLONED_HEADER)
73
+ }
74
+ if (clonedUser) {
75
+ target.appendChild(clonedUser).classList.add(CLASS_NAME_CLONED_HEADER)
76
+ target.appendChild(clonedUser).classList.remove(CLASS_NAME_SHOW)
77
+ }
78
+ } else {
79
+ SelectorEngine.find(SELECTOR_CLONED, this._element).forEach((item) => {
80
+ item.parentElement.removeChild(item)
81
+ })
39
82
  }
40
- } else {
41
- SelectorEngine.find(SELECTOR_CLONED, targetHeader).forEach((item) => {
42
- item.parentElement.removeChild(item)
43
- })
44
83
  }
45
84
  }
46
85
 
@@ -51,11 +90,17 @@ const toggleClonedElement = (targetHeader, toAdd = true) => {
51
90
  }*/
52
91
  }
53
92
 
54
- const init = (targetHeader) => {
55
- targetHeader.addEventListener('on.bs.sticky', () => toggleClonedElement(targetHeader, true))
56
- targetHeader.addEventListener('off.bs.sticky', () => toggleClonedElement(targetHeader, false))
57
- }
93
+ /**
94
+ * ------------------------------------------------------------------------
95
+ * Data Api implementation
96
+ * ------------------------------------------------------------------------
97
+ */
58
98
 
59
- SelectorEngine.find(SELECTOR_HEADER).forEach((header) => {
60
- init(header)
99
+ onDocumentScroll(() => {
100
+ const stickies = SelectorEngine.find(SELECTOR_HEADER)
101
+ stickies.map((sticky) => {
102
+ HeaderSticky.getOrCreateInstance(sticky)
103
+ })
61
104
  })
105
+
106
+ export default HeaderSticky
@@ -1,7 +1,7 @@
1
1
  import BaseComponent from 'bootstrap/js/src/base-component.js'
2
2
 
3
3
  import EventHandler from 'bootstrap/js/src/dom/event-handler'
4
- import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
4
+ //import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
5
5
 
6
6
  const NAME = 'historyback'
7
7
  const DATA_KEY = 'bs.historyback'
@@ -46,13 +46,19 @@ class HistoryBack extends BaseComponent {
46
46
  * ------------------------------------------------------------------------
47
47
  */
48
48
 
49
- const toggles = SelectorEngine.find(SELECTOR_TOGGLE)
49
+ /*const toggles = SelectorEngine.find(SELECTOR_TOGGLE)
50
50
  toggles.forEach((toggle) => {
51
51
  EventHandler.one(toggle, EVENT_CLICK_DATA_API, (evt) => {
52
52
  evt.preventDefault()
53
53
  const historyBack = HistoryBack.getOrCreateInstance(toggle)
54
54
  historyBack.back()
55
55
  })
56
+ })*/
57
+
58
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_TOGGLE, function (evt) {
59
+ evt.preventDefault()
60
+ const historyBack = HistoryBack.getOrCreateInstance(this)
61
+ historyBack.back()
56
62
  })
57
63
 
58
64
  export default HistoryBack
@@ -0,0 +1,14 @@
1
+ import TrackFocus from './track-focus'
2
+
3
+ import BOOTSTRAP_ITALIA_VERSION from '../version'
4
+
5
+ const init = () => {
6
+ if (!window.BOOTSTRAP_ITALIA_VERSION) {
7
+ new TrackFocus()
8
+ window.BOOTSTRAP_ITALIA_VERSION = BOOTSTRAP_ITALIA_VERSION
9
+ }
10
+ }
11
+
12
+ export default init
13
+
14
+ init()
@@ -25,6 +25,10 @@ class InputLabel {
25
25
  return NAME
26
26
  }
27
27
 
28
+ static getInputFromLabel = (labelElement) => {
29
+ return document.querySelector('#' + labelElement.getAttribute('for'))
30
+ }
31
+
28
32
  // Public
29
33
 
30
34
  // Private
@@ -12,18 +12,21 @@ const DATA_API_KEY = '.data-api'
12
12
 
13
13
  const EVENT_CLICK = `click${EVENT_KEY}`
14
14
  const EVENT_CHANGE = `change${EVENT_KEY}`
15
- const EVENT_FOCUS_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY}`
15
+
16
+ //const EVENT_FOCUS_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY}`
16
17
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
18
+ const EVENT_MOUSEDOWN_DATA_API = `mousedown${EVENT_KEY}${DATA_API_KEY}`
19
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
17
20
 
18
21
  const CLASS_NAME_ADAPTIVE = 'input-number-adaptive'
19
22
  const CLASS_NAME_PERCENTAGE = 'input-number-percentage'
20
23
  const CLASS_NAME_CURRENCY = 'input-number-currency'
21
- const CLASS_NAME_INCREMENT = 'input-number-add'
24
+ //const CLASS_NAME_INCREMENT = 'input-number-add'
22
25
  const CLASS_NAME_DECREMENT = 'input-number-sub'
23
26
 
24
27
  const SELECTOR_WRAPPER = '.input-number'
25
28
  const SELECTOR_INPUT = 'input[data-bs-input][type="number"]'
26
- const SELECTOR_BTN = 'button'
29
+ const SELECTOR_BTN = 'button[class^="input-number-"]'
27
30
 
28
31
  class InputNumber extends BaseComponent {
29
32
  constructor(element) {
@@ -129,14 +132,8 @@ class InputNumber extends BaseComponent {
129
132
  * ------------------------------------------------------------------------
130
133
  */
131
134
 
132
- const inputs = SelectorEngine.find(SELECTOR_INPUT)
135
+ /*const inputs = SelectorEngine.find(SELECTOR_INPUT)
133
136
  inputs.forEach((input) => {
134
- /*const prevInst = BaseComponent.getInstance(input)
135
- if (prevInst.NAME === 'input') {
136
- prevInst.dispose()
137
- }
138
- InputNumber.getOrCreateInstance(input)*/
139
-
140
137
  EventHandler.one(input, EVENT_FOCUS_DATA_API, (evt) => {
141
138
  evt.preventDefault()
142
139
  InputNumber.getOrCreateInstance(input)
@@ -162,6 +159,34 @@ inputsButtons.forEach((button) => {
162
159
  }
163
160
  }
164
161
  })
162
+ })*/
163
+
164
+ const createInput = (element) => {
165
+ if (element && element.matches(SELECTOR_INPUT) && element.parentNode.querySelector(SELECTOR_BTN)) {
166
+ return InputNumber.getOrCreateInstance(element)
167
+ }
168
+ return null
169
+ }
170
+
171
+ EventHandler.on(document, EVENT_MOUSEDOWN_DATA_API, SELECTOR_INPUT + ', label', function () {
172
+ const target = InputLabel.getInputFromLabel(this) || this
173
+ createInput(target)
174
+ })
175
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_INPUT + ', label', function () {
176
+ const target = InputLabel.getInputFromLabel(this) || this
177
+ const element = createInput(target)
178
+ if (element && element._label) {
179
+ element._label._labelOut()
180
+ }
181
+ })
182
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_BTN, function () {
183
+ const wrapper = this.closest(SELECTOR_WRAPPER)
184
+ if (wrapper) {
185
+ const input = SelectorEngine.findOne(SELECTOR_INPUT, wrapper)
186
+ if (input) {
187
+ InputNumber.getOrCreateInstance(input)
188
+ }
189
+ }
165
190
  })
166
191
 
167
192
  export default InputNumber
@@ -9,7 +9,7 @@ import InputLabel from './input-label'
9
9
  const NAME = 'inputpassword'
10
10
  const DATA_KEY = 'bs.inputpassword'
11
11
  const EVENT_KEY = `.${DATA_KEY}`
12
- //const DATA_API_KEY = '.data-api'
12
+ const DATA_API_KEY = '.data-api'
13
13
 
14
14
  const Default = {
15
15
  shortPass: 'Password molto debole',
@@ -29,11 +29,21 @@ const EVENT_KEYPRESS = `keypress${EVENT_KEY}`
29
29
  const EVENT_SCORE = `score${EVENT_KEY}`
30
30
  const EVENT_TEXT = `text${EVENT_KEY}`
31
31
 
32
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
33
+ const EVENT_MOUSEDOWN_DATA_API = `mousedown${EVENT_KEY}${DATA_API_KEY}`
34
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
35
+
32
36
  const CLASS_NAME_PASSWORD = 'input-password'
33
- const CLASS_NAME_METER = 'input-password-strength-meter'
37
+ //const CLASS_NAME_METER = 'input-password-strength-meter'
38
+ const CLASS_NAME_SHOW = 'show'
34
39
 
35
40
  const SELECTOR_PASSWORD = 'input[data-bs-input][type="password"]'
36
41
  const SELECTOR_BTN_SHOW_PWD = '.password-icon'
42
+ const SELECTOR_METER = '.password-strength-meter'
43
+ const SELECTOR_METER_GRAYBAR = '.password-meter'
44
+ const SELECTOR_METER_COLBAR = '.progress-bar'
45
+ const SELECTOR_CAPS = '.password-caps'
46
+ const SELECTOR_TEXT = '.form-text'
37
47
 
38
48
  class InputPassword extends BaseComponent {
39
49
  constructor(element, config) {
@@ -41,7 +51,7 @@ class InputPassword extends BaseComponent {
41
51
 
42
52
  this._config = this._getConfig(config)
43
53
  this._isCustom = this._element.classList.contains(CLASS_NAME_PASSWORD)
44
- this._hasMeter = this._element.classList.contains(CLASS_NAME_METER)
54
+ this._meter = this._element.parentNode.querySelector(SELECTOR_METER)
45
55
  this._isShiftPressed = false
46
56
  this._isCapsOn = false
47
57
 
@@ -51,6 +61,8 @@ class InputPassword extends BaseComponent {
51
61
  this._capsElement = null
52
62
  this._showPwdElement = null
53
63
 
64
+ this._text = {}
65
+
54
66
  this._label = new InputLabel(element)
55
67
 
56
68
  this._init()
@@ -76,8 +88,8 @@ class InputPassword extends BaseComponent {
76
88
  }
77
89
 
78
90
  _init() {
79
- if (this._hasMeter) {
80
- this._grayBarElement = document.createElement('div')
91
+ if (this._meter) {
92
+ /*this._grayBarElement = document.createElement('div')
81
93
  this._grayBarElement.classList.add('password-meter', 'progress', 'rounded-0', 'position-absolute')
82
94
  this._grayBarElement.innerHTML = `<div class="row position-absolute w-100 m-0">
83
95
  <div class="col-3 border-start border-end border-white"></div>
@@ -107,22 +119,32 @@ class InputPassword extends BaseComponent {
107
119
 
108
120
  wrapper.appendChild(this._grayBarElement)
109
121
 
110
- this._element.parentNode.insertBefore(wrapper, this._element.nextSibling)
122
+ this._element.parentNode.insertBefore(wrapper, this._element.nextSibling)*/
123
+
124
+ this._grayBarElement = this._meter.querySelector(SELECTOR_METER_GRAYBAR)
125
+ this._colorBarElement = this._meter.querySelector(SELECTOR_METER_COLBAR)
126
+ this._textElement = this._meter.querySelector(SELECTOR_TEXT)
127
+
128
+ if (this._textElement) {
129
+ this._config = Object.assign({}, this._config, { ...Manipulator.getDataAttributes(this._textElement) }, { enterPass: this._textElement.innerText })
130
+ }
111
131
  }
112
132
  if (this._isCustom) {
113
- this._capsElement = document.createElement('small')
133
+ /*this._capsElement = document.createElement('small')
114
134
  this._capsElement.style.display = 'none'
115
135
  this._capsElement.classList.add('password-caps', 'form-text', 'text-warning', 'position-absolute', 'bg-white', 'w-100')
116
136
  this._capsElement.innerHTML = this._config.alertCaps
117
137
 
118
- this._element.parentNode.appendChild(this._capsElement)
138
+ this._element.parentNode.appendChild(this._capsElement)*/
139
+
140
+ this._capsElement = this._element.parentNode.querySelector(SELECTOR_CAPS)
119
141
  }
120
142
 
121
143
  this._showPwdElement = SelectorEngine.findOne(SELECTOR_BTN_SHOW_PWD, this._element.parentNode)
122
144
  }
123
145
 
124
146
  _bindEvents() {
125
- if (this._hasMeter) {
147
+ if (this._meter) {
126
148
  EventHandler.on(this._element, EVENT_KEYUP, () => this._checkPassword())
127
149
  }
128
150
 
@@ -163,10 +185,14 @@ class InputPassword extends BaseComponent {
163
185
  }
164
186
 
165
187
  _showCapsMsg() {
166
- this._capsElement.style.display = 'block'
188
+ if (this._capsElement) {
189
+ this._capsElement.classList.add(CLASS_NAME_SHOW)
190
+ }
167
191
  }
168
192
  _hideCapsMsg() {
169
- this._capsElement.style.display = 'none'
193
+ if (this._capsElement) {
194
+ this._capsElement.classList.remove(CLASS_NAME_SHOW)
195
+ }
170
196
  }
171
197
 
172
198
  _toggleShowPassword() {
@@ -194,7 +220,7 @@ class InputPassword extends BaseComponent {
194
220
 
195
221
  EventHandler.trigger(this._element, EVENT_SCORE)
196
222
 
197
- if (this._config.showText) {
223
+ if (this._textElement) {
198
224
  let text = this._scoreText(score)
199
225
  if (this._element.value.length === 0 && score <= 0) {
200
226
  text = this._config.enterPass
@@ -373,9 +399,34 @@ class InputPassword extends BaseComponent {
373
399
  * ------------------------------------------------------------------------
374
400
  */
375
401
 
376
- const inputs = SelectorEngine.find(SELECTOR_PASSWORD)
402
+ /*const inputs = SelectorEngine.find(SELECTOR_PASSWORD)
377
403
  inputs.forEach((input) => {
378
404
  InputPassword.getOrCreateInstance(input)
405
+ })*/
406
+
407
+ const createInput = (element) => {
408
+ if (element && element.matches(SELECTOR_PASSWORD)) {
409
+ return InputPassword.getOrCreateInstance(element)
410
+ }
411
+ return null
412
+ }
413
+
414
+ EventHandler.on(document, EVENT_MOUSEDOWN_DATA_API, SELECTOR_PASSWORD + ', label', function () {
415
+ const target = InputLabel.getInputFromLabel(this) || this
416
+ createInput(target)
417
+ })
418
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_PASSWORD + ', label', function () {
419
+ const target = InputLabel.getInputFromLabel(this) || this
420
+ const element = createInput(target)
421
+ if (element && element._label) {
422
+ element._label._labelOut()
423
+ }
424
+ })
425
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_BTN_SHOW_PWD, function () {
426
+ const target = this.parentNode && this.parentNode.querySelector(SELECTOR_PASSWORD)
427
+ if (target) {
428
+ InputPassword.getOrCreateInstance(target)
429
+ }
379
430
  })
380
431
 
381
432
  export default InputPassword
@@ -2,7 +2,7 @@
2
2
 
3
3
  import BaseComponent from 'bootstrap/js/src/base-component'
4
4
  import EventHandler from 'bootstrap/js/src/dom/event-handler'
5
- import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
5
+ //import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
6
6
 
7
7
  import InputLabel from './input-label'
8
8
 
@@ -17,6 +17,7 @@ const Default = {
17
17
 
18
18
  const EVENT_KEYUP = `keyup${EVENT_KEY}`
19
19
  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
20
+ const EVENT_MOUSEDOWN_DATA_API = `mousedown${EVENT_KEY}${DATA_API_KEY}`
20
21
 
21
22
  const CLASS_NAME_SHOW = 'autocomplete-list-show'
22
23
  const CLASS_NAME_AUTOCOMPLETE = 'autocomplete'
@@ -121,12 +122,31 @@ class InputSearch extends BaseComponent {
121
122
  * ------------------------------------------------------------------------
122
123
  */
123
124
 
124
- const inputs = SelectorEngine.find(SELECTOR_SEARCH)
125
+ /*const inputs = SelectorEngine.find(SELECTOR_SEARCH)
125
126
  inputs.forEach((input) => {
126
127
  EventHandler.one(input, EVENT_KEYUP_DATA_API, () => {
127
128
  const searchInput = InputSearch.getOrCreateInstance(input)
128
129
  searchInput.search()
129
130
  })
131
+ })*/
132
+
133
+ const createInput = (element) => {
134
+ if (element && element.matches(SELECTOR_SEARCH)) {
135
+ return InputSearch.getOrCreateInstance(element)
136
+ }
137
+ return null
138
+ }
139
+
140
+ EventHandler.on(document, EVENT_MOUSEDOWN_DATA_API, SELECTOR_SEARCH + ', label', function () {
141
+ const target = InputLabel.getInputFromLabel(this) || this
142
+ createInput(target)
143
+ })
144
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_SEARCH + ', label', function () {
145
+ const target = InputLabel.getInputFromLabel(this) || this
146
+ const element = createInput(target)
147
+ if (element && element._label) {
148
+ element._label._labelOut()
149
+ }
130
150
  })
131
151
 
132
152
  export default InputSearch
@@ -8,9 +8,10 @@ import InputLabel from './input-label'
8
8
  const NAME = 'input'
9
9
  const DATA_KEY = 'bs.input'
10
10
  const EVENT_KEY = `.${DATA_KEY}`
11
- //const DATA_API_KEY = '.data-api'
11
+ const DATA_API_KEY = '.data-api'
12
12
 
13
- //const SELECTOR_INPUT = 'input[data-bs-input]'
13
+ const EVENT_MOUSEDOWN_DATA_API = `mousedown${EVENT_KEY}${DATA_API_KEY}`
14
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
14
15
 
15
16
  const EVENT_CHANGE = `change${EVENT_KEY}`
16
17
 
@@ -66,13 +67,14 @@ class Input extends BaseComponent {
66
67
  */
67
68
  const excludes = [
68
69
  'select',
69
- 'input[data-bs-input][type="number"]',
70
+ //'input[data-bs-input][type="number"]',
70
71
  'input[data-bs-input][type="password"]',
72
+ 'input.input-password[data-bs-input]',
71
73
  'input[data-bs-autocomplete][type="search"]',
72
74
  'input[type="time"]',
73
75
  ]
74
76
 
75
- const inputs = SelectorEngine.find('input, textarea').filter((input) => {
77
+ /*const inputs = SelectorEngine.find('input, textarea').filter((input) => {
76
78
  let result = true
77
79
  excludes.forEach((selector) => {
78
80
  if (input.matches(selector)) {
@@ -83,6 +85,27 @@ const inputs = SelectorEngine.find('input, textarea').filter((input) => {
83
85
  })
84
86
  inputs.forEach((input) => {
85
87
  Input.getOrCreateInstance(input)
88
+ })*/
89
+
90
+ const createInput = (element) => {
91
+ const toExclude = !!excludes.find((selector) => element.matches(selector))
92
+ const isInputNumber = !!(element.getAttribute('type') === 'number' && element.parentNode.querySelector('button[class^="input-number-"]')) //check if it's a InputNumber component
93
+ if (!toExclude && !isInputNumber) {
94
+ return Input.getOrCreateInstance(element)
95
+ }
96
+ return null
97
+ }
98
+
99
+ EventHandler.on(document, EVENT_MOUSEDOWN_DATA_API, 'input, textarea, label', function () {
100
+ const target = InputLabel.getInputFromLabel(this) || this
101
+ createInput(target)
102
+ })
103
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, 'input, textarea, label', function () {
104
+ const target = InputLabel.getInputFromLabel(this) || this
105
+ const element = createInput(target)
106
+ if (element && element._label) {
107
+ element._label._labelOut()
108
+ }
86
109
  })
87
110
 
88
111
  export default Input
@@ -242,12 +242,11 @@ class NavScroll extends BaseComponent {
242
242
  * ------------------------------------------------------------------------
243
243
  */
244
244
 
245
- const dataApiCb = onDocumentScroll(() => {
245
+ onDocumentScroll(() => {
246
246
  const navs = SelectorEngine.find(SELECTOR_NAVSCROLL)
247
- navs.forEach((nav) => {
247
+ navs.map((nav) => {
248
248
  NavScroll.getOrCreateInstance(nav)
249
249
  })
250
- dataApiCb.dispose()
251
250
  })
252
251
 
253
252
  export default NavScroll
@@ -1,4 +1,3 @@
1
- import 'accessible-autocomplete/dist/accessible-autocomplete.min.css'
2
1
  import accessibleAutocomplete from 'accessible-autocomplete'
3
2
 
4
3
  import BaseComponent from 'bootstrap/js/src/base-component.js'
@@ -243,12 +243,11 @@ class Sticky extends BaseComponent {
243
243
  * ------------------------------------------------------------------------
244
244
  */
245
245
 
246
- const dataApiCb = onDocumentScroll(() => {
246
+ onDocumentScroll(() => {
247
247
  const stickies = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
248
- stickies.forEach((sticky) => {
248
+ stickies.map((sticky) => {
249
249
  Sticky.getOrCreateInstance(sticky)
250
250
  })
251
- dataApiCb.dispose()
252
251
  })
253
252
 
254
253
  export default Sticky
@@ -15,8 +15,10 @@ import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
15
15
  const NAME = 'transfer'
16
16
  const DATA_KEY = 'bs.transfer'
17
17
  const EVENT_KEY = `.${DATA_KEY}`
18
- //const DATA_API_KEY = '.data-api'
18
+ const DATA_API_KEY = '.data-api'
19
19
 
20
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
21
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
20
22
  //const EVENT_SCROLL = `scroll${EVENT_KEY}`
21
23
  const EVENT_CLICK = `click${EVENT_KEY}`
22
24
 
@@ -258,8 +260,15 @@ class Transfer extends BaseComponent {
258
260
  * ------------------------------------------------------------------------
259
261
  */
260
262
 
261
- SelectorEngine.find(SELECTOR_BLOCK).forEach((block) => {
263
+ /*SelectorEngine.find(SELECTOR_BLOCK).forEach((block) => {
262
264
  Transfer.getOrCreateInstance(block)
265
+ })*/
266
+
267
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_BLOCK + ' .form-check label', function () {
268
+ Transfer.getOrCreateInstance(this.closest(SELECTOR_BLOCK))
269
+ })
270
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_BLOCK + ' .form-check label', function () {
271
+ Transfer.getOrCreateInstance(this.closest(SELECTOR_BLOCK))
263
272
  })
264
273
 
265
274
  export default Transfer
@@ -6,9 +6,11 @@ import SelectorEngine from 'bootstrap/js/src/dom/selector-engine'
6
6
  import ProgressDonut from './progress-donut'
7
7
 
8
8
  const NAME = 'upload'
9
- //const DATA_KEY = 'bs.upload'
10
- //const EVENT_KEY = `.${DATA_KEY}`
11
- //const DATA_API_KEY = '.data-api'
9
+ const DATA_KEY = 'bs.upload'
10
+ const EVENT_KEY = `.${DATA_KEY}`
11
+ const DATA_API_KEY = '.data-api'
12
+
13
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
12
14
 
13
15
  const EVENT_DRAG = `drag`
14
16
  const EVENT_DRAG_START = `dragstart`
@@ -120,8 +122,23 @@ class UploadDragDrop extends BaseComponent {
120
122
  * ------------------------------------------------------------------------
121
123
  */
122
124
 
123
- SelectorEngine.find(SELECTOR_FORM).forEach((form) => {
125
+ /*SelectorEngine.find(SELECTOR_FORM).forEach((form) => {
124
126
  UploadDragDrop.getOrCreateInstance(form)
127
+ })*/
128
+
129
+ const createInput = (element) => {
130
+ let found = element.matches && element.matches(SELECTOR_FORM) ? element : element.closest ? element.closest(SELECTOR_FORM) : null
131
+ if (found) {
132
+ UploadDragDrop.getOrCreateInstance(found)
133
+ }
134
+ return null
135
+ }
136
+
137
+ document.addEventListener('dragenter', function (evt) {
138
+ createInput(evt.target)
139
+ })
140
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM + ' label', function () {
141
+ createInput(this)
125
142
  })
126
143
 
127
144
  export default UploadDragDrop