Skip to content

Commit eae060c

Browse files
authored
Merge branch 'dev' into tmorehouse/input-lazy
2 parents a02ab76 + 5c28bd2 commit eae060c

File tree

3 files changed

+93
-33
lines changed

3 files changed

+93
-33
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
"postcss-cli": "^6.1.3",
125125
"prettier": "1.14.3",
126126
"require-context": "^1.1.0",
127-
"rollup": "^1.22.0",
127+
"rollup": "^1.23.0",
128128
"rollup-plugin-babel": "^4.3.3",
129129
"rollup-plugin-commonjs": "^10.1.0",
130130
"rollup-plugin-node-resolve": "^5.2.0",

src/directives/modal/modal.js

Lines changed: 82 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,94 @@
1-
import { setAttr, removeAttr } from '../../utils/dom'
2-
import { bindTargets, unbindTargets } from '../../utils/target'
3-
4-
// Target listen types
5-
const listenTypes = { click: true }
1+
import {
2+
eventOn,
3+
eventOff,
4+
getAttr,
5+
hasAttr,
6+
isDisabled,
7+
matches,
8+
select,
9+
setAttr
10+
} from '../../utils/dom'
11+
import { isString } from '../../utils/inspect'
12+
import { keys } from '../../utils/object'
613

714
// Emitted show event for modal
815
const EVENT_SHOW = 'bv::show::modal'
916

10-
const setRole = (el, binding, vnode) => {
11-
if (el.tagName !== 'BUTTON') {
12-
setAttr(el, 'role', 'button')
17+
// Prop name we use to store info on root element
18+
const HANDLER = '__bv_modal_directive__'
19+
20+
const EVENT_OPTS = { passive: true }
21+
22+
const getTarget = ({ modifiers = {}, arg, value }) => {
23+
// Try value, then arg, otherwise pick last modifier
24+
return isString(value) ? value : isString(arg) ? arg : keys(modifiers).reverse()[0]
25+
}
26+
27+
const getTriggerElement = el => {
28+
// If root element is a dropdown item or nav item, we
29+
// need to target the inner link or button instead
30+
return el && matches(el, '.dropdown-menu > li, li.nav-item') ? select('a, button', el) || el : el
31+
}
32+
33+
const setRole = trigger => {
34+
// Only set a role if the trigger element doesn't have one
35+
if (trigger && trigger.tagName !== 'BUTTON' && !hasAttr(trigger, 'role')) {
36+
setAttr(trigger, 'role', 'button')
1337
}
1438
}
1539

40+
const bind = (el, binding, vnode) => {
41+
const target = getTarget(binding)
42+
const trigger = getTriggerElement(el)
43+
if (target && trigger) {
44+
const handler = evt => {
45+
// `currentTarget` is the element with the listener on it
46+
const currentTarget = evt.currentTarget
47+
if (!isDisabled(currentTarget)) {
48+
const type = evt.type
49+
// Open modal only if trigger is not disabled
50+
if (type === 'click' || (type === 'keydown' && evt.keyCode === 32)) {
51+
vnode.context.$root.$emit(EVENT_SHOW, target, currentTarget)
52+
}
53+
}
54+
}
55+
el[HANDLER] = handler
56+
// If element is not a button, we add `role="button"` for accessibility
57+
setRole(trigger)
58+
// Listen for click events
59+
eventOn(trigger, 'click', handler, EVENT_OPTS)
60+
if (trigger.tagName !== 'BUTTON' && getAttr(trigger, 'role') === 'button') {
61+
// If trigger isn't a button but has role button,
62+
// we also listen for `keydown.space`
63+
eventOn(trigger, 'keydown', handler, EVENT_OPTS)
64+
}
65+
}
66+
}
67+
68+
const unbind = el => {
69+
const trigger = getTriggerElement(el)
70+
const handler = el ? el[HANDLER] : null
71+
if (trigger && handler) {
72+
eventOff(trigger, 'click', handler, EVENT_OPTS)
73+
eventOff(trigger, 'keydown', handler, EVENT_OPTS)
74+
}
75+
delete el[HANDLER]
76+
}
77+
78+
const componentUpdated = (el, binding, vnode) => {
79+
// We bind and rebind just in case target changes
80+
unbind(el, binding, vnode)
81+
bind(el, binding, vnode)
82+
}
83+
84+
const updated = () => {}
85+
1686
/*
1787
* Export our directive
1888
*/
1989
export const VBModal = {
20-
// eslint-disable-next-line no-shadow-restricted-names
21-
bind(el, binding, vnode) {
22-
bindTargets(vnode, binding, listenTypes, ({ targets, vnode }) => {
23-
targets.forEach(target => {
24-
vnode.context.$root.$emit(EVENT_SHOW, target, vnode.elm)
25-
})
26-
})
27-
// If element is not a button, we add `role="button"` for accessibility
28-
setRole(el, binding, vnode)
29-
},
30-
updated: setRole,
31-
componentUpdated: setRole,
32-
unbind(el, binding, vnode) {
33-
unbindTargets(vnode, binding, listenTypes)
34-
// If element is not a button, we add `role="button"` for accessibility
35-
if (el.tagName !== 'BUTTON') {
36-
removeAttr(el, 'role', 'button')
37-
}
38-
}
90+
inserted: componentUpdated,
91+
updated,
92+
componentUpdated,
93+
unbind
3994
}

yarn.lock

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,11 @@
14371437
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.1.tgz#d5544f6de0aae03eefbb63d5120f6c8be0691946"
14381438
integrity sha512-rp7La3m845mSESCgsJePNL/JQyhkOJA6G4vcwvVgkDAwHhGdq5GCumxmPjEk1MZf+8p5ZQAUE7tqgQRQTXN7uQ==
14391439

1440+
"@types/node@^12.7.10":
1441+
version "12.7.10"
1442+
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.10.tgz#942c128c37b5d780aff5441fd457cd7ffdc18b36"
1443+
integrity sha512-ObiPa43kJCkgjG+7usRCoxWhqKCmT5JWvi+8bg54KMkP2CvTliYLmKR9uHLaz+51JDOX/8MjWc6Xz18xHTs7XQ==
1444+
14401445
"@types/q@^1.5.1":
14411446
version "1.5.2"
14421447
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
@@ -10610,13 +10615,13 @@ rollup-pluginutils@^2.8.1:
1061010615
dependencies:
1061110616
estree-walker "^0.6.1"
1061210617

10613-
rollup@^1.22.0:
10614-
version "1.22.0"
10615-
resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.22.0.tgz#a5b2672c0eebe9f2b6454220f785dbc09b64b4bc"
10616-
integrity sha512-x4l4ZrV/Mr/x/jvFTmwROdEAhbZjx16yDRTVSKWh/i4oJDuW2dVEbECT853mybYCz7BAitU8ElGlhx7dNjw3qQ==
10618+
rollup@^1.23.0:
10619+
version "1.23.0"
10620+
resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.23.0.tgz#e2b2686fc77dfc7891f5adb95c8d865e0f1eb5f4"
10621+
integrity sha512-/p72Z3NbHWV+Vi1p2X+BmPA3WqlZxpUqCy6E8U4crMohZnI+j9Ob8ZAfFyNfddT0LxgnJM0olO4mg+noH4SFbg==
1061710622
dependencies:
1061810623
"@types/estree" "*"
10619-
"@types/node" "*"
10624+
"@types/node" "^12.7.10"
1062010625
acorn "^7.1.0"
1062110626

1062210627
rsvp@^4.8.4:

0 commit comments

Comments
 (0)