hdwpos/WEB-INF/src/js/components/toggle.js

216 lines
5.4 KiB
JavaScript

"use strict";
// Class definition
var KTToggle = function(element, options) {
////////////////////////////
// ** Private variables ** //
////////////////////////////
var the = this;
if (!element) {
return;
}
// Default Options
var defaultOptions = {
saveState: true
};
////////////////////////////
// ** Private methods ** //
////////////////////////////
var _construct = function() {
if ( KTUtil.data(element).has('toggle') === true ) {
the = KTUtil.data(element).get('toggle');
} else {
_init();
}
}
var _init = function() {
// Variables
the.options = KTUtil.deepExtend({}, defaultOptions, options);
the.uid = KTUtil.getUniqueId('toggle');
// Elements
the.element = element;
the.target = document.querySelector(the.element.getAttribute('data-kt-toggle-target')) ? document.querySelector(the.element.getAttribute('data-kt-toggle-target')) : the.element;
the.state = the.element.hasAttribute('data-kt-toggle-state') ? the.element.getAttribute('data-kt-toggle-state') : '';
the.mode = the.element.hasAttribute('data-kt-toggle-mode') ? the.element.getAttribute('data-kt-toggle-mode') : '';
the.attribute = 'data-kt-' + the.element.getAttribute('data-kt-toggle-name');
// Event Handlers
_handlers();
// Bind Instance
KTUtil.data(the.element).set('toggle', the);
}
var _handlers = function() {
KTUtil.addEvent(the.element, 'click', function(e) {
e.preventDefault();
if ( the.mode !== '' ) {
if ( the.mode === 'off' && _isEnabled() === false ) {
_toggle();
} else if ( the.mode === 'on' && _isEnabled() === true ) {
_toggle();
}
} else {
_toggle();
}
});
}
// Event handlers
var _toggle = function() {
// Trigger "after.toggle" event
KTEventHandler.trigger(the.element, 'kt.toggle.change', the);
if ( _isEnabled() ) {
_disable();
} else {
_enable();
}
// Trigger "before.toggle" event
KTEventHandler.trigger(the.element, 'kt.toggle.changed', the);
return the;
}
var _enable = function() {
if ( _isEnabled() === true ) {
return;
}
KTEventHandler.trigger(the.element, 'kt.toggle.enable', the);
the.target.setAttribute(the.attribute, 'on');
if (the.state.length > 0) {
the.element.classList.add(the.state);
}
if ( typeof KTCookie !== 'undefined' && the.options.saveState === true ) {
KTCookie.set(the.attribute, 'on');
}
KTEventHandler.trigger(the.element, 'kt.toggle.enabled', the);
return the;
}
var _disable = function() {
if ( _isEnabled() === false ) {
return;
}
KTEventHandler.trigger(the.element, 'kt.toggle.disable', the);
the.target.removeAttribute(the.attribute);
if (the.state.length > 0) {
the.element.classList.remove(the.state);
}
if ( typeof KTCookie !== 'undefined' && the.options.saveState === true ) {
KTCookie.remove(the.attribute);
}
KTEventHandler.trigger(the.element, 'kt.toggle.disabled', the);
return the;
}
var _isEnabled = function() {
return (String(the.target.getAttribute(the.attribute)).toLowerCase() === 'on');
}
var _destroy = function() {
KTUtil.data(the.element).remove('toggle');
}
// Construct class
_construct();
///////////////////////
// ** Public API ** //
///////////////////////
// Plugin API
the.toggle = function() {
return _toggle();
}
the.enable = function() {
return _enable();
}
the.disable = function() {
return _disable();
}
the.isEnabled = function() {
return _isEnabled();
}
the.goElement = function() {
return the.element;
}
the.destroy = function() {
return _destroy();
}
// Event API
the.on = function(name, handler) {
return KTEventHandler.on(the.element, name, handler);
}
the.one = function(name, handler) {
return KTEventHandler.one(the.element, name, handler);
}
the.off = function(name, handlerId) {
return KTEventHandler.off(the.element, name, handlerId);
}
the.trigger = function(name, event) {
return KTEventHandler.trigger(the.element, name, event, the, event);
}
};
// Static methods
KTToggle.getInstance = function(element) {
if ( element !== null && KTUtil.data(element).has('toggle') ) {
return KTUtil.data(element).get('toggle');
} else {
return null;
}
}
// Create instances
KTToggle.createInstances = function(selector = '[data-kt-toggle]') {
// Get instances
var elements = document.body.querySelectorAll(selector);
if ( elements && elements.length > 0 ) {
for (var i = 0, len = elements.length; i < len; i++) {
// Initialize instances
new KTToggle(elements[i]);
}
}
}
// Global initialization
KTToggle.init = function() {
KTToggle.createInstances();
};
// Webpack support
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = KTToggle;
}