inkstream 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +93 -0
  4. data/_config.yml +122 -0
  5. data/_includes/button.html +4 -0
  6. data/_includes/icon.html +1 -0
  7. data/_includes/nav-default.html +23 -0
  8. data/_includes/nav-header.html +25 -0
  9. data/_includes/post-list.html +59 -0
  10. data/_includes/post-meta.html +0 -0
  11. data/_includes/post-pagination.html +29 -0
  12. data/_includes/promo-section.html +12 -0
  13. data/_includes/site-before-end.html +1 -0
  14. data/_includes/site-before-start.html +1 -0
  15. data/_includes/site-favicons.html +7 -0
  16. data/_includes/site-fonts.html +13 -0
  17. data/_includes/site-footer-default.html +17 -0
  18. data/_includes/site-footer.html +12 -0
  19. data/_includes/site-header.html +46 -0
  20. data/_includes/site-styles.html +6 -0
  21. data/_layouts/blog.html +24 -0
  22. data/_layouts/default.html +62 -0
  23. data/_layouts/page.html +35 -0
  24. data/_layouts/post.html +201 -0
  25. data/assets/css/styles.css +11167 -0
  26. data/assets/images/about-me.jpg +0 -0
  27. data/assets/images/blog/blog-post-banner.jpg +0 -0
  28. data/assets/images/blog/blog-post-thumb-1.jpg +0 -0
  29. data/assets/images/blog/blog-post-thumb-10.jpg +0 -0
  30. data/assets/images/blog/blog-post-thumb-11.jpg +0 -0
  31. data/assets/images/blog/blog-post-thumb-12.jpg +0 -0
  32. data/assets/images/blog/blog-post-thumb-2.jpg +0 -0
  33. data/assets/images/blog/blog-post-thumb-3.jpg +0 -0
  34. data/assets/images/blog/blog-post-thumb-4.jpg +0 -0
  35. data/assets/images/blog/blog-post-thumb-5.jpg +0 -0
  36. data/assets/images/blog/blog-post-thumb-6.jpg +0 -0
  37. data/assets/images/blog/blog-post-thumb-7.jpg +0 -0
  38. data/assets/images/blog/blog-post-thumb-8.jpg +0 -0
  39. data/assets/images/blog/blog-post-thumb-9.jpg +0 -0
  40. data/assets/images/posts/default-post-img.jpg +0 -0
  41. data/assets/images/posts/text-syntax.jpg +0 -0
  42. data/assets/images/posts/welcome.jpg +0 -0
  43. data/assets/images/profile.png +0 -0
  44. data/assets/images/promo-banner.jpg +0 -0
  45. data/assets/js/blog.js +9 -0
  46. data/assets/js/demo/style-switcher.js +45 -0
  47. data/assets/plugins/bootstrap/js/bootstrap.min.js +7 -0
  48. data/assets/plugins/jquery-3.3.1.min.js +2 -0
  49. data/assets/plugins/popper.min.js +5 -0
  50. data/assets/scss/bootstrap/js/dist/alert.js +199 -0
  51. data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
  52. data/assets/scss/bootstrap/js/dist/button.js +187 -0
  53. data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
  54. data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
  55. data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
  56. data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
  57. data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
  58. data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
  59. data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
  60. data/assets/scss/bootstrap/js/dist/index.js +23 -0
  61. data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
  62. data/assets/scss/bootstrap/js/dist/modal.js +650 -0
  63. data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
  64. data/assets/scss/bootstrap/js/dist/popover.js +261 -0
  65. data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
  66. data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
  67. data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
  68. data/assets/scss/bootstrap/js/dist/tab.js +269 -0
  69. data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
  70. data/assets/scss/bootstrap/js/dist/toast.js +283 -0
  71. data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
  72. data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
  73. data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
  74. data/assets/scss/bootstrap/js/dist/util.js +172 -0
  75. data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
  76. data/assets/scss/bootstrap/js/src/alert.js +179 -0
  77. data/assets/scss/bootstrap/js/src/button.js +171 -0
  78. data/assets/scss/bootstrap/js/src/carousel.js +606 -0
  79. data/assets/scss/bootstrap/js/src/collapse.js +402 -0
  80. data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
  81. data/assets/scss/bootstrap/js/src/index.js +52 -0
  82. data/assets/scss/bootstrap/js/src/modal.js +594 -0
  83. data/assets/scss/bootstrap/js/src/popover.js +184 -0
  84. data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
  85. data/assets/scss/bootstrap/js/src/tab.js +260 -0
  86. data/assets/scss/bootstrap/js/src/toast.js +227 -0
  87. data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
  88. data/assets/scss/bootstrap/js/src/util.js +177 -0
  89. data/assets/scss/bootstrap/js/tests/README.md +69 -0
  90. data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
  91. data/assets/scss/bootstrap/js/tests/index.html +133 -0
  92. data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
  93. data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
  94. data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  95. data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
  96. data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  97. data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
  98. data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
  99. data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
  100. data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
  101. data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
  102. data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
  103. data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
  104. data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
  105. data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
  106. data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
  107. data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
  108. data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
  109. data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
  110. data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
  111. data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
  112. data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
  113. data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
  114. data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
  115. data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
  116. data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
  117. data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
  118. data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
  119. data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
  120. data/assets/scss/bootstrap/scss/_alert.scss +51 -0
  121. data/assets/scss/bootstrap/scss/_badge.scss +54 -0
  122. data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
  123. data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
  124. data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
  125. data/assets/scss/bootstrap/scss/_card.scss +289 -0
  126. data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
  127. data/assets/scss/bootstrap/scss/_close.scss +41 -0
  128. data/assets/scss/bootstrap/scss/_code.scss +48 -0
  129. data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
  130. data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
  131. data/assets/scss/bootstrap/scss/_forms.scss +330 -0
  132. data/assets/scss/bootstrap/scss/_functions.scss +86 -0
  133. data/assets/scss/bootstrap/scss/_grid.scss +52 -0
  134. data/assets/scss/bootstrap/scss/_images.scss +42 -0
  135. data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
  136. data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
  137. data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
  138. data/assets/scss/bootstrap/scss/_media.scss +8 -0
  139. data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
  140. data/assets/scss/bootstrap/scss/_modal.scss +229 -0
  141. data/assets/scss/bootstrap/scss/_nav.scss +120 -0
  142. data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
  143. data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
  144. data/assets/scss/bootstrap/scss/_popover.scss +171 -0
  145. data/assets/scss/bootstrap/scss/_print.scss +141 -0
  146. data/assets/scss/bootstrap/scss/_progress.scss +43 -0
  147. data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
  148. data/assets/scss/bootstrap/scss/_root.scss +19 -0
  149. data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
  150. data/assets/scss/bootstrap/scss/_tables.scss +185 -0
  151. data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
  152. data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
  153. data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
  154. data/assets/scss/bootstrap/scss/_type.scss +125 -0
  155. data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
  156. data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
  157. data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
  158. data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
  159. data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
  160. data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
  161. data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
  162. data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
  163. data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
  164. data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  165. data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  166. data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
  167. data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
  168. data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
  169. data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
  170. data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
  171. data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
  172. data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
  173. data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  174. data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
  175. data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
  176. data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
  177. data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
  178. data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
  179. data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  180. data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
  181. data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
  182. data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
  183. data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  184. data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
  185. data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
  186. data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
  187. data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
  188. data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  189. data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
  190. data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
  191. data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
  192. data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
  193. data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
  194. data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
  195. data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
  196. data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
  197. data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
  198. data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
  199. data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
  200. data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
  201. data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  202. data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
  203. data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
  204. data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
  205. data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  206. data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
  207. data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
  208. data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
  209. data/assets/scss/theme/_about.scss +28 -0
  210. data/assets/scss/theme/_base.scss +207 -0
  211. data/assets/scss/theme/_blog.scss +140 -0
  212. data/assets/scss/theme/_demo.scss +153 -0
  213. data/assets/scss/theme/_mixins.scss +34 -0
  214. data/assets/scss/theme/_responsive.scss +88 -0
  215. data/assets/scss/theme/styles.scss +14 -0
  216. data/assets/scss/theme-8.scss +41 -0
  217. data/assets/styles.scss +6 -0
  218. metadata +219 -3
