mirror of
https://github.com/mdbootstrap/mdb-ui-kit.git
synced 2024-11-29 13:04:14 +03:00
Release 2.2.0
This commit is contained in:
parent
8332fda367
commit
bea9785557
|
@ -1,5 +1,5 @@
|
||||||
MDB5
|
MDB5
|
||||||
Version: FREE 2.1.0
|
Version: FREE 2.2.0
|
||||||
|
|
||||||
Documentation:
|
Documentation:
|
||||||
https://mdbootstrap.com/docs/standard/
|
https://mdbootstrap.com/docs/standard/
|
||||||
|
|
14
css/mdb.min.css
vendored
14
css/mdb.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
118
index.html
118
index.html
|
@ -17,53 +17,38 @@
|
||||||
<!-- MDB -->
|
<!-- MDB -->
|
||||||
<link rel="stylesheet" href="css/mdb.min.css" />
|
<link rel="stylesheet" href="css/mdb.min.css" />
|
||||||
<!-- Custom styles -->
|
<!-- Custom styles -->
|
||||||
<style></style>
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: #2e2e2e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-poppy-red {
|
||||||
|
color: #ef5350 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-poppy-red {
|
||||||
|
background-color: #ef5350 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-poppy-red {
|
||||||
|
background-color: #ef5350 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Start your project here-->
|
<!-- Start your project here-->
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="d-flex justify-content-center align-items-center" style="height: 100vh;">
|
<div class="d-flex justify-content-center align-items-center" style="height: 100vh;">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<!-- <i class="fas fa-ticket-alt fa-10x"></i> -->
|
<h1 class="text-white text-poppy-red">BLACK NOVEMBER SURPRISE!</h1>
|
||||||
<img
|
<i class="fas fa-shopping-basket text-white fa-10x"></i>
|
||||||
src="https://mdbootstrap.com/img/Marketing/other/mdb50off.png"
|
<p class="mt-2 text-white">
|
||||||
height="150px"
|
Check what we have prepared and start using the richest UI Kit today.<br />Hurry up & don't
|
||||||
width="150px"
|
|
||||||
/>
|
|
||||||
<h5 class="mb-3">Release surprise! 50% OFF MDB 5 PRO</h5>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Use this coupon code before the next release to claim the reward.<br />Hurry up & don't
|
|
||||||
loose your chance.
|
loose your chance.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<code class="text-uppercase h1 px-2 rounded bg-dark text-white">MB8XW23V</code>
|
<a type="button" class="btn btn-danger btn-rounded btn-lg text-white bg-poppy-red" href="https://mdbootstrap.com/sale/" ><i class="fas fa-cart-arrow-down"></i> CLAIM OFFER</a>
|
||||||
</p>
|
</p>
|
||||||
<a
|
|
||||||
class="btn btn-primary btn-lg"
|
|
||||||
onclick="copy('MB8XW23V');toastr.info('Coupon code copied! Use it on the checkout.');"
|
|
||||||
target="_blank"
|
|
||||||
role="button"
|
|
||||||
id="code-button"
|
|
||||||
>CLAIM DISCOUNT</a
|
|
||||||
>
|
|
||||||
|
|
||||||
<a
|
|
||||||
class="btn btn-outline-primary btn-lg"
|
|
||||||
href="https://mdbootstrap.com/docs/standard/getting-started/"
|
|
||||||
target="_blank"
|
|
||||||
role="button"
|
|
||||||
>START TUTORIAL</a
|
|
||||||
>
|
|
||||||
<div class="my-2 alert alert-success" id="code-success" style="display: none;">
|
|
||||||
Copied
|
|
||||||
</div>
|
|
||||||
<p>See <a href="https://mdbootstrap.com/docs/standard/pro/">prices</a></p>
|
|
||||||
<h5 class="h1-responsive text-uppercase mt-3">
|
|
||||||
the code <span class="font-weight-bold"></span> expires in:<br />
|
|
||||||
<span class="font-weight-bold" id="time-counter"></span>
|
|
||||||
</h5>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -73,62 +58,5 @@
|
||||||
<!-- MDB -->
|
<!-- MDB -->
|
||||||
<script type="text/javascript" src="js/mdb.min.js"></script>
|
<script type="text/javascript" src="js/mdb.min.js"></script>
|
||||||
<!-- Custom scripts -->
|
<!-- Custom scripts -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript"></script>
|
||||||
var button = document.getElementById('code-button');
|
|
||||||
button.onclick = function () {
|
|
||||||
var div = document.getElementById('code-success');
|
|
||||||
if (div.style.display !== 'none') {
|
|
||||||
div.style.display = 'none';
|
|
||||||
} else {
|
|
||||||
div.style.display = 'block';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function copy(text) {
|
|
||||||
var textarea = document.createElement('textarea');
|
|
||||||
textarea.value = text;
|
|
||||||
document.body.appendChild(textarea);
|
|
||||||
textarea.select();
|
|
||||||
document.execCommand('copy');
|
|
||||||
document.body.removeChild(textarea);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ad counter
|
|
||||||
// Set the date we're counting down to
|
|
||||||
var countDownDate = new Date(Date.UTC(2020, 10, 17, 10, 00, 00));
|
|
||||||
var counterElement = document.getElementById('time-counter');
|
|
||||||
|
|
||||||
// Update the count down every 1 second
|
|
||||||
function startCounter() {
|
|
||||||
//wrapped in an if to prevent console errors if the element isn't found on the page
|
|
||||||
if (counterElement == null) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
var x = setInterval(function () {
|
|
||||||
// Get todays date and time
|
|
||||||
var now = new Date().getTime();
|
|
||||||
|
|
||||||
// Find the distance between now an the count down date
|
|
||||||
var distance = countDownDate - now;
|
|
||||||
|
|
||||||
// Time calculations for days, hours, minutes and seconds
|
|
||||||
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
|
|
||||||
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
||||||
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
|
|
||||||
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
|
|
||||||
|
|
||||||
// Display the result in the element with id="demo"
|
|
||||||
counterElement.innerHTML = days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's';
|
|
||||||
|
|
||||||
// If the count down is finished, write some text
|
|
||||||
if (distance < 0) {
|
|
||||||
clearInterval(x);
|
|
||||||
document.getElementById('time-counter').innerHTML =
|
|
||||||
'<p class="h3 grey-text">Sale ended :(</p>';
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
startCounter();
|
|
||||||
</script>
|
|
||||||
</html>
|
</html>
|
6
js/mdb.min.js
vendored
6
js/mdb.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "mdb-ui-kit",
|
"name": "mdb-ui-kit",
|
||||||
"version": "2.1.0",
|
"version": "2.2.0",
|
||||||
"main": "js/mdb.min.js",
|
"main": "js/mdb.min.js",
|
||||||
"repository": "https://github.com/mdbootstrap/mdb-ui-kit.git",
|
"repository": "https://github.com/mdbootstrap/mdb-ui-kit.git",
|
||||||
"author": "MDBootstrap",
|
"author": "MDBootstrap",
|
||||||
|
|
94
src/js/free/alert.js
Normal file
94
src/js/free/alert.js
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSAlert from '../bootstrap/src/alert';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'alert';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_CLOSE_BS = 'close.bs.alert';
|
||||||
|
const EVENT_CLOSED_BS = 'closed.bs.alert';
|
||||||
|
|
||||||
|
const EVENT_CLOSE = `close${EVENT_KEY}`;
|
||||||
|
const EVENT_CLOSED = `closed${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_ALERT = '.alert';
|
||||||
|
|
||||||
|
class Alert extends BSAlert {
|
||||||
|
constructor(element, data = {}) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_CLOSE_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_CLOSED_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindCloseEvent();
|
||||||
|
this._bindClosedEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindCloseEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_CLOSE_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_CLOSE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindClosedEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_CLOSED_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_CLOSED);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_ALERT).forEach((el) => {
|
||||||
|
let instance = Alert.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Alert(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Alert.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Alert;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Alert.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Alert;
|
104
src/js/free/carousel.js
Normal file
104
src/js/free/carousel.js
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSCarousel from '../bootstrap/src/carousel';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'carousel';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_SLIDE_BS = 'slide.bs.carousel';
|
||||||
|
const EVENT_SLID_BS = 'slid.bs.carousel';
|
||||||
|
|
||||||
|
const EVENT_SLIDE = `slide${EVENT_KEY}`;
|
||||||
|
const EVENT_SLID = `slid${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_DATA_RIDE = '[data-ride="carousel"]';
|
||||||
|
|
||||||
|
class Carousel extends BSCarousel {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_SLIDE_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_SLID_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindSlideEvent();
|
||||||
|
this._bindSlidEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindSlideEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SLIDE_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SLIDE, {
|
||||||
|
relatedTarget: e.relatedTarget,
|
||||||
|
direction: e.direction,
|
||||||
|
from: e.from,
|
||||||
|
to: e.to,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindSlidEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SLID_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SLID, {
|
||||||
|
relatedTarget: e.relatedTarget,
|
||||||
|
direction: e.direction,
|
||||||
|
from: e.from,
|
||||||
|
to: e.to,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_RIDE).forEach((el) => {
|
||||||
|
let instance = Carousel.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Carousel(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Carousel.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Carousel;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Carousel.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Carousel;
|
|
@ -11,6 +11,9 @@ import Manipulator from '../bootstrap/src/dom/manipulator';
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const NAME = 'dropdown';
|
const NAME = 'dropdown';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
const SELECTOR_EXPAND = '[data-toggle="dropdown"]';
|
const SELECTOR_EXPAND = '[data-toggle="dropdown"]';
|
||||||
|
|
||||||
const Default = {
|
const Default = {
|
||||||
|
@ -36,6 +39,12 @@ const DefaultType = {
|
||||||
const EVENT_HIDE = 'hide.bs.dropdown';
|
const EVENT_HIDE = 'hide.bs.dropdown';
|
||||||
const EVENT_HIDDEN = 'hidden.bs.dropdown';
|
const EVENT_HIDDEN = 'hidden.bs.dropdown';
|
||||||
const EVENT_SHOW = 'show.bs.dropdown';
|
const EVENT_SHOW = 'show.bs.dropdown';
|
||||||
|
const EVENT_SHOWN = 'shown.bs.dropdown';
|
||||||
|
|
||||||
|
const EVENT_HIDE_MDB = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN_MDB = `hidden${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOW_MDB = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN_MDB = `shown${EVENT_KEY}`;
|
||||||
|
|
||||||
const ANIMATION_CLASS = 'animation';
|
const ANIMATION_CLASS = 'animation';
|
||||||
const ANIMATION_SHOW_CLASS = 'fade-in';
|
const ANIMATION_SHOW_CLASS = 'fade-in';
|
||||||
|
@ -59,6 +68,7 @@ class Dropdown extends BSDropdown {
|
||||||
|
|
||||||
dispose() {
|
dispose() {
|
||||||
EventHandler.off(this._element, EVENT_SHOW);
|
EventHandler.off(this._element, EVENT_SHOW);
|
||||||
|
EventHandler.off(this._parent, EVENT_SHOWN);
|
||||||
EventHandler.off(this._parent, EVENT_HIDE);
|
EventHandler.off(this._parent, EVENT_HIDE);
|
||||||
EventHandler.off(this._parent, EVENT_HIDDEN);
|
EventHandler.off(this._parent, EVENT_HIDDEN);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
@ -72,6 +82,7 @@ class Dropdown extends BSDropdown {
|
||||||
// Private
|
// Private
|
||||||
_init() {
|
_init() {
|
||||||
this._bindShowEvent();
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
this._bindHideEvent();
|
this._bindHideEvent();
|
||||||
this._bindHiddenEvent();
|
this._bindHiddenEvent();
|
||||||
}
|
}
|
||||||
|
@ -87,20 +98,32 @@ class Dropdown extends BSDropdown {
|
||||||
}
|
}
|
||||||
|
|
||||||
_bindShowEvent() {
|
_bindShowEvent() {
|
||||||
EventHandler.on(this._element, EVENT_SHOW, () => {
|
EventHandler.on(this._element, EVENT_SHOW, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOW_MDB, { relatedTarget: e.relatedTarget });
|
||||||
|
|
||||||
this._dropdownAnimationStart('show');
|
this._dropdownAnimationStart('show');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this._parent, EVENT_SHOWN, (e) => {
|
||||||
|
EventHandler.trigger(this._parent, EVENT_SHOWN_MDB, { relatedTarget: e.relatedTarget });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
_bindHideEvent() {
|
_bindHideEvent() {
|
||||||
EventHandler.on(this._parent, EVENT_HIDE, () => {
|
EventHandler.on(this._parent, EVENT_HIDE, (e) => {
|
||||||
|
EventHandler.trigger(this._parent, EVENT_HIDE_MDB, { relatedTarget: e.relatedTarget });
|
||||||
|
|
||||||
this._menuStyle = this._menu.style.cssText;
|
this._menuStyle = this._menu.style.cssText;
|
||||||
this._xPlacement = this._menu.getAttribute('x-placement');
|
this._xPlacement = this._menu.getAttribute('x-placement');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_bindHiddenEvent() {
|
_bindHiddenEvent() {
|
||||||
EventHandler.on(this._parent, EVENT_HIDDEN, () => {
|
EventHandler.on(this._parent, EVENT_HIDDEN, (e) => {
|
||||||
|
EventHandler.trigger(this._parent, EVENT_HIDDEN_MDB, { relatedTarget: e.relatedTarget });
|
||||||
|
|
||||||
this._menu.style.cssText = this._menuStyle;
|
this._menu.style.cssText = this._menuStyle;
|
||||||
this._menu.setAttribute('x-placement', this._xPlacement);
|
this._menu.setAttribute('x-placement', this._xPlacement);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { element } from '../mdb/util/index';
|
import { element, getjQuery } from '../mdb/util/index';
|
||||||
import Data from '../mdb/dom/data';
|
import Data from '../mdb/dom/data';
|
||||||
import EventHandler from '../bootstrap/src/dom/event-handler';
|
import EventHandler from '../bootstrap/src/dom/event-handler';
|
||||||
import Manipulator from '../mdb/dom/manipulator';
|
import Manipulator from '../mdb/dom/manipulator';
|
||||||
|
@ -86,6 +86,10 @@ class Input {
|
||||||
Manipulator.addClass(this.input, CLASSNAME_ACTIVE);
|
Manipulator.addClass(this.input, CLASSNAME_ACTIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forceInactive() {
|
||||||
|
Manipulator.removeClass(this.input, CLASSNAME_ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
dispose() {
|
dispose() {
|
||||||
this._removeBorder();
|
this._removeBorder();
|
||||||
|
|
||||||
|
@ -208,6 +212,25 @@ class Input {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jQueryInterface(config, options) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = Data.getData(this, DATA_KEY);
|
||||||
|
const _config = typeof config === 'object' && config;
|
||||||
|
if (!data && /dispose/.test(config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!data) {
|
||||||
|
data = new Input(this, _config);
|
||||||
|
}
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (typeof data[config] === 'undefined') {
|
||||||
|
throw new TypeError(`No method named "${config}"`);
|
||||||
|
}
|
||||||
|
data[config](options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
static getInstance(element) {
|
static getInstance(element) {
|
||||||
return Data.getData(element, DATA_KEY);
|
return Data.getData(element, DATA_KEY);
|
||||||
}
|
}
|
||||||
|
@ -224,12 +247,16 @@ EventHandler.on(document, 'blur', SELECTOR_OUTLINE_TEXTAREA, Input.deactivate(ne
|
||||||
EventHandler.on(window, 'shown.bs.modal', (e) => {
|
EventHandler.on(window, 'shown.bs.modal', (e) => {
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -237,12 +264,16 @@ EventHandler.on(window, 'shown.bs.modal', (e) => {
|
||||||
EventHandler.on(window, 'shown.bs.dropdown', (e) => {
|
EventHandler.on(window, 'shown.bs.dropdown', (e) => {
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -252,12 +283,16 @@ EventHandler.on(window, 'shown.bs.tab', (e) => {
|
||||||
const target = SelectorEngine.findOne(`#${targetId}`);
|
const target = SelectorEngine.findOne(`#${targetId}`);
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, target).forEach((element) => {
|
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, target).forEach((element) => {
|
||||||
const instance = Input.getInstance(element.parentNode);
|
const instance = Input.getInstance(element.parentNode);
|
||||||
if (!instance) return;
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.update();
|
instance.update();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -265,11 +300,43 @@ EventHandler.on(window, 'shown.bs.tab', (e) => {
|
||||||
// auto-init
|
// auto-init
|
||||||
SelectorEngine.find(`.${CLASSNAME_WRAPPER}`).map((element) => new Input(element));
|
SelectorEngine.find(`.${CLASSNAME_WRAPPER}`).map((element) => new Input(element));
|
||||||
|
|
||||||
|
// form reset handler
|
||||||
|
EventHandler.on(window, 'reset', (e) => {
|
||||||
|
SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => {
|
||||||
|
const instance = Input.getInstance(element.parentNode);
|
||||||
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
instance.forceInactive();
|
||||||
|
});
|
||||||
|
SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => {
|
||||||
|
const instance = Input.getInstance(element.parentNode);
|
||||||
|
if (!instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
instance.forceInactive();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// auto-fill
|
// auto-fill
|
||||||
EventHandler.on(window, 'onautocomplete', (e) => {
|
EventHandler.on(window, 'onautocomplete', (e) => {
|
||||||
const instance = Input.getInstance(e.target.parentNode);
|
const instance = Input.getInstance(e.target.parentNode);
|
||||||
if (!instance) return;
|
if (!instance || !e.cancelable) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
instance.forceActive();
|
instance.forceActive();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Input.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Input;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Input.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export default Input;
|
export default Input;
|
||||||
|
|
127
src/js/free/modal.js
Normal file
127
src/js/free/modal.js
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
import { getjQuery, getSelectorFromElement } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSModal from '../bootstrap/src/modal';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'modal';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_HIDE_BS = 'hide.bs.modal';
|
||||||
|
const EVENT_HIDE_PREVENTED_BS = 'hidePrevented.bs.modal';
|
||||||
|
const EVENT_HIDDEN_BS = 'hidden.bs.modal';
|
||||||
|
const EVENT_SHOW_BS = 'show.bs.modal';
|
||||||
|
const EVENT_SHOWN_BS = 'shown.bs.modal';
|
||||||
|
|
||||||
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]';
|
||||||
|
|
||||||
|
class Modal extends BSModal {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_SHOW_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_SHOWN_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDE_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDDEN_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDE_PREVENTED_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
|
this._bindHideEvent();
|
||||||
|
this._bindHiddenEvent();
|
||||||
|
this._bindHidePreventedEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShowEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOW_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget: e.relatedTarget });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOWN_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget: e.relatedTarget });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHideEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_HIDE_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_HIDE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHiddenEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_HIDDEN_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHidePreventedEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_HIDE_PREVENTED_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => {
|
||||||
|
const selector = getSelectorFromElement(el);
|
||||||
|
const selectorElement = SelectorEngine.findOne(selector);
|
||||||
|
|
||||||
|
let instance = Modal.getInstance(selectorElement);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Modal(selectorElement);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Modal.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Modal;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Modal.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Modal;
|
124
src/js/free/popover.js
Normal file
124
src/js/free/popover.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSPopover from '../bootstrap/src/popover';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'popover';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_SHOW_BS = 'show.bs.popover';
|
||||||
|
const EVENT_SHOWN_BS = 'shown.bs.popover';
|
||||||
|
const EVENT_HIDE_BS = 'hide.bs.popover';
|
||||||
|
const EVENT_HIDDEN_BS = 'hidden.bs.popover';
|
||||||
|
const EVENT_INSERTED_BS = 'inserted.bs.popover';
|
||||||
|
|
||||||
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||||||
|
const EVENT_INSERTED = `inserted${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_DATA_TOGGLE = '[data-toggle="popover"]';
|
||||||
|
|
||||||
|
class Popover extends BSPopover {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this.element, EVENT_SHOW_BS);
|
||||||
|
EventHandler.off(this.element, EVENT_SHOWN_BS);
|
||||||
|
EventHandler.off(this.element, EVENT_HIDE_BS);
|
||||||
|
EventHandler.off(this.element, EVENT_HIDDEN_BS);
|
||||||
|
EventHandler.off(this.element, EVENT_INSERTED_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
|
this._bindHideEvent();
|
||||||
|
this._bindHiddenEvent();
|
||||||
|
this._bindInsertedEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShowEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_SHOW_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_SHOW);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_SHOWN_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_SHOWN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHideEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_HIDE_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_HIDE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHiddenEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_HIDDEN_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindInsertedEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_INSERTED_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_INSERTED);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => {
|
||||||
|
let instance = Popover.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Popover(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Popover.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Popover;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Popover.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Popover;
|
157
src/js/free/range.js
Normal file
157
src/js/free/range.js
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
import { getjQuery, element } from '../mdb/util/index';
|
||||||
|
import Data from '../mdb/dom/data';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import Manipulator from '../mdb/dom/manipulator';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'range';
|
||||||
|
const DATA_KEY = 'mdb.range';
|
||||||
|
const CLASSNAME_THUMB = 'thumb';
|
||||||
|
const CLASSNAME_WRAPPER = 'range';
|
||||||
|
const CLASSNAME_ACTIVE = 'thumb-active';
|
||||||
|
const CLASSNAME_THUMB_VALUE = 'thumb-value';
|
||||||
|
|
||||||
|
const SELECTOR_THUMB_VALUE = `.${CLASSNAME_THUMB_VALUE}`;
|
||||||
|
const SELECTOR_WRAPPER = `.${CLASSNAME_WRAPPER}`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Class Definition
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Range {
|
||||||
|
constructor(element) {
|
||||||
|
this._element = element;
|
||||||
|
this._initiated = false;
|
||||||
|
|
||||||
|
if (this._element) {
|
||||||
|
Data.setData(element, DATA_KEY, this);
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
get rangeInput() {
|
||||||
|
return SelectorEngine.findOne('input[type=range]', this._element);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public
|
||||||
|
init() {
|
||||||
|
if (this._initiated) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._addThumb();
|
||||||
|
this._updateValue();
|
||||||
|
this._thumbPositionUpdate();
|
||||||
|
this._handleEvents();
|
||||||
|
this._initiated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
this._disposeEvents();
|
||||||
|
Data.removeData(this._element, DATA_KEY);
|
||||||
|
this._element = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_addThumb() {
|
||||||
|
const RANGE_THUMB = element('span');
|
||||||
|
Manipulator.addClass(RANGE_THUMB, CLASSNAME_THUMB);
|
||||||
|
RANGE_THUMB.innerHTML = '<span class="thumb-value"></span>';
|
||||||
|
this._element.append(RANGE_THUMB);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateValue() {
|
||||||
|
const thumbValue = SelectorEngine.findOne(SELECTOR_THUMB_VALUE, this._element);
|
||||||
|
thumbValue.textContent = this.rangeInput.value;
|
||||||
|
this.rangeInput.oninput = () => (thumbValue.textContent = this.rangeInput.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleEvents() {
|
||||||
|
EventHandler.on(this.rangeInput, 'mousedown', () => this._showThumb());
|
||||||
|
EventHandler.on(this.rangeInput, 'mouseup', () => this._hideThumb());
|
||||||
|
EventHandler.on(this.rangeInput, 'touchstart', () => this._showThumb());
|
||||||
|
EventHandler.on(this.rangeInput, 'touchend', () => this._hideThumb());
|
||||||
|
EventHandler.on(this.rangeInput, 'input', () => this._thumbPositionUpdate());
|
||||||
|
}
|
||||||
|
|
||||||
|
_disposeEvents() {
|
||||||
|
EventHandler.off(this.rangeInput, 'mousedown', this._showThumb);
|
||||||
|
EventHandler.off(this.rangeInput, 'mouseup', this._hideThumb);
|
||||||
|
EventHandler.off(this.rangeInput, 'touchstart', this._showThumb);
|
||||||
|
EventHandler.off(this.rangeInput, 'touchend', this._hideThumb);
|
||||||
|
EventHandler.off(this.rangeInput, 'input', this._thumbPositionUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
_showThumb() {
|
||||||
|
Manipulator.addClass(this._element.lastElementChild, CLASSNAME_ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
_hideThumb() {
|
||||||
|
Manipulator.removeClass(this._element.lastElementChild, CLASSNAME_ACTIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
_thumbPositionUpdate() {
|
||||||
|
const rangeInput = this.rangeInput;
|
||||||
|
const inputValue = rangeInput.value;
|
||||||
|
const minValue = rangeInput.min ? rangeInput.min : 0;
|
||||||
|
const maxValue = rangeInput.max ? rangeInput.max : 100;
|
||||||
|
const thumb = this._element.lastElementChild;
|
||||||
|
const newValue = Number(((inputValue - minValue) * 100) / (maxValue - minValue));
|
||||||
|
thumb.firstElementChild.textContent = inputValue;
|
||||||
|
Manipulator.style(thumb, { left: `calc(${newValue}% + (${8 - newValue * 0.15}px))` });
|
||||||
|
}
|
||||||
|
// Static
|
||||||
|
|
||||||
|
static getInstance(element) {
|
||||||
|
return Data.getData(element, DATA_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
static jQueryInterface(config, options) {
|
||||||
|
return this.each(function () {
|
||||||
|
let data = Data.getData(this, DATA_KEY);
|
||||||
|
const _config = typeof config === 'object' && config;
|
||||||
|
if (!data && /dispose/.test(config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!data) {
|
||||||
|
data = new Range(this, _config);
|
||||||
|
}
|
||||||
|
if (typeof config === 'string') {
|
||||||
|
if (typeof data[config] === 'undefined') {
|
||||||
|
throw new TypeError(`No method named "${config}"`);
|
||||||
|
}
|
||||||
|
data[config](options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// auto-init
|
||||||
|
SelectorEngine.find(SELECTOR_WRAPPER).map((element) => new Range(element));
|
||||||
|
|
||||||
|
// jQuery init
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Range.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Range;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Range.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Range;
|
|
@ -31,7 +31,7 @@ const BOOTSTRAP_COLORS = [
|
||||||
'dark',
|
'dark',
|
||||||
];
|
];
|
||||||
|
|
||||||
// Sets walue when run opacity transition
|
// Sets value when run opacity transition
|
||||||
// Hide element after 50% (0.5) time of animation and finish on 100%
|
// Hide element after 50% (0.5) time of animation and finish on 100%
|
||||||
const TRANSITION_BREAK_OPACITY = 0.5;
|
const TRANSITION_BREAK_OPACITY = 0.5;
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ class Ripple {
|
||||||
}
|
}
|
||||||
|
|
||||||
_addClickEvent(target) {
|
_addClickEvent(target) {
|
||||||
EventHandler.on(target, 'click', this._clickHandler);
|
EventHandler.on(target, 'mousedown', this._clickHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
_createRipple(event) {
|
_createRipple(event) {
|
||||||
|
@ -342,8 +342,8 @@ class Ripple {
|
||||||
* ------------------------------------------------------------------------
|
* ------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SELECTOR_COMPONENT.forEach((slector) => {
|
SELECTOR_COMPONENT.forEach((selector) => {
|
||||||
EventHandler.one(document, 'click', slector, Ripple.autoInitial(new Ripple()));
|
EventHandler.one(document, 'mousedown', selector, Ripple.autoInitial(new Ripple()));
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
90
src/js/free/scrollspy.js
Normal file
90
src/js/free/scrollspy.js
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import Manipulator from '../mdb/dom/manipulator';
|
||||||
|
import BSScrollSpy from '../bootstrap/src/scrollspy';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'scrollspy';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_ACTIVATE_BS = 'activate.bs.scrollspy';
|
||||||
|
|
||||||
|
const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_DATA_SPY = '[data-spy="scroll"]';
|
||||||
|
|
||||||
|
class ScrollSpy extends BSScrollSpy {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._scrollElement = element.tagName === 'BODY' ? window : element;
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._scrollElement, EVENT_ACTIVATE_BS);
|
||||||
|
this._scrollElement = null;
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindActivateEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindActivateEvent() {
|
||||||
|
EventHandler.on(this._scrollElement, EVENT_ACTIVATE_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
|
||||||
|
relatedTarget: e.relatedTarget,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_SPY).forEach((el) => {
|
||||||
|
let instance = ScrollSpy.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new ScrollSpy(el, Manipulator.getDataAttributes(el));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = ScrollSpy.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = ScrollSpy;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return ScrollSpy.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ScrollSpy;
|
195
src/js/free/tab.js
Normal file
195
src/js/free/tab.js
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
import { getjQuery, getElementFromSelector } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSTab from '../bootstrap/src/tab';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'tab';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_SHOW_BS = 'show.bs.tab';
|
||||||
|
const EVENT_SHOWN_BS = 'shown.bs.tab';
|
||||||
|
const EVENT_HIDE_BS = 'hide.bs.tab';
|
||||||
|
const EVENT_HIDDEN_BS = 'hidden.bs.tab';
|
||||||
|
|
||||||
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const CLASS_NAME_ACTIVE = 'active';
|
||||||
|
const CLASS_NAME_DISABLED = 'disabled';
|
||||||
|
|
||||||
|
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
|
||||||
|
|
||||||
|
const SELECTOR_ACTIVE = '.active';
|
||||||
|
const SELECTOR_ACTIVE_UL = ':scope > li > .active';
|
||||||
|
|
||||||
|
const SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]';
|
||||||
|
|
||||||
|
class Tab extends BSTab {
|
||||||
|
constructor(element) {
|
||||||
|
super(element);
|
||||||
|
|
||||||
|
this._previous = null;
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_SHOW_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_SHOWN_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override
|
||||||
|
show() {
|
||||||
|
if (
|
||||||
|
(this._element.parentNode &&
|
||||||
|
this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
|
||||||
|
this._element.classList.contains(CLASS_NAME_ACTIVE)) ||
|
||||||
|
this._element.classList.contains(CLASS_NAME_DISABLED)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const target = getElementFromSelector(this._element);
|
||||||
|
const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
|
||||||
|
|
||||||
|
if (listElement) {
|
||||||
|
const itemSelector =
|
||||||
|
listElement.nodeName === 'UL' || listElement.nodeName === 'OL'
|
||||||
|
? SELECTOR_ACTIVE_UL
|
||||||
|
: SELECTOR_ACTIVE;
|
||||||
|
this._previous = SelectorEngine.find(itemSelector, listElement);
|
||||||
|
this._previous = this._previous[this._previous.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
let hideEvent = null;
|
||||||
|
let hideEventMdb = null;
|
||||||
|
|
||||||
|
if (this._previous) {
|
||||||
|
hideEvent = EventHandler.trigger(this._previous, EVENT_HIDE_BS, {
|
||||||
|
relatedTarget: this._element,
|
||||||
|
});
|
||||||
|
hideEventMdb = EventHandler.trigger(this._previous, EVENT_HIDE, {
|
||||||
|
relatedTarget: this._element,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW_BS, {
|
||||||
|
relatedTarget: this._previous,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (
|
||||||
|
showEvent.defaultPrevented ||
|
||||||
|
(hideEvent !== null && hideEvent.defaultPrevented) ||
|
||||||
|
(hideEventMdb !== null && hideEventMdb.defaultPrevented)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._activate(this._element, listElement);
|
||||||
|
|
||||||
|
const complete = () => {
|
||||||
|
EventHandler.trigger(this._previous, EVENT_HIDDEN_BS, {
|
||||||
|
relatedTarget: this._element,
|
||||||
|
});
|
||||||
|
EventHandler.trigger(this._previous, EVENT_HIDDEN, {
|
||||||
|
relatedTarget: this._element,
|
||||||
|
});
|
||||||
|
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOWN_BS, {
|
||||||
|
relatedTarget: this._previous,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
this._activate(target, target.parentNode, complete);
|
||||||
|
} else {
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
|
this._bindHideEvent();
|
||||||
|
this._bindHiddenEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShowEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOW_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOW, {
|
||||||
|
relatedTarget: e.relatedTarget,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOWN_BS, (e) => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOWN, {
|
||||||
|
relatedTarget: e.relatedTarget,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHideEvent() {
|
||||||
|
EventHandler.on(this._previous, EVENT_HIDE_BS, () => {
|
||||||
|
EventHandler.trigger(this._previous, EVENT_HIDE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHiddenEvent() {
|
||||||
|
EventHandler.on(this._previous, EVENT_HIDDEN_BS, () => {
|
||||||
|
EventHandler.trigger(this._previous, EVENT_HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => {
|
||||||
|
let instance = Tab.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Tab(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Tab.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Tab;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Tab.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Tab;
|
114
src/js/free/toast.js
Normal file
114
src/js/free/toast.js
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../mdb/dom/event-handler';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
import BSToast from '../bootstrap/src/toast';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'toast';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_SHOW_BS = 'show.bs.toast';
|
||||||
|
const EVENT_SHOWN_BS = 'shown.bs.toast';
|
||||||
|
const EVENT_HIDE_BS = 'hide.bs.toast';
|
||||||
|
const EVENT_HIDDEN_BS = 'hidden.bs.toast';
|
||||||
|
|
||||||
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_TOAST = '.toast';
|
||||||
|
|
||||||
|
class Toast extends BSToast {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_SHOW_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_SHOWN_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDE_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDDEN_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
|
this._bindHideEvent();
|
||||||
|
this._bindHiddenEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShowEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOW_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOW);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_SHOWN_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_SHOWN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHideEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_HIDE_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_HIDE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHiddenEvent() {
|
||||||
|
EventHandler.on(this._element, EVENT_HIDDEN_BS, () => {
|
||||||
|
EventHandler.trigger(this._element, EVENT_HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_TOAST).forEach((el) => {
|
||||||
|
let instance = Toast.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Toast(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Toast.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Toast;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Toast.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Toast;
|
124
src/js/free/tooltip.js
Normal file
124
src/js/free/tooltip.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
import { getjQuery } from '../mdb/util/index';
|
||||||
|
import EventHandler from '../bootstrap/src/dom/event-handler';
|
||||||
|
import BSTooltip from '../bootstrap/src/tooltip';
|
||||||
|
import SelectorEngine from '../mdb/dom/selector-engine';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Constants
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
const NAME = 'tooltip';
|
||||||
|
const DATA_KEY = `mdb.${NAME}`;
|
||||||
|
const EVENT_KEY = `.${DATA_KEY}`;
|
||||||
|
|
||||||
|
const EVENT_HIDE_BS = 'hide.bs.tooltip';
|
||||||
|
const EVENT_HIDDEN_BS = 'hidden.bs.tooltip';
|
||||||
|
const EVENT_SHOW_BS = 'show.bs.tooltip';
|
||||||
|
const EVENT_SHOWN_BS = 'shown.bs.tooltip';
|
||||||
|
const EVENT_INSERTED_BS = 'inserted.bs.tooltip';
|
||||||
|
|
||||||
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
||||||
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
||||||
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
||||||
|
const EVENT_INSERTED = `inserted${EVENT_KEY}`;
|
||||||
|
|
||||||
|
const SELECTOR_DATA_TOGGLE = '[data-toggle="tooltip"]';
|
||||||
|
|
||||||
|
class Tooltip extends BSTooltip {
|
||||||
|
constructor(element, data) {
|
||||||
|
super(element, data);
|
||||||
|
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
EventHandler.off(this._element, EVENT_SHOW_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_SHOWN_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDE_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_HIDDEN_BS);
|
||||||
|
EventHandler.off(this._element, EVENT_INSERTED_BS);
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
static get NAME() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private
|
||||||
|
_init() {
|
||||||
|
this._bindShowEvent();
|
||||||
|
this._bindShownEvent();
|
||||||
|
this._bindHideEvent();
|
||||||
|
this._bindHiddenEvent();
|
||||||
|
this._bindHidePreventedEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShowEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_SHOW_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_SHOW);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindShownEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_SHOWN_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_SHOWN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHideEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_HIDE_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_HIDE);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHiddenEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_HIDDEN_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_HIDDEN);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindHidePreventedEvent() {
|
||||||
|
EventHandler.on(this.element, EVENT_INSERTED_BS, () => {
|
||||||
|
EventHandler.trigger(this.element, EVENT_INSERTED);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* Data Api implementation - auto initialization
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => {
|
||||||
|
let instance = Tooltip.getInstance(el);
|
||||||
|
if (!instance) {
|
||||||
|
instance = new Tooltip(el);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* jQuery
|
||||||
|
* ------------------------------------------------------------------------
|
||||||
|
* add .rating to jQuery only if jQuery is present
|
||||||
|
*/
|
||||||
|
|
||||||
|
const $ = getjQuery();
|
||||||
|
|
||||||
|
if ($) {
|
||||||
|
const JQUERY_NO_CONFLICT = $.fn[NAME];
|
||||||
|
$.fn[NAME] = Tooltip.jQueryInterface;
|
||||||
|
$.fn[NAME].Constructor = Tooltip;
|
||||||
|
$.fn[NAME].noConflict = () => {
|
||||||
|
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
||||||
|
return Tooltip.jQueryInterface;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Tooltip;
|
|
@ -1,24 +1,20 @@
|
||||||
// BOOTSTRAP CORE COMPONENTS
|
// BOOTSTRAP CORE COMPONENTS
|
||||||
import Alert from './bootstrap/src/alert';
|
|
||||||
import Button from './bootstrap/src/button';
|
|
||||||
import Carousel from './bootstrap/src/carousel';
|
|
||||||
import Collapse from './bootstrap/src/collapse';
|
import Collapse from './bootstrap/src/collapse';
|
||||||
import Modal from './bootstrap/src/modal';
|
import Alert from './free/alert';
|
||||||
import Popover from './bootstrap/src/popover';
|
import Button from './bootstrap/src/button';
|
||||||
import ScrollSpy from './bootstrap/src/scrollspy';
|
import Carousel from './free/carousel';
|
||||||
import Tab from './bootstrap/src/tab';
|
import Modal from './free/modal';
|
||||||
import Tooltip from './bootstrap/src/tooltip';
|
import Popover from './free/popover';
|
||||||
import Toast from './bootstrap/src/toast';
|
import ScrollSpy from './free/scrollspy';
|
||||||
|
import Tab from './free/tab';
|
||||||
|
import Tooltip from './free/tooltip';
|
||||||
|
import Toast from './free/toast';
|
||||||
|
|
||||||
// MDB FREE COMPONENTS
|
// MDB FREE COMPONENTS
|
||||||
import Input from './free/input';
|
import Input from './free/input';
|
||||||
import Dropdown from './free/dropdown';
|
import Dropdown from './free/dropdown';
|
||||||
import Ripple from './free/ripple';
|
import Ripple from './free/ripple';
|
||||||
|
import Range from './free/range';
|
||||||
// AUTO INIT
|
|
||||||
[...document.querySelectorAll('[data-toggle="tooltip"]')].map((tooltip) => new Tooltip(tooltip));
|
|
||||||
[...document.querySelectorAll('[data-toggle="popover"]')].map((popover) => new Popover(popover));
|
|
||||||
[...document.querySelectorAll('.toast')].map((toast) => new Toast(toast));
|
|
||||||
|
|
||||||
export {
|
export {
|
||||||
Alert,
|
Alert,
|
||||||
|
@ -34,4 +30,5 @@ export {
|
||||||
Tab,
|
Tab,
|
||||||
Toast,
|
Toast,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
|
Range,
|
||||||
};
|
};
|
||||||
|
|
104
src/js/mdb/util/stack.js
Normal file
104
src/js/mdb/util/stack.js
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
import SelectorEngine from '../dom/selector-engine';
|
||||||
|
import { isVisible, typeCheckConfig } from './index';
|
||||||
|
|
||||||
|
const NAME = 'Stack';
|
||||||
|
|
||||||
|
const DEFAULT_OPTIONS = {
|
||||||
|
position: 'top',
|
||||||
|
container: null,
|
||||||
|
refresh: 1000,
|
||||||
|
filter: (el) => {
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const TYPE_OPTIONS = {
|
||||||
|
position: 'string',
|
||||||
|
container: '(undefined|null|string)',
|
||||||
|
refresh: 'number',
|
||||||
|
filter: 'function',
|
||||||
|
};
|
||||||
|
|
||||||
|
class Stack {
|
||||||
|
constructor(element, selector, options) {
|
||||||
|
this._element = element;
|
||||||
|
this._selector = selector;
|
||||||
|
this._options = this._getConfig(options);
|
||||||
|
|
||||||
|
this._offset = null;
|
||||||
|
|
||||||
|
if (this._options.container) {
|
||||||
|
this._parent = SelectorEngine.findOne(this._options.container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get stackableElements() {
|
||||||
|
return SelectorEngine.find(this._selector)
|
||||||
|
.filter((el, i) => this._options.filter(el, i))
|
||||||
|
.map((el) => ({ el, rect: el.getBoundingClientRect() }))
|
||||||
|
.filter(({ el, rect }) => {
|
||||||
|
const basicCondition = el !== this._element && isVisible(el);
|
||||||
|
if (this._offset === null) {
|
||||||
|
return basicCondition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return basicCondition && this._getBoundryOffset(rect) < this._offset;
|
||||||
|
})
|
||||||
|
.sort((a, b) => {
|
||||||
|
return this._getBoundryOffset(b.rect) - this._getBoundryOffset(a.rect);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get nextElements() {
|
||||||
|
return SelectorEngine.find(this._selector)
|
||||||
|
.filter((el) => el !== this._element)
|
||||||
|
.filter((el, i) => this._options.filter(el, i))
|
||||||
|
.filter((el) => {
|
||||||
|
return this._getBoundryOffset(el.getBoundingClientRect()) > this._offset;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_getConfig(options) {
|
||||||
|
const config = {
|
||||||
|
...DEFAULT_OPTIONS,
|
||||||
|
...options,
|
||||||
|
};
|
||||||
|
|
||||||
|
typeCheckConfig(NAME, config, TYPE_OPTIONS);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
_getBoundryOffset(rect) {
|
||||||
|
const { position } = this._options;
|
||||||
|
|
||||||
|
let parentTopOffset = 0;
|
||||||
|
let parentBottomBoundry = window.innerHeight;
|
||||||
|
|
||||||
|
if (this._parent) {
|
||||||
|
const parentRect = this._parent.getBoundingClientRect();
|
||||||
|
|
||||||
|
parentTopOffset = parentRect.top;
|
||||||
|
parentBottomBoundry = parentRect.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (position === 'top') {
|
||||||
|
return rect.top - parentTopOffset;
|
||||||
|
}
|
||||||
|
return parentBottomBoundry - rect.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateOffset() {
|
||||||
|
const [previousElement] = this.stackableElements;
|
||||||
|
|
||||||
|
if (!previousElement) {
|
||||||
|
this._offset = 0;
|
||||||
|
} else {
|
||||||
|
this._offset = this._getBoundryOffset(previousElement.rect) + previousElement.rect.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Stack;
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
45
src/scss/free/_range.scss
Normal file
45
src/scss/free/_range.scss
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// range
|
||||||
|
.range {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.thumb {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
height: 30px;
|
||||||
|
width: 30px;
|
||||||
|
top: -35px;
|
||||||
|
margin-left: -15px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 50% 50% 50% 0;
|
||||||
|
transform: scale(0);
|
||||||
|
transform-origin: bottom;
|
||||||
|
transition: transform 0.2s ease-in-out;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
content: '';
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
border-radius: 50% 50% 50% 0;
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
background: #1266f1;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumb-value {
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 30px;
|
||||||
|
color: rgb(255, 255, 255);
|
||||||
|
font-weight: 500;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.thumb-active {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -3,6 +3,7 @@
|
||||||
@import './free/functions';
|
@import './free/functions';
|
||||||
|
|
||||||
// CORE VARIABLES
|
// CORE VARIABLES
|
||||||
|
@import './custom/variables';
|
||||||
@import './free/variables';
|
@import './free/variables';
|
||||||
@import './bootstrap/variables';
|
@import './bootstrap/variables';
|
||||||
|
|
||||||
|
@ -92,3 +93,4 @@
|
||||||
@import './free/popover';
|
@import './free/popover';
|
||||||
@import './free/scrollspy';
|
@import './free/scrollspy';
|
||||||
@import './free/ripple';
|
@import './free/ripple';
|
||||||
|
@import './free/range';
|
||||||
|
|
Loading…
Reference in New Issue
Block a user