Skip to content

feat(b-form-tags): add ignoreInputFocusSelector prop to make input focus behavior configurable (closes #5425) #5429

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
84ccbdf
fix(b-form-tags): fix input focus upon clicking on nested element
paweltatarczuk May 22, 2020
b629730
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 22, 2020
f8de3b5
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 25, 2020
8c9f948
Update form-tags.js
jacobmllr95 May 25, 2020
882087d
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 25, 2020
ac1f68f
Add `ignoreInputFocusSelector` prop
jacobmllr95 May 25, 2020
c6c2b2f
Update form-tags.js
jacobmllr95 May 26, 2020
18f705e
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 27, 2020
008ff13
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 27, 2020
2ba2cec
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 28, 2020
6220091
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 May 28, 2020
e1f5926
Add comment and more selectors to ignoreInputFocusSelector in form-ta…
paweltatarczuk Jun 7, 2020
b1b1bbf
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 Jun 7, 2020
bc31764
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 Jun 7, 2020
96988bc
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 Jun 8, 2020
ce93eed
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 Jun 13, 2020
5ae0812
Merge branch 'dev' into bugfix/5425-fix-input-focus-upon-clicking-on-…
jacobmllr95 Jul 15, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 33 additions & 7 deletions src/components/form-tags/form-tags.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,15 @@ import identity from '../../utils/identity'
import looseEqual from '../../utils/loose-equal'
import { arrayIncludes, concat } from '../../utils/array'
import { getComponentConfig } from '../../utils/config'
import { attemptBlur, attemptFocus, matches, requestAF, select } from '../../utils/dom'
import {
attemptBlur,
attemptFocus,
closest,
isActiveElement,
matches,
requestAF,
select
} from '../../utils/dom'
import { isEvent, isFunction, isString } from '../../utils/inspect'
import { escapeRegExp, toString, trim, trimLeft } from '../../utils/string'
import idMixin from '../../mixins/id'
Expand Down Expand Up @@ -178,6 +186,12 @@ export const BFormTags = /*#__PURE__*/ Vue.extend({
type: Boolean,
default: false
},
ignoreInputFocusSelector: {
// Disable the input focus behavior when clicking
// on element matching the selector (or selectors)
type: [Array, String],
default: () => ['.b-form-tag', 'button', 'input', 'select']
},
value: {
// The v-model prop
type: Array,
Expand Down Expand Up @@ -245,6 +259,13 @@ export const BFormTags = /*#__PURE__*/ Vue.extend({
const joiner = this.computedSeparator.charAt(0)
return joiner !== ' ' ? `${joiner} ` : joiner
},
computeIgnoreInputFocusSelector() {
// Normalize to an single selector with selectors separated by `,`
return concat(this.ignoreInputFocusSelector)
.filter(identity)
.join(',')
.trim()
},
disableAddButton() {
// If 'Add' button should be disabled
// If the input contains at least one tag that can
Expand Down Expand Up @@ -416,7 +437,13 @@ export const BFormTags = /*#__PURE__*/ Vue.extend({
},
// --- Wrapper event handlers ---
onClick(evt) {
if (!this.disabled && isEvent(evt) && evt.target === evt.currentTarget) {
const ignoreFocusSelector = this.computeIgnoreInputFocusSelector
const { target } = evt
if (
!this.disabled &&
!isActiveElement(target) &&
(!ignoreFocusSelector || !closest(ignoreFocusSelector, target, true))
) {
this.$nextTick(() => {
this.focus()
})
Expand Down Expand Up @@ -630,8 +657,7 @@ export const BFormTags = /*#__PURE__*/ Vue.extend({
staticClass: 'list-unstyled mt-n1 mb-0 d-flex flex-wrap align-items-center',
attrs: { id: tagListId }
},
// `concat()` is faster than array spread when args are known to be arrays
concat($tags, $field)
[$tags, $field]
)

// Assemble the feedback
Expand Down Expand Up @@ -792,12 +818,12 @@ export const BFormTags = /*#__PURE__*/ Vue.extend({
'aria-describedby': this.safeId('_selected_')
},
on: {
click: this.onClick,
focusin: this.onFocusin,
focusout: this.onFocusout,
click: this.onClick
focusout: this.onFocusout
}
},
concat($output, $removed, $content, $hidden)
[$output, $removed, $content, $hidden]
)
}
})
5 changes: 5 additions & 0 deletions src/components/form-tags/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@
{
"prop": "noOuterFocus",
"description": "When set, disables the focus styling of the component root element"
},
{
"prop": "ignoreInputFocusSelector",
"version": "2.16.0",
"description": "Ignore certain elements from the click to focus input routine, specified by css selector(s)"
}
],
"slots": [
Expand Down