From 2d8c02eb1024ef2ce8877d6484a9ea8a4d9cd67f Mon Sep 17 00:00:00 2001 From: James Remeika Date: Fri, 20 Nov 2020 04:56:16 -0500 Subject: tooltip/popover: add a `customClass` option (#31834) Co-authored-by: XhmikosR --- js/src/tooltip.js | 7 +++++++ js/tests/unit/popover.js | 13 +++++++++++++ js/tests/unit/tooltip.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) (limited to 'js') diff --git a/js/src/tooltip.js b/js/src/tooltip.js index 4b58f3156..a77034038 100644 --- a/js/src/tooltip.js +++ b/js/src/tooltip.js @@ -41,6 +41,7 @@ const DefaultType = { container: '(string|element|boolean)', fallbackPlacement: '(string|array)', boundary: '(string|element)', + customClass: '(string|function)', sanitize: 'boolean', sanitizeFn: '(null|function)', whiteList: 'object', @@ -70,6 +71,7 @@ const Default = { container: false, fallbackPlacement: 'flip', boundary: 'scrollParent', + customClass: '', sanitize: true, sanitizeFn: null, whiteList: DefaultWhitelist, @@ -284,6 +286,7 @@ class Tooltip { this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment)) $(tip).addClass(CLASS_NAME_SHOW) + $(tip).addClass(this._getCustomClass()) // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; @@ -731,6 +734,10 @@ class Tooltip { this.config.animation = initConfigAnimation } + _getCustomClass() { + return this.element.getAttribute('data-custom-class') || this.config.customClass + } + // Static static _jQueryInterface(config) { diff --git a/js/tests/unit/popover.js b/js/tests/unit/popover.js index a5981e45f..102f37f8d 100644 --- a/js/tests/unit/popover.js +++ b/js/tests/unit/popover.js @@ -61,6 +61,19 @@ $(function () { .bootstrapPopover('show') }) + QUnit.test('should render popover element with additional classes', function (assert) { + assert.expect(2) + var done = assert.async() + $('@mdo') + .appendTo('#qunit-fixture') + .on('shown.bs.popover', function () { + assert.strictEqual($('.popover').hasClass('popover fade bs-popover-right show'), true, 'has default classes') + assert.strictEqual($('.popover').hasClass('a b'), true, 'has custom classes') + done() + }) + .bootstrapPopover('show') + }) + QUnit.test('should store popover instance in popover data object', function (assert) { assert.expect(1) var $popover = $('@mdo').bootstrapPopover() diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js index 4f55007c7..b6a40b873 100644 --- a/js/tests/unit/tooltip.js +++ b/js/tests/unit/tooltip.js @@ -1283,4 +1283,54 @@ $(function () { assert.strictEqual(popperConfig.placement, 'left') }) + + QUnit.test('additional classes can be applied via data attribute', function (assert) { + assert.expect(2) + + $('') + .appendTo('#qunit-fixture') + .bootstrapTooltip() + .bootstrapTooltip('show') + + var tooltip = $('.tooltip') + + assert.strictEqual(tooltip.hasClass('a b'), true) + assert.strictEqual(tooltip.hasClass('tooltip fade bs-tooltip-top show'), true) + }) + + QUnit.test('additional classes can be applied via config string', function (assert) { + assert.expect(2) + + $('') + .appendTo('#qunit-fixture') + .bootstrapTooltip({ + customClass: 'a b' + }) + .bootstrapTooltip('show') + + var tooltip = $('.tooltip') + + assert.strictEqual(tooltip.hasClass('a b'), true) + assert.strictEqual(tooltip.hasClass('tooltip fade bs-tooltip-top show'), true) + }) + + QUnit.test('additional classes can be applied via function', function (assert) { + assert.expect(2) + + var getClasses = function () { + return 'a b' + } + + $('') + .appendTo('#qunit-fixture') + .bootstrapTooltip({ + customClass: getClasses + }) + .bootstrapTooltip('show') + + var tooltip = $('.tooltip') + + assert.strictEqual(tooltip.hasClass('a b'), true) + assert.strictEqual(tooltip.hasClass('tooltip fade bs-tooltip-top show'), true) + }) }) -- cgit v1.2.3