webpack-bootstrap-ui-kit/src/js_old/_components/_ui.hover.js

199 lines
4.4 KiB
JavaScript
Raw Normal View History

2019-10-20 01:40:40 +02:00
/*
* Conflicts with 'bootstrap/js/dist/dropdown'
*/
2022-05-03 20:50:57 +02:00
'use strict'
2022-05-03 20:50:57 +02:00
import $ from 'jquery'
import Events from '../_events'
import 'jquery-hoverintent/jquery.hoverIntent.js'
import MainUI from '../_main'
2020-02-17 19:47:05 +01:00
const HoverUI = (($) => {
// Constants
2022-05-03 20:50:57 +02:00
const W = window
const D = document
const $Html = $('html')
const $Body = $('body')
2022-05-03 20:50:57 +02:00
const NAME = 'jsHoverUI'
const DATA_KEY = NAME
class HoverUI {
// Constructor
2022-05-03 20:50:57 +02:00
constructor (el) {
console.log(`${NAME}: init`)
2020-07-22 10:21:50 +02:00
2022-05-03 20:50:57 +02:00
const ui = this
const $el = $(el)
2021-01-04 07:45:07 +01:00
if (
$el.is(
2021-08-18 20:51:15 +02:00
'[target="_blank"],.external,[data-toggle="lightbox"],[data-lightbox-gallery]'
2021-01-04 07:45:07 +01:00
)
) {
2022-05-03 20:50:57 +02:00
return true
2021-01-04 07:45:07 +01:00
}
2022-05-03 20:50:57 +02:00
ui.$el = $el
// find parent
2022-05-03 20:50:57 +02:00
let $parent = $el.parents('.nav-item, .dropdown')
$parent = $parent && $parent.length ? $parent.first() : null
// $parent = $parent ? $parent : $el.parent();
ui.$parent = $parent
// find target
2022-05-03 20:50:57 +02:00
let $target = $el.data('target')
$target = $target && $target.length ? $target : null
$target = $target || ($parent
? $parent.find('.dropdown-menu').first()
: null)
if (!$target || !$target.length) {
2022-05-03 20:50:57 +02:00
console.warn(`${NAME}: Missing target for:`)
console.warn($el)
return
}
2022-05-03 20:50:57 +02:00
ui.$target = $target
2022-05-03 20:50:57 +02:00
const $triger = $parent || $el
ui.$triger = $triger
// integrate with dropdown-toggle
2022-05-03 20:50:57 +02:00
$('[data-toggle="dropdown"]').on('click touch', (e) => {
console.log(`${NAME}: dropdown click-touch`)
ui.hide()
})
if (!W.isTouch) {
$triger.hoverIntent({
sensitivity: 10,
interval: 50,
over: () => {
2022-05-03 20:50:57 +02:00
ui.show()
},
out: () => {
2022-05-03 20:50:57 +02:00
ui.hide()
},
2022-05-03 20:50:57 +02:00
})
}
2022-05-03 20:50:57 +02:00
$el.off('click touch')
$el.on('click touch', (e) => {
const size = MainUI.detectBootstrapScreenSize()
console.log(`${NAME}: click-touch size: ${size}`)
2020-07-22 10:21:50 +02:00
2020-02-17 19:06:39 +01:00
if (
2022-05-03 20:50:57 +02:00
size === 'xs' ||
!$el.data('allow-click') ||
(W.IsTouchScreen && !$el.data('allow-touch-click'))
2020-02-17 19:06:39 +01:00
) {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: click-touch prevent click`)
e.stopPropagation()
e.preventDefault()
2019-10-20 01:40:40 +02:00
}
if (ui.isShown()) {
2022-05-03 20:50:57 +02:00
ui.hide()
} else {
2022-05-03 20:50:57 +02:00
ui.show()
}
2022-05-03 20:50:57 +02:00
})
2022-05-03 20:50:57 +02:00
$el.data(NAME, ui)
$triger.addClass(`${NAME}-active`)
}
2022-05-03 20:50:57 +02:00
isShown () {
return this.$target.hasClass('show')
}
2022-05-03 20:50:57 +02:00
show () {
const ui = this
2019-12-31 12:55:51 +01:00
ui.$el
2022-05-03 20:50:57 +02:00
.parents('.dropdown')
.not('.active')
2019-12-31 12:55:51 +01:00
.each((i, el) => {
2022-05-03 20:50:57 +02:00
const $el = $(el)
$el.find('.dropdown').removeClass('show')
$el.addClass('show')
})
2022-05-03 20:50:57 +02:00
ui.$target.addClass('show')
}
2022-05-03 20:50:57 +02:00
hide () {
const ui = this
const $el = ui.$target
$el.removeClass('show')
$el.find('.dropdown-menu').removeClass('show')
$el.parent('.dropdown').removeClass('show')
}
2022-05-03 20:50:57 +02:00
dispose () {
const ui = this
const $el = ui.$el
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: dispose`)
2020-09-09 17:40:58 +02:00
2022-05-03 20:50:57 +02:00
ui.$triger.removeClass(`${NAME}-active`)
$.removeData($el, DATA_KEY)
2022-05-03 20:50:57 +02:00
ui.$el = null
ui.$parent = null
ui.$target = null
ui.$triger = null
}
2022-05-03 20:50:57 +02:00
static _jQueryInterface () {
2020-06-11 13:53:30 +02:00
return this.each(function () {
// attach functionality to el
2022-05-03 20:50:57 +02:00
const $el = $(this)
let data = $el.data(DATA_KEY)
if (!data) {
2022-05-03 20:50:57 +02:00
data = new HoverUI(this)
$el.data(DATA_KEY, data)
}
2022-05-03 20:50:57 +02:00
})
}
}
// jQuery interface
2022-05-03 20:50:57 +02:00
$.fn[NAME] = HoverUI._jQueryInterface
$.fn[NAME].Constructor = HoverUI
2020-06-11 13:53:30 +02:00
$.fn[NAME].noConflict = function () {
2022-05-03 20:50:57 +02:00
$.fn[NAME] = JQUERY_NO_CONFLICT
return HoverUI._jQueryInterface
}
// auto-apply
$('[data-toggle="hover"]').ready(() => {
2022-05-03 20:50:57 +02:00
$('[data-toggle="hover"]').jsHoverUI()
})
2019-10-20 01:40:40 +02:00
// rewrite 'bootstrap/js/dist/dropdown'
2022-05-03 20:50:57 +02:00
$('[data-toggle="dropdown"]').on('click touch', (e) => {
e.preventDefault()
2019-10-20 01:40:40 +02:00
2022-05-03 20:50:57 +02:00
const $el = $(e.currentTarget)
const $parent = $el.parent('.dropdown')
2019-10-20 01:40:40 +02:00
2020-01-31 10:18:11 +01:00
// hide siblings
2022-05-03 20:50:57 +02:00
$parent.parent().find('.dropdown, .dropdown-menu').removeClass('show')
2020-01-31 10:18:11 +01:00
2022-05-03 20:50:57 +02:00
if ($parent.hasClass('show')) {
$parent.removeClass('show')
$parent.find('.dropdown-menu').removeClass('show')
2019-10-20 01:40:40 +02:00
} else {
2022-05-03 20:50:57 +02:00
$parent.addClass('show')
$parent.find('.dropdown-menu').addClass('show')
2019-10-20 01:40:40 +02:00
}
2022-05-03 20:50:57 +02:00
})
2019-10-20 01:40:40 +02:00
2022-05-03 20:50:57 +02:00
return HoverUI
})($)
2022-05-03 20:50:57 +02:00
export default HoverUI