0
0
mirror of https://github.com/twbs/bootstrap.git synced 2024-11-29 11:24:18 +01:00
allow to pass popper.js configuration for tooltip/popover and dropdown
This commit is contained in:
Johann-S 2019-08-18 22:15:21 +03:00 committed by XhmikosR
parent 6381c63fb1
commit 7652d326e4
8 changed files with 113 additions and 40 deletions

View File

@ -30,7 +30,7 @@
},
{
"path": "./dist/js/bootstrap.bundle.min.js",
"maxSize": "22 kB"
"maxSize": "22.25 kB"
},
{
"path": "./dist/js/bootstrap.js",

View File

@ -75,7 +75,8 @@ const Default = {
flip : true,
boundary : 'scrollParent',
reference : 'toggle',
display : 'dynamic'
display : 'dynamic',
popperConfig : null
}
const DefaultType = {
@ -83,7 +84,8 @@ const DefaultType = {
flip : 'boolean',
boundary : '(string|element)',
reference : '(string|element)',
display : 'string'
display : 'string',
popperConfig : '(null|object)'
}
/**
@ -359,7 +361,10 @@ class Dropdown {
}
}
return popperConfig
return {
...popperConfig,
...this._config.popperConfig
}
}
// Static

View File

@ -43,7 +43,8 @@ const DefaultType = {
boundary : '(string|element)',
sanitize : 'boolean',
sanitizeFn : '(null|function)',
whiteList : 'object'
whiteList : 'object',
popperConfig : '(null|object)'
}
const AttachmentMap = {
@ -71,7 +72,8 @@ const Default = {
boundary : 'scrollParent',
sanitize : true,
sanitizeFn : null,
whiteList : DefaultWhitelist
whiteList : DefaultWhitelist,
popperConfig : null
}
const HoverState = {
@ -119,10 +121,6 @@ const Trigger = {
class Tooltip {
constructor(element, config) {
/**
* Check for Popper dependency
* Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)')
}
@ -236,7 +234,7 @@ class Tooltip {
this._timeout = null
this._hoverState = null
this._activeTrigger = null
if (this._popper !== null) {
if (this._popper) {
this._popper.destroy()
}
@ -293,27 +291,7 @@ class Tooltip {
$(this.element).trigger(this.constructor.Event.INSERTED)
this._popper = new Popper(this.element, tip, {
placement: attachment,
modifiers: {
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: Selector.ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: (data) => {
if (data.originalPlacement !== data.placement) {
this._handlePopperPlacementChange(data)
}
},
onUpdate: (data) => this._handlePopperPlacementChange(data)
})
this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))
$(tip).addClass(ClassName.SHOW)
@ -468,6 +446,35 @@ class Tooltip {
// Private
_getPopperConfig(attachment) {
const defaultBsConfig = {
placement: attachment,
modifiers: {
offset: this._getOffset(),
flip: {
behavior: this.config.fallbackPlacement
},
arrow: {
element: Selector.ARROW
},
preventOverflow: {
boundariesElement: this.config.boundary
}
},
onCreate: (data) => {
if (data.originalPlacement !== data.placement) {
this._handlePopperPlacementChange(data)
}
},
onUpdate: (data) => this._handlePopperPlacementChange(data)
}
return {
...defaultBsConfig,
...this.config.popperConfig
}
}
_getOffset() {
const offset = {}

View File

@ -1480,4 +1480,30 @@ $(function () {
assert.strictEqual(offset.offset, myOffset)
assert.ok(typeof offset.fn === 'undefined')
})
QUnit.test('should allow to pass config to popper.js with `popperConfig`', function (assert) {
assert.expect(1)
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({
popperConfig: {
placement: 'left'
}
})
var dropdown = $dropdown.data('bs.dropdown')
var popperConfig = dropdown._getPopperConfig()
assert.strictEqual(popperConfig.placement, 'left')
})
})

View File

@ -1266,4 +1266,21 @@ $(function () {
assert.strictEqual(tooltip.config.sanitize, true)
})
QUnit.test('should allow to pass config to popper.js with `popperConfig`', function (assert) {
assert.expect(1)
var $trigger = $('<a href="#" rel="tooltip" data-trigger="click" title="Another tooltip"/>')
.appendTo('#qunit-fixture')
.bootstrapTooltip({
popperConfig: {
placement: 'left'
}
})
var tooltip = $trigger.data('bs.tooltip')
var popperConfig = tooltip._getPopperConfig('top')
assert.strictEqual(popperConfig.placement, 'left')
})
})

View File

@ -875,6 +875,12 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
<td>'dynamic'</td>
<td>By default, we use Popper.js for dynamic positioning. Disable this with <code>static</code>.</td>
</tr>
<tr>
<td>popperConfig</td>
<td>null | object</td>
<td>null</td>
<td>To change Bootstrap's default Popper.js config, see <a href="https://popper.js.org/popper-documentation.html#Popper.Defaults">Popper.js's configuration</a></td>
</tr>
</tbody>
</table>

View File

@ -284,6 +284,12 @@ Note that for security reasons the `sanitize`, `sanitizeFn` and `whiteList` opti
<td>null</td>
<td>Here you can supply your own sanitize function. This can be useful if you prefer to use a dedicated library to perform sanitization.</td>
</tr>
<tr>
<td>popperConfig</td>
<td>null | object</td>
<td>null</td>
<td>To change Bootstrap's default Popper.js config, see <a href="https://popper.js.org/popper-documentation.html#Popper.Defaults">Popper.js's configuration</a></td>
</tr>
</tbody>
</table>

View File

@ -276,6 +276,12 @@ Note that for security reasons the `sanitize`, `sanitizeFn` and `whiteList` opti
<td>null</td>
<td>Here you can supply your own sanitize function. This can be useful if you prefer to use a dedicated library to perform sanitization.</td>
</tr>
<tr>
<td>popperConfig</td>
<td>null | object</td>
<td>null</td>
<td>To change Bootstrap's default Popper.js config, see <a href="https://popper.js.org/popper-documentation.html#Popper.Defaults">Popper.js's configuration</a></td>
</tr>
</tbody>
</table>