Boost `execute` function, being able to handle arguments (#36652)

This commit is contained in:
GeoSot 2022-10-07 15:25:00 +03:00 committed by GitHub
parent 708a3a0e39
commit 4cb046a6b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 13 deletions

View File

@ -8,6 +8,7 @@
import * as Popper from '@popperjs/core' import * as Popper from '@popperjs/core'
import { import {
defineJQueryPlugin, defineJQueryPlugin,
execute,
getElement, getElement,
getNextActiveElement, getNextActiveElement,
isDisabled, isDisabled,
@ -319,7 +320,7 @@ class Dropdown extends BaseComponent {
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) ...execute(this._config.popperConfig, [defaultBsPopperConfig])
} }
} }

View File

@ -6,7 +6,7 @@
*/ */
import * as Popper from '@popperjs/core' import * as Popper from '@popperjs/core'
import { defineJQueryPlugin, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index' import { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index'
import { DefaultAllowlist } from './util/sanitizer' import { DefaultAllowlist } from './util/sanitizer'
import EventHandler from './dom/event-handler' import EventHandler from './dom/event-handler'
import Manipulator from './dom/manipulator' import Manipulator from './dom/manipulator'
@ -370,9 +370,7 @@ class Tooltip extends BaseComponent {
} }
_createPopper(tip) { _createPopper(tip) {
const placement = typeof this._config.placement === 'function' ? const placement = execute(this._config.placement, [this, tip, this._element])
this._config.placement.call(this, tip, this._element) :
this._config.placement
const attachment = AttachmentMap[placement.toUpperCase()] const attachment = AttachmentMap[placement.toUpperCase()]
return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment)) return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))
} }
@ -392,7 +390,7 @@ class Tooltip extends BaseComponent {
} }
_resolvePossibleFunction(arg) { _resolvePossibleFunction(arg) {
return typeof arg === 'function' ? arg.call(this._element) : arg return execute(arg, [this._element])
} }
_getPopperConfig(attachment) { _getPopperConfig(attachment) {
@ -438,7 +436,7 @@ class Tooltip extends BaseComponent {
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) ...execute(this._config.popperConfig, [defaultBsPopperConfig])
} }
} }

View File

@ -249,10 +249,8 @@ const defineJQueryPlugin = plugin => {
}) })
} }
const execute = callback => { const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
if (typeof callback === 'function') { return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue
callback()
}
} }
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {

View File

@ -6,7 +6,7 @@
*/ */
import { DefaultAllowlist, sanitizeHtml } from './sanitizer' import { DefaultAllowlist, sanitizeHtml } from './sanitizer'
import { getElement, isElement } from '../util/index' import { execute, getElement, isElement } from '../util/index'
import SelectorEngine from '../dom/selector-engine' import SelectorEngine from '../dom/selector-engine'
import Config from './config' import Config from './config'
@ -143,7 +143,7 @@ class TemplateFactory extends Config {
} }
_resolvePossibleFunction(arg) { _resolvePossibleFunction(arg) {
return typeof arg === 'function' ? arg(this) : arg return execute(arg, [this])
} }
_putElementInTemplate(element, templateElement) { _putElementInTemplate(element, templateElement) {

View File

@ -631,6 +631,25 @@ describe('Util', () => {
Util.execute(spy) Util.execute(spy)
expect(spy).toHaveBeenCalled() expect(spy).toHaveBeenCalled()
}) })
it('should execute if arg is function & return the result', () => {
const functionFoo = (num1, num2 = 10) => num1 + num2
const resultFoo = Util.execute(functionFoo, [4, 5])
expect(resultFoo).toBe(9)
const resultFoo1 = Util.execute(functionFoo, [4])
expect(resultFoo1).toBe(14)
const functionBar = () => 'foo'
const resultBar = Util.execute(functionBar)
expect(resultBar).toBe('foo')
})
it('should not execute if arg is not function & return default argument', () => {
const foo = 'bar'
expect(Util.execute(foo)).toBe('bar')
expect(Util.execute(foo, [], 4)).toBe(4)
})
}) })
describe('executeAfterTransition', () => { describe('executeAfterTransition', () => {