Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/bootstrap.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Golieb <j@golieb.net>2019-02-05 11:31:18 +0300
committerXhmikosR <xhmikosr@gmail.com>2019-02-05 11:31:18 +0300
commite44d0475e07113dfb21b555658de6eac53083f98 (patch)
treec35b6620da0cb0b3c9948d6a0a56800e9ca8e22a
parent1139f62ca26be2057ff15550061adf6ac201b2a8 (diff)
Move dropdown offset function logic into private function. (#28138)
-rw-r--r--js/src/dropdown.js19
-rw-r--r--js/tests/unit/dropdown.js55
-rw-r--r--site/docs/4.2/components/dropdowns.md6
3 files changed, 73 insertions, 7 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index 9aaf5a339e..31deaa725e 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -319,24 +319,30 @@ class Dropdown {
return $(this._element).closest('.navbar').length > 0
}
- _getPopperConfig() {
- const offsetConf = {}
+ _getOffset() {
+ const offset = {}
+
if (typeof this._config.offset === 'function') {
- offsetConf.fn = (data) => {
+ offset.fn = (data) => {
data.offsets = {
...data.offsets,
- ...this._config.offset(data.offsets) || {}
+ ...this._config.offset(data.offsets, this._element) || {}
}
+
return data
}
} else {
- offsetConf.offset = this._config.offset
+ offset.offset = this._config.offset
}
+ return offset
+ }
+
+ _getPopperConfig() {
const popperConfig = {
placement: this._getPlacement(),
modifiers: {
- offset: offsetConf,
+ offset: this._getOffset(),
flip: {
enabled: this._config.flip
},
@@ -352,6 +358,7 @@ class Dropdown {
enabled: false
}
}
+
return popperConfig
}
diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js
index fd9b7f9629..1ecfd1f8bf 100644
--- a/js/tests/unit/dropdown.js
+++ b/js/tests/unit/dropdown.js
@@ -1361,4 +1361,59 @@ $(function () {
$dropdown.hide()
assert.ok($dropdown.parent('.dropdown').hasClass('show'))
})
+
+ QUnit.test('should create offset modifier correctly when offset option is a function', function (assert) {
+ assert.expect(2)
+
+ var getOffset = function (offsets) {
+ return offsets
+ }
+
+ var dropdownHTML =
+ '<div class="dropdown">' +
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
+ ' <div class="dropdown-menu">' +
+ ' <a class="dropdown-item" href="#">Another link</a>' +
+ ' </div>' +
+ '</div>'
+
+ var $dropdown = $(dropdownHTML)
+ .appendTo('#qunit-fixture')
+ .find('[data-toggle="dropdown"]')
+ .bootstrapDropdown({
+ offset: getOffset
+ })
+
+ var dropdown = $dropdown.data('bs.dropdown')
+ var offset = dropdown._getOffset()
+
+ assert.ok(typeof offset.offset === 'undefined')
+ assert.ok(typeof offset.fn === 'function')
+ })
+
+ QUnit.test('should create offset modifier correctly when offset option is not a function', function (assert) {
+ assert.expect(2)
+
+ var dropdownHTML =
+ '<div class="dropdown">' +
+ ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' +
+ ' <div class="dropdown-menu">' +
+ ' <a class="dropdown-item" href="#">Another link</a>' +
+ ' </div>' +
+ '</div>'
+
+ var myOffset = 42
+ var $dropdown = $(dropdownHTML)
+ .appendTo('#qunit-fixture')
+ .find('[data-toggle="dropdown"]')
+ .bootstrapDropdown({
+ offset: myOffset
+ })
+
+ var dropdown = $dropdown.data('bs.dropdown')
+ var offset = dropdown._getOffset()
+
+ assert.strictEqual(offset.offset, myOffset)
+ assert.ok(typeof offset.fn === 'undefined')
+ })
})
diff --git a/site/docs/4.2/components/dropdowns.md b/site/docs/4.2/components/dropdowns.md
index 6011bd9896..2b5ee2014e 100644
--- a/site/docs/4.2/components/dropdowns.md
+++ b/site/docs/4.2/components/dropdowns.md
@@ -845,7 +845,11 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
<td>offset</td>
<td>number | string | function</td>
<td>0</td>
- <td>Offset of the dropdown relative to its target. For more information refer to Popper.js's <a href="https://popper.js.org/popper-documentation.html#modifiers..offset.offset">offset docs</a>.</td>
+ <td>
+ <p>Offset of the dropdown relative to its target.</p>
+ <p>When a function is used to determine the offset, it is called with an object containing the offset data as its first argument. The function must return an object with the same structure. The triggering element DOM node is passed as the second argument.</p>
+ <p>For more information refer to Popper.js's <a href="https://popper.js.org/popper-documentation.html#modifiers..offset.offset">offset docs</a>.</p>
+ </td>
</tr>
<tr>
<td>flip</td>