@@ -0,0 +1,1419 @@
1
+ $(function () {
2
+ 'use strict'
3
+
4
+ QUnit.module('dropdowns plugin')
5
+
6
+ QUnit.test('should be defined on jquery object', function (assert) {
7
+ assert.expect(1)
8
+ assert.ok($(document.body).dropdown, 'dropdown method is defined')
9
+ })
10
+
11
+ QUnit.module('dropdowns', {
12
+ beforeEach: function () {
13
+ // Run all tests in noConflict mode -- it's the only way to ensure that the plugin works in noConflict mode
14
+ $.fn.bootstrapDropdown = $.fn.dropdown.noConflict()
15
+ },
16
+ afterEach: function () {
17
+ $.fn.dropdown = $.fn.bootstrapDropdown
18
+ delete $.fn.bootstrapDropdown
19
+ $('#qunit-fixture').html('')
20
+ }
21
+ })
22
+
23
+ QUnit.test('should provide no conflict', function (assert) {
24
+ assert.expect(1)
25
+ assert.strictEqual(typeof $.fn.dropdown, 'undefined', 'dropdown was set back to undefined (org value)')
26
+ })
27
+
28
+ QUnit.test('should throw explicit error on undefined method', function (assert) {
29
+ assert.expect(1)
30
+ var $el = $('<div/>')
31
+ $el.bootstrapDropdown()
32
+ try {
33
+ $el.bootstrapDropdown('noMethod')
34
+ } catch (err) {
35
+ assert.strictEqual(err.message, 'No method named "noMethod"')
36
+ }
37
+ })
38
+
39
+ QUnit.test('should return jquery collection containing the element', function (assert) {
40
+ assert.expect(2)
41
+ var $el = $('<div/>')
42
+ var $dropdown = $el.bootstrapDropdown()
43
+ assert.ok($dropdown instanceof $, 'returns jquery collection')
44
+ assert.strictEqual($dropdown[0], $el[0], 'collection contains element')
45
+ })
46
+
47
+ QUnit.test('should not open dropdown if target is disabled via attribute', function (assert) {
48
+ assert.expect(1)
49
+ var done = assert.async()
50
+ var dropdownHTML = '<div class="tabs">' +
51
+ '<div class="dropdown">' +
52
+ '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' +
53
+ '<div class="dropdown-menu">' +
54
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
55
+ '<a class="dropdown-item" href="#">Something else here</a>' +
56
+ '<div class="divider"/>' +
57
+ '<a class="dropdown-item" href="#">Another link</a>' +
58
+ '</div>' +
59
+ '</div>' +
60
+ '</div>'
61
+ $(dropdownHTML).appendTo('#qunit-fixture')
62
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
63
+ $dropdown.on('click', function () {
64
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
65
+ done()
66
+ })
67
+ $dropdown.trigger($.Event('click'))
68
+ })
69
+
70
+ QUnit.test('should not add class position-static to dropdown if boundary not set', function (assert) {
71
+ assert.expect(1)
72
+ var done = assert.async()
73
+ var dropdownHTML = '<div class="tabs">' +
74
+ '<div class="dropdown">' +
75
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
76
+ '<div class="dropdown-menu">' +
77
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
78
+ '<a class="dropdown-item" href="#">Something else here</a>' +
79
+ '</div>' +
80
+ '</div>' +
81
+ '</div>'
82
+ var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown()
83
+ $dropdown
84
+ .parent('.dropdown')
85
+ .on('shown.bs.dropdown', function () {
86
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('position-static'), '"position-static" class not added')
87
+ done()
88
+ })
89
+ $dropdown.trigger('click')
90
+ })
91
+
92
+ QUnit.test('should add class position-static to dropdown if boundary not scrollParent', function (assert) {
93
+ assert.expect(1)
94
+ var done = assert.async()
95
+ var dropdownHTML = '<div class="tabs">' +
96
+ '<div class="dropdown">' +
97
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown" data-boundary="viewport">Dropdown</a>' +
98
+ '<div class="dropdown-menu">' +
99
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
100
+ '<a class="dropdown-item" href="#">Something else here</a>' +
101
+ '</div>' +
102
+ '</div>' +
103
+ '</div>'
104
+ var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown()
105
+ $dropdown
106
+ .parent('.dropdown')
107
+ .on('shown.bs.dropdown', function () {
108
+ assert.ok($dropdown.parent('.dropdown').hasClass('position-static'), '"position-static" class added')
109
+ done()
110
+ })
111
+ $dropdown.trigger('click')
112
+ })
113
+
114
+ QUnit.test('should set aria-expanded="true" on target when dropdown menu is shown', function (assert) {
115
+ assert.expect(1)
116
+ var done = assert.async()
117
+ var dropdownHTML = '<div class="tabs">' +
118
+ '<div class="dropdown">' +
119
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Dropdown</a>' +
120
+ '<div class="dropdown-menu">' +
121
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
122
+ '<a class="dropdown-item" href="#">Something else here</a>' +
123
+ '<div class="divider"/>' +
124
+ '<a class="dropdown-item" href="#">Another link</a>' +
125
+ '</div>' +
126
+ '</div>' +
127
+ '</div>'
128
+ var $dropdown = $(dropdownHTML)
129
+ .appendTo('#qunit-fixture')
130
+ .find('[data-toggle="dropdown"]')
131
+ .bootstrapDropdown()
132
+ $dropdown
133
+ .parent('.dropdown')
134
+ .on('shown.bs.dropdown', function () {
135
+ assert.strictEqual($dropdown.attr('aria-expanded'), 'true', 'aria-expanded is set to string "true" on click')
136
+ done()
137
+ })
138
+ $dropdown.trigger('click')
139
+ })
140
+
141
+ QUnit.test('should set aria-expanded="false" on target when dropdown menu is hidden', function (assert) {
142
+ assert.expect(1)
143
+ var done = assert.async()
144
+ var dropdownHTML = '<div class="tabs">' +
145
+ '<div class="dropdown">' +
146
+ '<a href="#" class="dropdown-toggle" aria-expanded="false" data-toggle="dropdown">Dropdown</a>' +
147
+ '<div class="dropdown-menu">' +
148
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
149
+ '<a class="dropdown-item" href="#">Something else here</a>' +
150
+ '<div class="divider"/>' +
151
+ '<a class="dropdown-item" href="#">Another link</a>' +
152
+ '</div>' +
153
+ '</div>' +
154
+ '</div>'
155
+ var $dropdown = $(dropdownHTML)
156
+ .appendTo('#qunit-fixture')
157
+ .find('[data-toggle="dropdown"]')
158
+ .bootstrapDropdown()
159
+
160
+ $dropdown
161
+ .parent('.dropdown')
162
+ .on('hidden.bs.dropdown', function () {
163
+ assert.strictEqual($dropdown.attr('aria-expanded'), 'false', 'aria-expanded is set to string "false" on hide')
164
+ done()
165
+ })
166
+
167
+ $dropdown.trigger('click')
168
+ $(document.body).trigger('click')
169
+ })
170
+
171
+ QUnit.test('should not open dropdown if target is disabled via class', function (assert) {
172
+ assert.expect(1)
173
+ var done = assert.async()
174
+ var dropdownHTML = '<div class="tabs">' +
175
+ '<div class="dropdown">' +
176
+ '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' +
177
+ '<div class="dropdown-menu">' +
178
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
179
+ '<a class="dropdown-item" href="#">Something else here</a>' +
180
+ '<div class="divider"/>' +
181
+ '<a class="dropdown-item" href="#">Another link</a>' +
182
+ '</div>' +
183
+ '</div>' +
184
+ '</div>'
185
+
186
+ $(dropdownHTML).appendTo('#qunit-fixture')
187
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
188
+ $dropdown.on('click', function () {
189
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
190
+ done()
191
+ })
192
+ $dropdown.trigger($.Event('click'))
193
+ })
194
+
195
+ QUnit.test('should add class show to menu if clicked', function (assert) {
196
+ assert.expect(1)
197
+ var done = assert.async()
198
+ var dropdownHTML = '<div class="tabs">' +
199
+ '<div class="dropdown">' +
200
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
201
+ '<div class="dropdown-menu">' +
202
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
203
+ '<a class="dropdown-item" href="#">Something else here</a>' +
204
+ '<div class="divider"/>' +
205
+ '<a class="dropdown-item" href="#">Another link</a>' +
206
+ '</div>' +
207
+ '</div>' +
208
+ '</div>'
209
+ var $dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').bootstrapDropdown()
210
+ $dropdown
211
+ .parent('.dropdown')
212
+ .on('shown.bs.dropdown', function () {
213
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
214
+ done()
215
+ })
216
+ $dropdown.trigger('click')
217
+ })
218
+
219
+ QUnit.test('should remove "show" class if body is clicked', function (assert) {
220
+ assert.expect(2)
221
+ var done = assert.async()
222
+ var dropdownHTML = '<div class="tabs">' +
223
+ '<div class="dropdown">' +
224
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
225
+ '<div class="dropdown-menu">' +
226
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
227
+ '<a class="dropdown-item" href="#">Something else here</a>' +
228
+ '<div class="divider"/>' +
229
+ '<a class="dropdown-item" href="#">Another link</a>' +
230
+ '</div>' +
231
+ '</div>' +
232
+ '</div>'
233
+ var $dropdown = $(dropdownHTML)
234
+ .appendTo('#qunit-fixture')
235
+ .find('[data-toggle="dropdown"]')
236
+ .bootstrapDropdown()
237
+
238
+ $dropdown
239
+ .parent('.dropdown')
240
+ .on('shown.bs.dropdown', function () {
241
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
242
+ $(document.body).trigger('click')
243
+ }).on('hidden.bs.dropdown', function () {
244
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
245
+ done()
246
+ })
247
+ $dropdown.trigger('click')
248
+ })
249
+
250
+ QUnit.test('should remove "show" class if tabbing outside of menu', function (assert) {
251
+ assert.expect(2)
252
+ var done = assert.async()
253
+ var dropdownHTML = '<div class="tabs">' +
254
+ '<div class="dropdown">' +
255
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
256
+ '<div class="dropdown-menu">' +
257
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
258
+ '<a class="dropdown-item" href="#">Something else here</a>' +
259
+ '<div class="dropdown-divider"/>' +
260
+ '<a class="dropdown-item" href="#">Another link</a>' +
261
+ '</div>' +
262
+ '</div>' +
263
+ '</div>'
264
+ var $dropdown = $(dropdownHTML)
265
+ .appendTo('#qunit-fixture')
266
+ .find('[data-toggle="dropdown"]')
267
+ .bootstrapDropdown()
268
+ $dropdown
269
+ .parent('.dropdown')
270
+ .on('shown.bs.dropdown', function () {
271
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), '"show" class added on click')
272
+ var e = $.Event('keyup')
273
+ e.which = 9 // Tab
274
+ $(document.body).trigger(e)
275
+ }).on('hidden.bs.dropdown', function () {
276
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), '"show" class removed')
277
+ done()
278
+ })
279
+ $dropdown.trigger('click')
280
+ })
281
+
282
+ QUnit.test('should remove "show" class if body is clicked, with multiple dropdowns', function (assert) {
283
+ assert.expect(7)
284
+ var done = assert.async()
285
+ var dropdownHTML = '<div class="nav">' +
286
+ '<div class="dropdown" id="testmenu">' +
287
+ '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>' +
288
+ '<div class="dropdown-menu">' +
289
+ '<a class="dropdown-item" href="#sub1">Submenu 1</a>' +
290
+ '</div>' +
291
+ '</div>' +
292
+ '</div>' +
293
+ '<div class="btn-group">' +
294
+ '<button class="btn">Actions</button>' +
295
+ '<button class="btn dropdown-toggle" data-toggle="dropdown"></button>' +
296
+ '<div class="dropdown-menu">' +
297
+ '<a class="dropdown-item" href="#">Action 1</a>' +
298
+ '</div>' +
299
+ '</div>'
300
+ var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
301
+ var $first = $dropdowns.first()
302
+ var $last = $dropdowns.last()
303
+
304
+ assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
305
+
306
+ $first.parent('.dropdown')
307
+ .on('shown.bs.dropdown', function () {
308
+ assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
309
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
310
+ $(document.body).trigger('click')
311
+ }).on('hidden.bs.dropdown', function () {
312
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
313
+ $last.trigger('click')
314
+ })
315
+
316
+ $last.parent('.btn-group')
317
+ .on('shown.bs.dropdown', function () {
318
+ assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
319
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
320
+ $(document.body).trigger('click')
321
+ }).on('hidden.bs.dropdown', function () {
322
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
323
+ done()
324
+ })
325
+ $first.trigger('click')
326
+ })
327
+
328
+ QUnit.test('should remove "show" class if body if tabbing outside of menu, with multiple dropdowns', function (assert) {
329
+ assert.expect(7)
330
+ var done = assert.async()
331
+ var dropdownHTML = '<div class="nav">' +
332
+ '<div class="dropdown" id="testmenu">' +
333
+ '<a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <span class="caret"/></a>' +
334
+ '<div class="dropdown-menu">' +
335
+ '<a class="dropdown-item" href="#sub1">Submenu 1</a>' +
336
+ '</div>' +
337
+ '</div>' +
338
+ '</div>' +
339
+ '<div class="btn-group">' +
340
+ '<button class="btn">Actions</button>' +
341
+ '<button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"/></button>' +
342
+ '<div class="dropdown-menu">' +
343
+ '<a class="dropdown-item" href="#">Action 1</a>' +
344
+ '</div>' +
345
+ '</div>'
346
+ var $dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
347
+ var $first = $dropdowns.first()
348
+ var $last = $dropdowns.last()
349
+
350
+ assert.strictEqual($dropdowns.length, 2, 'two dropdowns')
351
+
352
+ $first.parent('.dropdown')
353
+ .on('shown.bs.dropdown', function () {
354
+ assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
355
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
356
+ var e = $.Event('keyup')
357
+ e.which = 9 // Tab
358
+ $(document.body).trigger(e)
359
+ }).on('hidden.bs.dropdown', function () {
360
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
361
+ $last.trigger('click')
362
+ })
363
+
364
+ $last.parent('.btn-group')
365
+ .on('shown.bs.dropdown', function () {
366
+ assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
367
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
368
+ var e = $.Event('keyup')
369
+ e.which = 9 // Tab
370
+ $(document.body).trigger(e)
371
+ }).on('hidden.bs.dropdown', function () {
372
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
373
+ done()
374
+ })
375
+ $first.trigger('click')
376
+ })
377
+
378
+ QUnit.test('should fire show and hide event', function (assert) {
379
+ assert.expect(2)
380
+ var dropdownHTML = '<div class="tabs">' +
381
+ '<div class="dropdown">' +
382
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
383
+ '<div class="dropdown-menu">' +
384
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
385
+ '<a class="dropdown-item" href="#">Something else here</a>' +
386
+ '<div class="divider"/>' +
387
+ '<a class="dropdown-item" href="#">Another link</a>' +
388
+ '</div>' +
389
+ '</div>' +
390
+ '</div>'
391
+ var $dropdown = $(dropdownHTML)
392
+ .appendTo('#qunit-fixture')
393
+ .find('[data-toggle="dropdown"]')
394
+ .bootstrapDropdown()
395
+
396
+ var done = assert.async()
397
+
398
+ $dropdown
399
+ .parent('.dropdown')
400
+ .on('show.bs.dropdown', function () {
401
+ assert.ok(true, 'show was fired')
402
+ })
403
+ .on('hide.bs.dropdown', function () {
404
+ assert.ok(true, 'hide was fired')
405
+ done()
406
+ })
407
+
408
+ $dropdown.trigger('click')
409
+ $(document.body).trigger('click')
410
+ })
411
+
412
+ QUnit.test('should fire shown and hidden event', function (assert) {
413
+ assert.expect(2)
414
+ var dropdownHTML = '<div class="tabs">' +
415
+ '<div class="dropdown">' +
416
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
417
+ '<div class="dropdown-menu">' +
418
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
419
+ '<a class="dropdown-item" href="#">Something else here</a>' +
420
+ '<div class="divider"/>' +
421
+ '<a class="dropdown-item" href="#">Another link</a>' +
422
+ '</div>' +
423
+ '</div>' +
424
+ '</div>'
425
+ var $dropdown = $(dropdownHTML)
426
+ .appendTo('#qunit-fixture')
427
+ .find('[data-toggle="dropdown"]')
428
+ .bootstrapDropdown()
429
+
430
+ var done = assert.async()
431
+
432
+ $dropdown
433
+ .parent('.dropdown')
434
+ .on('shown.bs.dropdown', function () {
435
+ assert.ok(true, 'shown was fired')
436
+ })
437
+ .on('hidden.bs.dropdown', function () {
438
+ assert.ok(true, 'hidden was fired')
439
+ done()
440
+ })
441
+
442
+ $dropdown.trigger('click')
443
+ $(document.body).trigger('click')
444
+ })
445
+
446
+ QUnit.test('should fire shown and hidden event with a relatedTarget', function (assert) {
447
+ assert.expect(2)
448
+ var dropdownHTML = '<div class="tabs">' +
449
+ '<div class="dropdown">' +
450
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
451
+ '<div class="dropdown-menu">' +
452
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
453
+ '<a class="dropdown-item" href="#">Something else here</a>' +
454
+ '<div class="divider"/>' +
455
+ '<a class="dropdown-item" href="#">Another link</a>' +
456
+ '</div>' +
457
+ '</div>' +
458
+ '</div>'
459
+ var $dropdown = $(dropdownHTML)
460
+ .appendTo('#qunit-fixture')
461
+ .find('[data-toggle="dropdown"]')
462
+ .bootstrapDropdown()
463
+ var done = assert.async()
464
+
465
+ $dropdown.parent('.dropdown')
466
+ .on('hidden.bs.dropdown', function (e) {
467
+ assert.strictEqual(e.relatedTarget, $dropdown[0])
468
+ done()
469
+ })
470
+ .on('shown.bs.dropdown', function (e) {
471
+ assert.strictEqual(e.relatedTarget, $dropdown[0])
472
+ $(document.body).trigger('click')
473
+ })
474
+
475
+ $dropdown.trigger('click')
476
+ })
477
+
478
+ QUnit.test('should fire hide and hidden event with a clickEvent', function (assert) {
479
+ assert.expect(3)
480
+ var dropdownHTML = '<div class="tabs">' +
481
+ '<div class="dropdown">' +
482
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
483
+ '<div class="dropdown-menu">' +
484
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
485
+ '<a class="dropdown-item" href="#">Something else here</a>' +
486
+ '<div class="divider"/>' +
487
+ '<a class="dropdown-item" href="#">Another link</a>' +
488
+ '</div>' +
489
+ '</div>' +
490
+ '</div>'
491
+ var $dropdown = $(dropdownHTML)
492
+ .appendTo('#qunit-fixture')
493
+ .find('[data-toggle="dropdown"]')
494
+ .bootstrapDropdown()
495
+
496
+ $dropdown.parent('.dropdown')
497
+ .on('hide.bs.dropdown', function (e) {
498
+ assert.ok(e.clickEvent)
499
+ })
500
+ .on('hidden.bs.dropdown', function (e) {
501
+ assert.ok(e.clickEvent)
502
+ })
503
+ .on('shown.bs.dropdown', function () {
504
+ assert.ok(true, 'shown was fired')
505
+ $(document.body).trigger('click')
506
+ })
507
+
508
+ $dropdown.trigger('click')
509
+ })
510
+
511
+ QUnit.test('should fire hide and hidden event without a clickEvent if event type is not click', function (assert) {
512
+ assert.expect(3)
513
+ var dropdownHTML = '<div class="tabs">' +
514
+ '<div class="dropdown">' +
515
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
516
+ '<div class="dropdown-menu">' +
517
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
518
+ '<a class="dropdown-item" href="#">Something else here</a>' +
519
+ '<div class="divider"/>' +
520
+ '<a class="dropdown-item" href="#">Another link</a>' +
521
+ '</div>' +
522
+ '</div>' +
523
+ '</div>'
524
+ var $dropdown = $(dropdownHTML)
525
+ .appendTo('#qunit-fixture')
526
+ .find('[data-toggle="dropdown"]')
527
+ .bootstrapDropdown()
528
+
529
+ $dropdown.parent('.dropdown')
530
+ .on('hide.bs.dropdown', function (e) {
531
+ assert.notOk(e.clickEvent)
532
+ })
533
+ .on('hidden.bs.dropdown', function (e) {
534
+ assert.notOk(e.clickEvent)
535
+ })
536
+ .on('shown.bs.dropdown', function () {
537
+ assert.ok(true, 'shown was fired')
538
+ $dropdown.trigger($.Event('keydown', {
539
+ which: 27
540
+ }))
541
+ })
542
+
543
+ $dropdown.trigger('click')
544
+ })
545
+
546
+ QUnit.test('should ignore keyboard events within <input>s and <textarea>s', function (assert) {
547
+ assert.expect(3)
548
+ var done = assert.async()
549
+
550
+ var dropdownHTML = '<div class="tabs">' +
551
+ '<div class="dropdown">' +
552
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
553
+ '<div class="dropdown-menu">' +
554
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
555
+ '<a class="dropdown-item" href="#">Something else here</a>' +
556
+ '<div class="divider"/>' +
557
+ '<a class="dropdown-item" href="#">Another link</a>' +
558
+ '<input type="text" id="input">' +
559
+ '<textarea id="textarea"/>' +
560
+ '</div>' +
561
+ '</div>' +
562
+ '</div>'
563
+ var $dropdown = $(dropdownHTML)
564
+ .appendTo('#qunit-fixture')
565
+ .find('[data-toggle="dropdown"]')
566
+ .bootstrapDropdown()
567
+
568
+ var $input = $('#input')
569
+ var $textarea = $('#textarea')
570
+
571
+ $dropdown
572
+ .parent('.dropdown')
573
+ .on('shown.bs.dropdown', function () {
574
+ assert.ok(true, 'shown was fired')
575
+
576
+ $input.trigger('focus').trigger($.Event('keydown', {
577
+ which: 38
578
+ }))
579
+ assert.ok($(document.activeElement).is($input), 'input still focused')
580
+
581
+ $textarea.trigger('focus').trigger($.Event('keydown', {
582
+ which: 38
583
+ }))
584
+ assert.ok($(document.activeElement).is($textarea), 'textarea still focused')
585
+
586
+ done()
587
+ })
588
+
589
+ $dropdown.trigger('click')
590
+ })
591
+
592
+ QUnit.test('should skip disabled element when using keyboard navigation', function (assert) {
593
+ assert.expect(3)
594
+ var done = assert.async()
595
+ var dropdownHTML = '<div class="tabs">' +
596
+ '<div class="dropdown">' +
597
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
598
+ '<div class="dropdown-menu">' +
599
+ '<a class="dropdown-item disabled" href="#">Disabled link</a>' +
600
+ '<button class="dropdown-item" type="button" disabled>Disabled button</button>' +
601
+ '<a id="item1" class="dropdown-item" href="#">Another link</a>' +
602
+ '</div>' +
603
+ '</div>' +
604
+ '</div>'
605
+ var $dropdown = $(dropdownHTML)
606
+ .appendTo('#qunit-fixture')
607
+ .find('[data-toggle="dropdown"]')
608
+ .bootstrapDropdown()
609
+
610
+ $dropdown
611
+ .parent('.dropdown')
612
+ .on('shown.bs.dropdown', function () {
613
+ assert.ok(true, 'shown was fired')
614
+ $dropdown.trigger($.Event('keydown', {
615
+ which: 40
616
+ }))
617
+ $dropdown.trigger($.Event('keydown', {
618
+ which: 40
619
+ }))
620
+ assert.ok(!$(document.activeElement).is('.disabled'), '.disabled is not focused')
621
+ assert.ok(!$(document.activeElement).is(':disabled'), ':disabled is not focused')
622
+ done()
623
+ })
624
+ $dropdown.trigger('click')
625
+ })
626
+
627
+ QUnit.test('should focus next/previous element when using keyboard navigation', function (assert) {
628
+ assert.expect(4)
629
+ var done = assert.async()
630
+ var dropdownHTML = '<div class="tabs">' +
631
+ '<div class="dropdown">' +
632
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
633
+ '<div class="dropdown-menu">' +
634
+ '<a id="item1" class="dropdown-item" href="#">A link</a>' +
635
+ '<a id="item2" class="dropdown-item" href="#">Another link</a>' +
636
+ '</div>' +
637
+ '</div>' +
638
+ '</div>'
639
+ var $dropdown = $(dropdownHTML)
640
+ .appendTo('#qunit-fixture')
641
+ .find('[data-toggle="dropdown"]')
642
+ .bootstrapDropdown()
643
+
644
+ $dropdown
645
+ .parent('.dropdown')
646
+ .on('shown.bs.dropdown', function () {
647
+ assert.ok(true, 'shown was fired')
648
+ $dropdown.trigger($.Event('keydown', {
649
+ which: 40
650
+ }))
651
+ assert.ok($(document.activeElement).is($('#item1')), 'item1 is focused')
652
+
653
+ $(document.activeElement).trigger($.Event('keydown', {
654
+ which: 40
655
+ }))
656
+ assert.ok($(document.activeElement).is($('#item2')), 'item2 is focused')
657
+
658
+ $(document.activeElement).trigger($.Event('keydown', {
659
+ which: 38
660
+ }))
661
+ assert.ok($(document.activeElement).is($('#item1')), 'item1 is focused')
662
+ done()
663
+ })
664
+ $dropdown.trigger('click')
665
+ })
666
+
667
+ QUnit.test('should not close the dropdown if the user clicks on a text field', function (assert) {
668
+ assert.expect(2)
669
+ var done = assert.async()
670
+ var dropdownHTML = '<div class="dropdown">' +
671
+ '<button type="button" data-toggle="dropdown">Dropdown</button>' +
672
+ '<div class="dropdown-menu">' +
673
+ '<input id="textField" type="text" />' +
674
+ '</div>' +
675
+ '</div>'
676
+ var $dropdown = $(dropdownHTML)
677
+ .appendTo('#qunit-fixture')
678
+ .find('[data-toggle="dropdown"]')
679
+ .bootstrapDropdown()
680
+
681
+ var $textfield = $('#textField')
682
+ $textfield.on('click', function () {
683
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
684
+ done()
685
+ })
686
+
687
+ $dropdown
688
+ .parent('.dropdown')
689
+ .on('shown.bs.dropdown', function () {
690
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
691
+ $textfield.trigger($.Event('click'))
692
+ })
693
+ $dropdown.trigger('click')
694
+ })
695
+
696
+ QUnit.test('should not close the dropdown if the user clicks on a textarea', function (assert) {
697
+ assert.expect(2)
698
+ var done = assert.async()
699
+ var dropdownHTML = '<div class="dropdown">' +
700
+ '<button type="button" data-toggle="dropdown">Dropdown</button>' +
701
+ '<div class="dropdown-menu">' +
702
+ '<textarea id="textArea"></textarea>' +
703
+ '</div>' +
704
+ '</div>'
705
+ var $dropdown = $(dropdownHTML)
706
+ .appendTo('#qunit-fixture')
707
+ .find('[data-toggle="dropdown"]')
708
+ .bootstrapDropdown()
709
+
710
+ var $textarea = $('#textArea')
711
+ $textarea.on('click', function () {
712
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
713
+ done()
714
+ })
715
+
716
+ $dropdown
717
+ .parent('.dropdown')
718
+ .on('shown.bs.dropdown', function () {
719
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
720
+ $textarea.trigger($.Event('click'))
721
+ })
722
+ $dropdown.trigger('click')
723
+ })
724
+
725
+ QUnit.test('Dropdown should not use Popper.js in navbar', function (assert) {
726
+ assert.expect(1)
727
+ var done = assert.async()
728
+ var html = '<nav class="navbar navbar-expand-md navbar-light bg-light">' +
729
+ '<div class="dropdown">' +
730
+ ' <a class="nav-link dropdown-toggle" href="#" id="dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dropdown</a>' +
731
+ ' <div class="dropdown-menu" aria-labelledby="dropdown">' +
732
+ ' <a class="dropdown-item" href="#">Action</a>' +
733
+ ' <a class="dropdown-item" href="#">Another action</a>' +
734
+ ' <a class="dropdown-item" href="#">Something else here</a>' +
735
+ ' </div>' +
736
+ '</div>' +
737
+ '</nav>'
738
+
739
+ $(html).appendTo('#qunit-fixture')
740
+ var $triggerDropdown = $('#qunit-fixture')
741
+ .find('[data-toggle="dropdown"]')
742
+ .bootstrapDropdown()
743
+ var $dropdownMenu = $triggerDropdown.next()
744
+
745
+ $triggerDropdown
746
+ .parent('.dropdown')
747
+ .on('shown.bs.dropdown', function () {
748
+ assert.ok(typeof $dropdownMenu.attr('style') === 'undefined', 'No inline style applied by Popper.js')
749
+ done()
750
+ })
751
+ $triggerDropdown.trigger($.Event('click'))
752
+ })
753
+
754
+ QUnit.test('should ignore keyboard events for <input>s and <textarea>s within dropdown-menu, except for escape key', function (assert) {
755
+ assert.expect(7)
756
+ var done = assert.async()
757
+
758
+ var dropdownHTML = '<div class="tabs">' +
759
+ '<div class="dropdown">' +
760
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
761
+ '<div class="dropdown-menu">' +
762
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
763
+ '<a class="dropdown-item" href="#">Something else here</a>' +
764
+ '<div class="divider"/>' +
765
+ '<a class="dropdown-item" href="#">Another link</a>' +
766
+ '<input type="text" id="input">' +
767
+ '<textarea id="textarea"/>' +
768
+ '</div>' +
769
+ '</div>' +
770
+ '</div>'
771
+ var $dropdown = $(dropdownHTML)
772
+ .appendTo('#qunit-fixture')
773
+ .find('[data-toggle="dropdown"]')
774
+ .bootstrapDropdown()
775
+
776
+ var $input = $('#input')
777
+ var $textarea = $('#textarea')
778
+
779
+ $dropdown
780
+ .parent('.dropdown')
781
+ .on('shown.bs.dropdown', function () {
782
+ // Space key
783
+ $input.trigger('focus').trigger($.Event('keydown', {
784
+ which: 32
785
+ }))
786
+ assert.ok($(document.activeElement)[0] === $input[0], 'input still focused')
787
+ $textarea.trigger('focus').trigger($.Event('keydown', {
788
+ which: 32
789
+ }))
790
+ assert.ok($(document.activeElement)[0] === $textarea[0], 'textarea still focused')
791
+
792
+ // Key up
793
+ $input.trigger('focus').trigger($.Event('keydown', {
794
+ which: 38
795
+ }))
796
+ assert.ok($(document.activeElement)[0] === $input[0], 'input still focused')
797
+ $textarea.trigger('focus').trigger($.Event('keydown', {
798
+ which: 38
799
+ }))
800
+ assert.ok($(document.activeElement)[0] === $textarea[0], 'textarea still focused')
801
+
802
+ // Key down
803
+ $input.trigger('focus').trigger($.Event('keydown', {
804
+ which: 40
805
+ }))
806
+ assert.ok($(document.activeElement)[0] === $input[0], 'input still focused')
807
+ $textarea.trigger('focus').trigger($.Event('keydown', {
808
+ which: 40
809
+ }))
810
+ assert.ok($(document.activeElement)[0] === $textarea[0], 'textarea still focused')
811
+
812
+ // Key escape
813
+ $input.trigger('focus').trigger($.Event('keydown', {
814
+ which: 27
815
+ }))
816
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is not shown')
817
+ done()
818
+ })
819
+
820
+ $dropdown.trigger('click')
821
+ })
822
+
823
+ QUnit.test('should ignore space key events for <input>s within dropdown, and accept up, down and escape', function (assert) {
824
+ assert.expect(6)
825
+ var done = assert.async()
826
+
827
+ var dropdownHTML =
828
+ '<ul class="nav tabs">' +
829
+ ' <li class="dropdown">' +
830
+ ' <input type="text" id="input" data-toggle="dropdown">' +
831
+ ' <div class="dropdown-menu" role="menu">' +
832
+ ' <a id="item1" class="dropdown-item" href="#">Secondary link</a>' +
833
+ ' <a id="item2" class="dropdown-item" href="#">Something else here</a>' +
834
+ ' <div class="divider"></div>' +
835
+ ' <a class="dropdown-item" href="#">Another link</a>' +
836
+ ' </div>' +
837
+ ' </li>' +
838
+ '</ul>'
839
+
840
+ var $dropdown = $(dropdownHTML)
841
+ .appendTo('#qunit-fixture')
842
+ .find('[data-toggle="dropdown"]')
843
+ .bootstrapDropdown()
844
+
845
+ var $input = $('#input')
846
+
847
+ $dropdown
848
+ .parent('.dropdown')
849
+ .one('shown.bs.dropdown', function () {
850
+ assert.ok(true, 'shown was fired')
851
+
852
+ // Key space
853
+ $input.trigger('focus').trigger($.Event('keydown', {
854
+ which: 32
855
+ }))
856
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
857
+ assert.ok($(document.activeElement).is($input), 'input is still focused')
858
+
859
+ // Key escape
860
+ $input.trigger('focus').trigger($.Event('keydown', {
861
+ which: 27
862
+ }))
863
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is not shown')
864
+
865
+ $dropdown
866
+ .parent('.dropdown')
867
+ .one('shown.bs.dropdown', function () {
868
+ // Key down
869
+ $input.trigger('focus').trigger($.Event('keydown', {
870
+ which: 40
871
+ }))
872
+ assert.ok(document.activeElement === $('#item1')[0], 'item1 is focused')
873
+
874
+ $dropdown
875
+ .parent('.dropdown')
876
+ .one('shown.bs.dropdown', function () {
877
+ // Key up
878
+ $input.trigger('focus').trigger($.Event('keydown', {
879
+ which: 38
880
+ }))
881
+ assert.ok(document.activeElement === $('#item1')[0], 'item1 is focused')
882
+ done()
883
+ }).bootstrapDropdown('toggle')
884
+ $input.trigger('click')
885
+ })
886
+ $input.trigger('click')
887
+ })
888
+ $input.trigger('click')
889
+ })
890
+
891
+ QUnit.test('should ignore space key events for <textarea>s within dropdown, and accept up, down and escape', function (assert) {
892
+ assert.expect(6)
893
+ var done = assert.async()
894
+
895
+ var dropdownHTML =
896
+ '<ul class="nav tabs">' +
897
+ ' <li class="dropdown">' +
898
+ ' <textarea id="textarea" data-toggle="dropdown"></textarea>' +
899
+ ' <div class="dropdown-menu" role="menu">' +
900
+ ' <a id="item1" class="dropdown-item" href="#">Secondary link</a>' +
901
+ ' <a id="item2" class="dropdown-item" href="#">Something else here</a>' +
902
+ ' <div class="divider"></div>' +
903
+ ' <a class="dropdown-item" href="#">Another link</a>' +
904
+ ' </div>' +
905
+ ' </li>' +
906
+ '</ul>'
907
+
908
+ var $dropdown = $(dropdownHTML)
909
+ .appendTo('#qunit-fixture')
910
+ .find('[data-toggle="dropdown"]')
911
+ .bootstrapDropdown()
912
+
913
+ var $textarea = $('#textarea')
914
+
915
+ $dropdown
916
+ .parent('.dropdown')
917
+ .one('shown.bs.dropdown', function () {
918
+ assert.ok(true, 'shown was fired')
919
+
920
+ // Key space
921
+ $textarea.trigger('focus').trigger($.Event('keydown', {
922
+ which: 32
923
+ }))
924
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
925
+ assert.ok($(document.activeElement).is($textarea), 'textarea is still focused')
926
+
927
+ // Key escape
928
+ $textarea.trigger('focus').trigger($.Event('keydown', {
929
+ which: 27
930
+ }))
931
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is not shown')
932
+
933
+ $dropdown
934
+ .parent('.dropdown')
935
+ .one('shown.bs.dropdown', function () {
936
+ // Key down
937
+ $textarea.trigger('focus').trigger($.Event('keydown', {
938
+ which: 40
939
+ }))
940
+ assert.ok(document.activeElement === $('#item1')[0], 'item1 is focused')
941
+
942
+ $dropdown
943
+ .parent('.dropdown')
944
+ .one('shown.bs.dropdown', function () {
945
+ // Key up
946
+ $textarea.trigger('focus').trigger($.Event('keydown', {
947
+ which: 38
948
+ }))
949
+ assert.ok(document.activeElement === $('#item1')[0], 'item1 is focused')
950
+ done()
951
+ }).bootstrapDropdown('toggle')
952
+ $textarea.trigger('click')
953
+ })
954
+ $textarea.trigger('click')
955
+ })
956
+ $textarea.trigger('click')
957
+ })
958
+
959
+ QUnit.test('should not use Popper.js if display set to static', function (assert) {
960
+ assert.expect(1)
961
+ var dropdownHTML =
962
+ '<div class="dropdown">' +
963
+ '<a href="#" class="dropdown-toggle" data-toggle="dropdown" data-display="static">Dropdown</a>' +
964
+ '<div class="dropdown-menu">' +
965
+ '<a class="dropdown-item" href="#">Secondary link</a>' +
966
+ '<a class="dropdown-item" href="#">Something else here</a>' +
967
+ '<div class="divider"/>' +
968
+ '<a class="dropdown-item" href="#">Another link</a>' +
969
+ '</div>' +
970
+ '</div>'
971
+
972
+ var $dropdown = $(dropdownHTML)
973
+ .appendTo('#qunit-fixture')
974
+ .find('[data-toggle="dropdown"]')
975
+ .bootstrapDropdown()
976
+ var done = assert.async()
977
+ var dropdownMenu = $dropdown.next()[0]
978
+
979
+ $dropdown.parent('.dropdown')
980
+ .on('shown.bs.dropdown', function () {
981
+ // Popper.js add this attribute when we use it
982
+ assert.strictEqual(dropdownMenu.getAttribute('x-placement'), null)
983
+ done()
984
+ })
985
+
986
+ $dropdown.trigger('click')
987
+ })
988
+
989
+ QUnit.test('should call Popper.js and detect navbar on update', function (assert) {
990
+ assert.expect(3)
991
+
992
+ var dropdownHTML =
993
+ '<div class="dropdown">' +
994
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
995
+ ' <div class="dropdown-menu">' +
996
+ ' <a class="dropdown-item" href="#">Another link</a>' +
997
+ ' </div>' +
998
+ '</div>'
999
+
1000
+ var $dropdown = $(dropdownHTML)
1001
+ .appendTo('#qunit-fixture')
1002
+ .find('[data-toggle="dropdown"]')
1003
+ .bootstrapDropdown()
1004
+
1005
+ var dropdown = $dropdown.data('bs.dropdown')
1006
+ dropdown.toggle()
1007
+ assert.ok(dropdown._popper)
1008
+
1009
+ var spyPopper = sinon.spy(dropdown._popper, 'scheduleUpdate')
1010
+ var spyDetectNavbar = sinon.spy(dropdown, '_detectNavbar')
1011
+ dropdown.update()
1012
+
1013
+ assert.ok(spyPopper.called)
1014
+ assert.ok(spyDetectNavbar.called)
1015
+ })
1016
+
1017
+ QUnit.test('should just detect navbar on update', function (assert) {
1018
+ assert.expect(2)
1019
+
1020
+ var dropdownHTML =
1021
+ '<div class="dropdown">' +
1022
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1023
+ ' <div class="dropdown-menu">' +
1024
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1025
+ ' </div>' +
1026
+ '</div>'
1027
+
1028
+ var $dropdown = $(dropdownHTML)
1029
+ .appendTo('#qunit-fixture')
1030
+ .find('[data-toggle="dropdown"]')
1031
+ .bootstrapDropdown()
1032
+
1033
+ var dropdown = $dropdown.data('bs.dropdown')
1034
+ var spyDetectNavbar = sinon.spy(dropdown, '_detectNavbar')
1035
+
1036
+ dropdown.update()
1037
+
1038
+ assert.notOk(dropdown._popper)
1039
+ assert.ok(spyDetectNavbar.called)
1040
+ })
1041
+
1042
+ QUnit.test('should dispose dropdown with Popper', function (assert) {
1043
+ assert.expect(6)
1044
+
1045
+ var dropdownHTML =
1046
+ '<div class="dropdown">' +
1047
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1048
+ ' <div class="dropdown-menu">' +
1049
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1050
+ ' </div>' +
1051
+ '</div>'
1052
+
1053
+ var $dropdown = $(dropdownHTML)
1054
+ .appendTo('#qunit-fixture')
1055
+ .find('[data-toggle="dropdown"]')
1056
+ .bootstrapDropdown()
1057
+
1058
+ var dropdown = $dropdown.data('bs.dropdown')
1059
+ dropdown.toggle()
1060
+
1061
+ assert.ok(dropdown._popper)
1062
+ assert.ok(dropdown._menu !== null)
1063
+ assert.ok(dropdown._element !== null)
1064
+ var spyDestroy = sinon.spy(dropdown._popper, 'destroy')
1065
+
1066
+ dropdown.dispose()
1067
+
1068
+ assert.ok(spyDestroy.called)
1069
+ assert.ok(dropdown._menu === null)
1070
+ assert.ok(dropdown._element === null)
1071
+ })
1072
+
1073
+ QUnit.test('should dispose dropdown', function (assert) {
1074
+ assert.expect(5)
1075
+
1076
+ var dropdownHTML =
1077
+ '<div class="dropdown">' +
1078
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1079
+ ' <div class="dropdown-menu">' +
1080
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1081
+ ' </div>' +
1082
+ '</div>'
1083
+
1084
+ var $dropdown = $(dropdownHTML)
1085
+ .appendTo('#qunit-fixture')
1086
+ .find('[data-toggle="dropdown"]')
1087
+ .bootstrapDropdown()
1088
+
1089
+ var dropdown = $dropdown.data('bs.dropdown')
1090
+
1091
+ assert.notOk(dropdown._popper)
1092
+ assert.ok(dropdown._menu !== null)
1093
+ assert.ok(dropdown._element !== null)
1094
+
1095
+ dropdown.dispose()
1096
+
1097
+ assert.ok(dropdown._menu === null)
1098
+ assert.ok(dropdown._element === null)
1099
+ })
1100
+
1101
+ QUnit.test('should show dropdown', function (assert) {
1102
+ assert.expect(2)
1103
+
1104
+ var dropdownHTML =
1105
+ '<div class="dropdown">' +
1106
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1107
+ ' <div class="dropdown-menu">' +
1108
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1109
+ ' </div>' +
1110
+ '</div>'
1111
+
1112
+ var $dropdown = $(dropdownHTML)
1113
+ .appendTo('#qunit-fixture')
1114
+ .find('[data-toggle="dropdown"]')
1115
+ .bootstrapDropdown()
1116
+
1117
+ var dropdown = $dropdown.data('bs.dropdown')
1118
+ var done = assert.async()
1119
+
1120
+ $dropdown
1121
+ .parent('.dropdown')
1122
+ .on('show.bs.dropdown', function () {
1123
+ assert.ok(true, 'show was fired')
1124
+ })
1125
+ .on('shown.bs.dropdown', function () {
1126
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
1127
+ done()
1128
+ })
1129
+
1130
+ dropdown.show()
1131
+ })
1132
+
1133
+ QUnit.test('should hide dropdown', function (assert) {
1134
+ assert.expect(2)
1135
+
1136
+ var dropdownHTML =
1137
+ '<div class="dropdown">' +
1138
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1139
+ ' <div class="dropdown-menu">' +
1140
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1141
+ ' </div>' +
1142
+ '</div>'
1143
+
1144
+ var $dropdown = $(dropdownHTML)
1145
+ .appendTo('#qunit-fixture')
1146
+ .find('[data-toggle="dropdown"]')
1147
+ .bootstrapDropdown()
1148
+
1149
+ var dropdown = $dropdown.data('bs.dropdown')
1150
+ var done = assert.async()
1151
+ $dropdown.trigger('click')
1152
+
1153
+ $dropdown
1154
+ .parent('.dropdown')
1155
+ .on('hide.bs.dropdown', function () {
1156
+ assert.ok(true, 'hide was fired')
1157
+ })
1158
+ .on('hidden.bs.dropdown', function () {
1159
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is hidden')
1160
+ done()
1161
+ })
1162
+
1163
+ dropdown.hide()
1164
+ })
1165
+
1166
+ QUnit.test('should not hide dropdown', function (assert) {
1167
+ assert.expect(1)
1168
+
1169
+ var dropdownHTML =
1170
+ '<div class="dropdown">' +
1171
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1172
+ ' <div class="dropdown-menu">' +
1173
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1174
+ ' </div>' +
1175
+ '</div>'
1176
+
1177
+ var $dropdown = $(dropdownHTML)
1178
+ .appendTo('#qunit-fixture')
1179
+ .find('[data-toggle="dropdown"]')
1180
+ .bootstrapDropdown()
1181
+
1182
+ var dropdown = $dropdown.data('bs.dropdown')
1183
+ $dropdown.trigger('click')
1184
+ dropdown.show()
1185
+
1186
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is still shown')
1187
+ })
1188
+
1189
+ QUnit.test('should not show dropdown', function (assert) {
1190
+ assert.expect(1)
1191
+
1192
+ var dropdownHTML =
1193
+ '<div class="dropdown">' +
1194
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1195
+ ' <div class="dropdown-menu">' +
1196
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1197
+ ' </div>' +
1198
+ '</div>'
1199
+
1200
+ var $dropdown = $(dropdownHTML)
1201
+ .appendTo('#qunit-fixture')
1202
+ .find('[data-toggle="dropdown"]')
1203
+ .bootstrapDropdown()
1204
+
1205
+ var dropdown = $dropdown.data('bs.dropdown')
1206
+ dropdown.hide()
1207
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is still hidden')
1208
+ })
1209
+
1210
+ QUnit.test('should show dropdown', function (assert) {
1211
+ assert.expect(2)
1212
+
1213
+ var dropdownHTML =
1214
+ '<div class="dropdown">' +
1215
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1216
+ ' <div class="dropdown-menu">' +
1217
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1218
+ ' </div>' +
1219
+ '</div>'
1220
+
1221
+ var $dropdown = $(dropdownHTML)
1222
+ .appendTo('#qunit-fixture')
1223
+ .find('[data-toggle="dropdown"]')
1224
+ .bootstrapDropdown()
1225
+
1226
+ var dropdown = $dropdown.data('bs.dropdown')
1227
+ var done = assert.async()
1228
+
1229
+ $dropdown
1230
+ .parent('.dropdown')
1231
+ .on('show.bs.dropdown', function () {
1232
+ assert.ok(true, 'show was fired')
1233
+ })
1234
+ .on('shown.bs.dropdown', function () {
1235
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
1236
+ done()
1237
+ })
1238
+
1239
+ dropdown.show()
1240
+ })
1241
+
1242
+ QUnit.test('should prevent default event on show method call', function (assert) {
1243
+ assert.expect(1)
1244
+
1245
+ var dropdownHTML =
1246
+ '<div class="dropdown">' +
1247
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1248
+ ' <div class="dropdown-menu">' +
1249
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1250
+ ' </div>' +
1251
+ '</div>'
1252
+
1253
+ var $dropdown = $(dropdownHTML)
1254
+ .appendTo('#qunit-fixture')
1255
+ .find('[data-toggle="dropdown"]')
1256
+ .bootstrapDropdown()
1257
+
1258
+ var dropdown = $dropdown.data('bs.dropdown')
1259
+ var done = assert.async()
1260
+
1261
+ $dropdown
1262
+ .parent('.dropdown')
1263
+ .on('show.bs.dropdown', function (event) {
1264
+ event.preventDefault()
1265
+ done()
1266
+ })
1267
+
1268
+ dropdown.show()
1269
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is hidden')
1270
+ })
1271
+
1272
+ QUnit.test('should prevent default event on hide method call', function (assert) {
1273
+ assert.expect(1)
1274
+
1275
+ var dropdownHTML =
1276
+ '<div class="dropdown">' +
1277
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1278
+ ' <div class="dropdown-menu">' +
1279
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1280
+ ' </div>' +
1281
+ '</div>'
1282
+
1283
+ var $dropdown = $(dropdownHTML)
1284
+ .appendTo('#qunit-fixture')
1285
+ .find('[data-toggle="dropdown"]')
1286
+ .bootstrapDropdown()
1287
+
1288
+ var dropdown = $dropdown.data('bs.dropdown')
1289
+ var done = assert.async()
1290
+ $dropdown.trigger('click')
1291
+
1292
+ $dropdown
1293
+ .parent('.dropdown')
1294
+ .on('hide.bs.dropdown', function (event) {
1295
+ event.preventDefault()
1296
+ done()
1297
+ })
1298
+
1299
+ dropdown.hide()
1300
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
1301
+ })
1302
+
1303
+ QUnit.test('should not open dropdown via show method if target is disabled via attribute', function (assert) {
1304
+ assert.expect(1)
1305
+ var dropdownHTML =
1306
+ '<div class="dropdown">' +
1307
+ ' <button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' +
1308
+ ' <div class="dropdown-menu">' +
1309
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1310
+ ' </div>' +
1311
+ '</div>'
1312
+ $(dropdownHTML).appendTo('#qunit-fixture')
1313
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
1314
+ $dropdown.show()
1315
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
1316
+ })
1317
+
1318
+ QUnit.test('should not open dropdown via show method if target is disabled via class', function (assert) {
1319
+ assert.expect(1)
1320
+ var dropdownHTML =
1321
+ '<div class="dropdown">' +
1322
+ ' <button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' +
1323
+ ' <div class="dropdown-menu">' +
1324
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1325
+ ' </div>' +
1326
+ '</div>'
1327
+
1328
+ $(dropdownHTML).appendTo('#qunit-fixture')
1329
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
1330
+ $dropdown.show()
1331
+ assert.ok(!$dropdown.parent('.dropdown').hasClass('show'))
1332
+ })
1333
+
1334
+ QUnit.test('should not hide dropdown via hide method if target is disabled via attribute', function (assert) {
1335
+ assert.expect(1)
1336
+ var dropdownHTML =
1337
+ '<div class="dropdown show">' +
1338
+ ' <button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' +
1339
+ ' <div class="dropdown-menu">' +
1340
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1341
+ ' </div>' +
1342
+ '</div>'
1343
+ $(dropdownHTML).appendTo('#qunit-fixture')
1344
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
1345
+ $dropdown.hide()
1346
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'))
1347
+ })
1348
+
1349
+ QUnit.test('should not hide dropdown via hide method if target is disabled via class', function (assert) {
1350
+ assert.expect(1)
1351
+ var dropdownHTML =
1352
+ '<div class="dropdown show">' +
1353
+ ' <button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' +
1354
+ ' <div class="dropdown-menu">' +
1355
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1356
+ ' </div>' +
1357
+ '</div>'
1358
+
1359
+ $(dropdownHTML).appendTo('#qunit-fixture')
1360
+ var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown()
1361
+ $dropdown.hide()
1362
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'))
1363
+ })
1364
+
1365
+ QUnit.test('should create offset modifier correctly when offset option is a function', function (assert) {
1366
+ assert.expect(2)
1367
+
1368
+ var getOffset = function (offsets) {
1369
+ return offsets
1370
+ }
1371
+
1372
+ var dropdownHTML =
1373
+ '<div class="dropdown">' +
1374
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1375
+ ' <div class="dropdown-menu">' +
1376
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1377
+ ' </div>' +
1378
+ '</div>'
1379
+
1380
+ var $dropdown = $(dropdownHTML)
1381
+ .appendTo('#qunit-fixture')
1382
+ .find('[data-toggle="dropdown"]')
1383
+ .bootstrapDropdown({
1384
+ offset: getOffset
1385
+ })
1386
+
1387
+ var dropdown = $dropdown.data('bs.dropdown')
1388
+ var offset = dropdown._getOffset()
1389
+
1390
+ assert.ok(typeof offset.offset === 'undefined')
1391
+ assert.ok(typeof offset.fn === 'function')
1392
+ })
1393
+
1394
+ QUnit.test('should create offset modifier correctly when offset option is not a function', function (assert) {
1395
+ assert.expect(2)
1396
+
1397
+ var dropdownHTML =
1398
+ '<div class="dropdown">' +
1399
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
1400
+ ' <div class="dropdown-menu">' +
1401
+ ' <a class="dropdown-item" href="#">Another link</a>' +
1402
+ ' </div>' +
1403
+ '</div>'
1404
+
1405
+ var myOffset = 42
1406
+ var $dropdown = $(dropdownHTML)
1407
+ .appendTo('#qunit-fixture')
1408
+ .find('[data-toggle="dropdown"]')
1409
+ .bootstrapDropdown({
1410
+ offset: myOffset
1411
+ })
1412
+
1413
+ var dropdown = $dropdown.data('bs.dropdown')
1414
+ var offset = dropdown._getOffset()
1415
+
1416
+ assert.strictEqual(offset.offset, myOffset)
1417
+ assert.ok(typeof offset.fn === 'undefined')
1418
+ })
1419
+ })