StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
StackGenVis/frontend/node_modules/bootstrap-vue/esm/directives/toggle/toggle.js

149 lines
5.1 KiB

4 years ago
import looseEqual from '../../utils/loose-equal';
import { addClass, hasAttr, removeAttr, removeClass, setAttr } from '../../utils/dom';
import { isBrowser } from '../../utils/env';
import { bindTargets, getTargets, unbindTargets } from '../../utils/target'; // Target listen types
var listenTypes = {
click: true
}; // Property key for handler storage
var BV_TOGGLE = '__BV_toggle__';
var BV_TOGGLE_STATE = '__BV_toggle_STATE__';
var BV_TOGGLE_CONTROLS = '__BV_toggle_CONTROLS__';
var BV_TOGGLE_TARGETS = '__BV_toggle_TARGETS__'; // Emitted control event for collapse (emitted to collapse)
var EVENT_TOGGLE = 'bv::toggle::collapse'; // Listen to event for toggle state update (emitted by collapse)
var EVENT_STATE = 'bv::collapse::state'; // Private event emitted on $root to ensure the toggle state is always synced.
// Gets emitted even if the state of b-collapse has not changed.
// This event is NOT to be documented as people should not be using it.
var EVENT_STATE_SYNC = 'bv::collapse::sync::state'; // Private event we send to collapse to request state update sync event
var EVENT_STATE_REQUEST = 'bv::request::collapse::state'; // Reset and remove a property from the provided element
var resetProp = function resetProp(el, prop) {
el[prop] = null;
delete el[prop];
}; // Handle targets update
var handleTargets = function handleTargets(_ref) {
var targets = _ref.targets,
vnode = _ref.vnode;
targets.forEach(function (target) {
vnode.context.$root.$emit(EVENT_TOGGLE, target);
});
}; // Handle directive updates
/* istanbul ignore next: not easy to test */
var handleUpdate = function handleUpdate(el, binding, vnode) {
if (!isBrowser) {
return;
}
if (!looseEqual(getTargets(binding), el[BV_TOGGLE_TARGETS])) {
// Targets have changed, so update accordingly
unbindTargets(vnode, binding, listenTypes);
var targets = bindTargets(vnode, binding, listenTypes, handleTargets); // Update targets array to element
el[BV_TOGGLE_TARGETS] = targets; // Add aria attributes to element
el[BV_TOGGLE_CONTROLS] = targets.join(' '); // ensure aria-controls is up to date
setAttr(el, 'aria-controls', el[BV_TOGGLE_CONTROLS]); // Request a state update from targets so that we can ensure
// expanded state is correct
targets.forEach(function (target) {
vnode.context.$root.$emit(EVENT_STATE_REQUEST, target);
});
} // Ensure the collapse class and aria-* attributes persist
// after element is updated (either by parent re-rendering
// or changes to this element or its contents
if (el[BV_TOGGLE_STATE] === true) {
addClass(el, 'collapsed');
setAttr(el, 'aria-expanded', 'true');
} else if (el[BV_TOGGLE_STATE] === false) {
removeClass(el, 'collapsed');
setAttr(el, 'aria-expanded', 'false');
}
setAttr(el, 'aria-controls', el[BV_TOGGLE_CONTROLS]);
};
/*
* Export our directive
*/
export var VBToggle = {
bind: function bind(el, binding, vnode) {
var targets = bindTargets(vnode, binding, listenTypes, handleTargets);
if (isBrowser && vnode.context && targets.length > 0) {
// Add targets array to element
el[BV_TOGGLE_TARGETS] = targets; // Add aria attributes to element
el[BV_TOGGLE_CONTROLS] = targets.join(' '); // State is initially collapsed until we receive a state event
el[BV_TOGGLE_STATE] = false;
setAttr(el, 'aria-controls', el[BV_TOGGLE_CONTROLS]);
setAttr(el, 'aria-expanded', 'false'); // If element is not a button, we add `role="button"` for accessibility
if (el.tagName !== 'BUTTON' && !hasAttr(el, 'role')) {
setAttr(el, 'role', 'button');
} // Toggle state handler
var toggleDirectiveHandler = function toggleDirectiveHandler(id, state) {
var targets = el[BV_TOGGLE_TARGETS] || [];
if (targets.indexOf(id) !== -1) {
// Set aria-expanded state
setAttr(el, 'aria-expanded', state ? 'true' : 'false'); // Set/Clear 'collapsed' class state
el[BV_TOGGLE_STATE] = state;
if (state) {
removeClass(el, 'collapsed');
} else {
addClass(el, 'collapsed');
}
}
}; // Store the toggle handler on the element
el[BV_TOGGLE] = toggleDirectiveHandler; // Listen for toggle state changes (public)
vnode.context.$root.$on(EVENT_STATE, el[BV_TOGGLE]); // Listen for toggle state sync (private)
vnode.context.$root.$on(EVENT_STATE_SYNC, el[BV_TOGGLE]);
}
},
componentUpdated: handleUpdate,
updated: handleUpdate,
unbind: function unbind(el, binding, vnode)
/* istanbul ignore next */
{
unbindTargets(vnode, binding, listenTypes); // Remove our $root listener
if (el[BV_TOGGLE]) {
vnode.context.$root.$off(EVENT_STATE, el[BV_TOGGLE]);
vnode.context.$root.$off(EVENT_STATE_SYNC, el[BV_TOGGLE]);
} // Reset custom props
resetProp(el, BV_TOGGLE);
resetProp(el, BV_TOGGLE_STATE);
resetProp(el, BV_TOGGLE_CONTROLS);
resetProp(el, BV_TOGGLE_TARGETS); // Reset classes/attrs
removeClass(el, 'collapsed');
removeAttr(el, 'aria-expanded');
removeAttr(el, 'aria-controls');
removeAttr(el, 'role');
}
};