webpack-bootstrap-ui-kit/src/js_old/_main.js

651 lines
16 KiB
JavaScript
Raw Normal View History

2022-05-03 20:50:57 +02:00
'use strict'
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
import $ from 'jquery'
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
import Events from './_events'
import Consts from './_consts'
2019-10-20 01:40:40 +02:00
2022-05-03 20:50:57 +02:00
import EventsRouter from './_events.router'
import Spinner from './_components/_ui.spinner'
2019-06-08 17:20:51 +02:00
2019-09-07 03:49:08 +02:00
// AJAX functionality
2022-05-03 20:50:57 +02:00
import AjaxUI from './_components/_ui.ajax'
2019-07-10 20:59:57 +02:00
2022-05-03 20:50:57 +02:00
import FormBasics from './_components/_ui.form.basics'
import HeaderUI from './_components/_ui.header-footer'
2022-05-03 20:50:57 +02:00
import SmoothScroll from 'smooth-scroll'
const smoothScroll = SmoothScroll()
2019-06-08 17:20:51 +02:00
2020-02-17 19:47:05 +01:00
const MainUI = (($) => {
2020-09-10 21:48:14 +02:00
// Constants
2022-05-03 20:50:57 +02:00
const W = window
const $W = $(W)
const D = document
const $Body = $('body')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
const NAME = 'MainUI'
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.clear()
2020-09-10 21:48:14 +02:00
console.info(
`%cUI Kit ${UINAME} ${UIVERSION}`,
2022-05-03 20:50:57 +02:00
'color:yellow;font-size:14px'
)
2020-09-10 21:48:14 +02:00
console.info(
`%c${UIMetaNAME} ${UIMetaVersion}`,
2022-05-03 20:50:57 +02:00
'color:yellow;font-size:12px'
)
2020-09-10 21:48:14 +02:00
console.info(
`%chttps://github.com/a2nt/webpack-bootstrap-ui-kit by ${UIAUTHOR}`,
2022-05-03 20:50:57 +02:00
'color:yellow;font-size:10px'
)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.groupCollapsed('Events')
2020-09-10 21:48:14 +02:00
Object.keys(Events).forEach((k) => {
2022-05-03 20:50:57 +02:00
console.info(`${k}: ${Events[k]}`)
})
console.groupEnd('Events')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.groupCollapsed('Consts')
2020-09-10 21:48:14 +02:00
Object.keys(Consts).forEach((k) => {
2022-05-03 20:50:57 +02:00
console.info(`${k}: ${Consts[k]}`)
})
console.groupEnd('Events')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.groupCollapsed('Init')
console.time('init')
2020-09-10 21:48:14 +02:00
$W.on(`${Events.LODEDANDREADY}`, () => {
2022-05-03 20:50:57 +02:00
console.groupEnd('Init')
console.timeEnd('init')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.time('Post-init')
console.groupCollapsed('Post-init')
})
2020-09-10 21:48:14 +02:00
// get browser locale
2022-05-03 20:50:57 +02:00
// const Locale = $('html').attr('lang').substring(0, 2);
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
const $AlertNotify = $('#AlertNotify')
const $SiteWideMessage = $('#SiteWideMessage')
2020-09-10 21:48:14 +02:00
// get browser window visibility preferences
// Opera 12.10, Firefox >=18, Chrome >=31, IE11
2022-05-03 20:50:57 +02:00
const HiddenName = 'hidden'
const VisibilityChangeEvent = 'visibilitychange'
2020-09-10 21:48:14 +02:00
// update visibility state
D.addEventListener(VisibilityChangeEvent, () => {
if (D.visibilityState === HiddenName) {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Tab: hidden`)
$Body.addClass('is-hidden')
$Body.trigger(Events.TABHIDDEN)
$W.trigger(Events.TABHIDDEN)
2020-09-10 21:48:14 +02:00
} else {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Tab: focused`)
$Body.removeClass('is-hidden')
$Body.trigger(Events.TABFOCUSED)
$W.trigger(Events.TABFOCUSED)
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
})
2020-09-10 21:48:14 +02:00
// session ping
2022-05-03 20:50:57 +02:00
let pingInterval
let pingLock = false
2020-09-10 21:48:14 +02:00
const sessionPing = () => {
2022-05-03 20:50:57 +02:00
if (pingLock || $Body.hasClass('is-offline')) {
return
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: session ping`)
pingLock = true
2020-09-10 21:48:14 +02:00
$.ajax({
sync: false,
async: true,
cache: false,
2022-05-03 20:50:57 +02:00
url: '/Security/ping',
2020-09-10 21:48:14 +02:00
global: false,
2022-05-03 20:50:57 +02:00
type: 'POST',
2020-09-10 21:48:14 +02:00
complete: (data, datastatus) => {
2022-05-03 20:50:57 +02:00
updateOnlineStatus()
if (datastatus !== 'success') {
console.warn(`${NAME}: ping failed`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
clearInterval(pingInterval)
pingInterval = null
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
pingLock = false
2020-09-10 21:48:14 +02:00
},
2022-05-03 20:50:57 +02:00
})
}
2020-09-10 21:48:14 +02:00
// update online/offline state
2022-05-03 20:50:57 +02:00
let statusLock = false
2020-09-10 21:48:14 +02:00
const updateOnlineStatus = () => {
2020-09-10 22:11:51 +02:00
if (statusLock) {
2022-05-03 20:50:57 +02:00
return
2020-09-10 22:11:51 +02:00
}
2022-05-03 20:50:57 +02:00
statusLock = true
2020-09-10 22:11:51 +02:00
2022-05-03 20:50:57 +02:00
if (typeof navigator.onLine === 'undefined') {
return false
2020-09-10 21:48:14 +02:00
}
if (!navigator.onLine) {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Offline`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
clearInterval(pingInterval)
pingInterval = null
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$Body.addClass('is-offline')
$Body.removeClass('is-online')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$Body.trigger(Events.OFFLINE)
$W.trigger(Events.OFFLINE)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
statusLock = false
return true
2020-09-10 21:48:14 +02:00
}
if (!pingInterval) {
2022-05-03 20:50:57 +02:00
pingInterval = setInterval(sessionPing, 300000) // 5 min in ms
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
if ($Body.hasClass('is-offline')) {
sessionPing()
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: is back online`)
$Body.trigger(Events.BACKONLINE)
2020-09-10 22:53:35 +02:00
} else {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Online`)
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
$Body.addClass('is-online')
$Body.removeClass('is-offline')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$Body.trigger(Events.ONLINE)
$W.trigger(Events.ONLINE)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
statusLock = false
return true
}
2020-09-10 21:48:14 +02:00
W.addEventListener(
`${Events.OFFLINE}`,
() => {
2022-05-03 20:50:57 +02:00
updateOnlineStatus()
2020-09-10 21:48:14 +02:00
},
2021-08-18 20:51:15 +02:00
false
2022-05-03 20:50:57 +02:00
)
2020-09-10 21:48:14 +02:00
W.addEventListener(
`${Events.ONLINE}`,
() => {
2022-05-03 20:50:57 +02:00
updateOnlineStatus()
2020-09-10 21:48:14 +02:00
},
2021-08-18 20:51:15 +02:00
false
2022-05-03 20:50:57 +02:00
)
2020-09-10 21:48:14 +02:00
$W.on(`${Events.LOADED} ${Events.AJAX}`, () => {
2022-05-03 20:50:57 +02:00
updateOnlineStatus()
})
2020-09-10 21:48:14 +02:00
// scrollTo
const ScrollTo = (trigger, selector) => {
smoothScroll.animateScroll(D.querySelector(selector), trigger, {
speed: 500,
offset: -20,
2022-05-03 20:50:57 +02:00
// easing: 'easeInOutCubic',
2020-09-10 21:48:14 +02:00
// Callback API
2022-05-03 20:50:57 +02:00
// before: (anchor, toggle) => {}, // Callback to run before scroll
// `after: (anchor, toggle) => {} // Callback to run after scroll
})
}
2020-09-10 21:48:14 +02:00
W.URLDetails = {
2022-05-03 20:50:57 +02:00
base: $('base').attr('href'),
relative: '/',
hash: '',
}
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
let eventFired = false
2020-09-10 21:48:14 +02:00
const setTouchScreen = (bool) => {
if (W.IsTouchScreen === bool || eventFired) {
2022-05-03 20:50:57 +02:00
return
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
eventFired = true
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
W.IsTouchScreen = bool
$.support.touch = W.IsTouchScreen
2020-09-10 21:48:14 +02:00
if (bool) {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Touch screen enabled`)
$Body.trigger(Events.TOUCHENABLE)
$W.trigger(Events.TOUCHENABLE)
2020-09-10 21:48:14 +02:00
} else {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: Touch screen disabled`)
$Body.trigger(Events.TOUCHDISABLED)
$W.trigger(Events.TOUCHDISABLED)
2020-09-10 21:48:14 +02:00
}
// prevent firing touch and mouse events together
setTimeout(() => {
2022-05-03 20:50:57 +02:00
eventFired = false
}, 200)
}
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
setTouchScreen('ontouchstart' in window || navigator.msMaxTouchPoints > 0)
2020-09-10 21:48:14 +02:00
// disable touch on mouse events
2022-05-03 20:50:57 +02:00
/* D.addEventListener('mousemove', () => {
2020-02-17 19:45:54 +01:00
setTouchScreen(false);
});
D.addEventListener('mousedown', () => {
setTouchScreen(false);
2022-05-03 20:50:57 +02:00
}); */
2020-02-17 19:45:54 +01:00
2020-09-10 21:48:14 +02:00
// enable touch screen on touch events
2022-05-03 20:50:57 +02:00
D.addEventListener('touchmove', () => {
setTouchScreen(true)
})
D.addEventListener('touchstart', () => {
setTouchScreen(true)
})
2020-02-17 19:06:39 +01:00
2020-09-10 21:48:14 +02:00
class MainUI {
// Static methods
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
static init () {
const ui = this
ui.dispose()
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: init`)
2019-06-08 17:20:51 +02:00
2020-09-10 21:48:14 +02:00
// update location details
2022-05-03 20:50:57 +02:00
ui.updateLocation()
2019-06-08 17:20:51 +02:00
2020-09-10 21:48:14 +02:00
// mark available offline areas
2022-05-03 20:50:57 +02:00
if ('caches' in W) {
$('a.offline').addClass('offline-available')
2020-09-10 21:48:14 +02:00
}
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
ui.loadImages()
2019-10-20 01:40:40 +02:00
2020-09-10 21:48:14 +02:00
// detect bootstrap screen size
2022-05-03 20:50:57 +02:00
ui.detectBootstrapScreenSize()
2019-06-08 17:20:51 +02:00
2020-09-10 21:48:14 +02:00
// mark external links
2022-05-03 20:50:57 +02:00
$('a.external,a[rel="external"]').attr('target', '_blank')
2019-06-08 17:20:51 +02:00
2020-09-10 21:48:14 +02:00
// show encoded emails
2022-05-03 20:50:57 +02:00
/* $(D).find('.obm').each(() => {
2019-10-20 01:40:40 +02:00
if ($(this).attr('data-val') !== undefined) {
const email = $(this).attr('data-val').split('')
.reverse()
.join('')
.slice(0, -8)
.replace(/[a-zA-Z]/g, (c) => String.fromCharCode((c <= 'Z' ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26))
.replace('#AT#', '@');
const attr = $(this).attr('data-val-append');
if (attr !== undefined && attr !== false) {
$(this).append(email);
}
if ($(this).find('.sr-only').length > 0) {
$(this).find('.sr-only').append(email);
}
if ($(this).attr('href') !== undefined) {
$(this).attr('href', `mailto:${email}`);
}
}
2022-05-03 20:50:57 +02:00
}); */
2020-09-10 21:48:14 +02:00
//
// scroll links
2022-05-03 20:50:57 +02:00
$('.js-scrollTo').on('click', (e) => {
console.log(`${NAME}: .js-scrollTo`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
e.preventDefault()
const el = e.currentTarget
const $el = $(e.currentTarget)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
ScrollTo(el, $el.attr('data-target'))
})
2020-09-10 21:48:14 +02:00
// load external fonts
2022-05-03 20:50:57 +02:00
if ($('[data-extfont]').length) {
console.log(`${NAME}: loading external fonts [data-extfont]`)
2020-09-10 21:48:14 +02:00
$.getScript(
2022-05-03 20:50:57 +02:00
'//ajax.googleapis.com/ajax/libs/webfont/1/webfont.js',
2020-09-10 21:48:14 +02:00
() => {
2022-05-03 20:50:57 +02:00
const fonts = []
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$('[data-extfont]').each((i, el) => {
fonts[i] = $(el).attr('data-extfont')
})
2020-09-10 21:48:14 +02:00
W.WebFont.load({
google: {
families: fonts,
},
2022-05-03 20:50:57 +02:00
})
2021-08-18 20:51:15 +02:00
}
2022-05-03 20:50:57 +02:00
)
2020-09-10 21:48:14 +02:00
}
// data-set links
2022-05-03 20:50:57 +02:00
$('[data-set-target]').on('click', (e) => {
console.log(`${NAME}: [data-set-target]`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
const $el = $(e.currentTarget)
const $target = $($el.data('set-target'))
2020-09-10 21:48:14 +02:00
if (!$target.length) {
2022-05-03 20:50:57 +02:00
return
2020-09-10 21:48:14 +02:00
}
$target.each((i, targetEl) => {
2022-05-03 20:50:57 +02:00
const $targetEl = $(targetEl)
const tag = $targetEl.prop('tagName').toLowerCase()
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
if (tag === 'input' || tag === 'select') {
$targetEl.val($el.data('set-val'))
} else if (!$targetEl.hasClass('field')) {
$targetEl.text($el.data('set-val'))
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
})
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$el.trigger(Events.SET_TARGET_UPDATE)
$target.closest('form').trigger(Events.SET_TARGET_UPDATE)
})
2020-09-10 21:48:14 +02:00
// emulate links
2022-05-03 20:50:57 +02:00
$('.a[data-href]').on('click', (e) => {
console.log(`${NAME}: js link processing .a[data-href]`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
const $el = $(e.currentTarget)
const href = $el.data('href')
2020-09-10 21:48:14 +02:00
if (!href.length) {
2022-05-03 20:50:57 +02:00
console.warn(`${NAME}: .a[data-href] | Missing data-href`)
console.warn($el)
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
W.location.assign(href)
})
2020-09-10 21:48:14 +02:00
2021-01-25 17:04:47 +01:00
// set attributes for mobile friendly tables
2022-05-03 20:50:57 +02:00
$('.typography table').each((i, el) => {
const $table = $(el)
let $header = $table.find('thead tr:first-child')
2021-01-25 17:04:47 +01:00
if (!$header.length) {
2022-05-03 20:50:57 +02:00
$header = $(el).find('tr:first-child')
2021-01-25 17:04:47 +01:00
}
2022-05-03 20:50:57 +02:00
$header.addClass('d-typography-breakpoint-none')
2021-01-25 17:08:43 +01:00
2022-05-03 20:50:57 +02:00
$header.find('td').each((i, h) => {
const $h = $(h)
2021-01-25 17:04:47 +01:00
$table
2022-05-03 20:50:57 +02:00
.find('tr')
2021-01-25 17:04:47 +01:00
.find(`td:eq(${i})`)
.each((i, el) => {
2022-05-03 20:50:57 +02:00
const $el = $(el)
if (!$el.attr('data-label')) {
$el.attr('data-label', $h.text())
2021-01-25 17:04:47 +01:00
}
2022-05-03 20:50:57 +02:00
})
})
})
2021-01-25 17:04:47 +01:00
//
2020-09-10 21:48:14 +02:00
// hide spinner
Spinner.hide(() => {
2022-05-03 20:50:57 +02:00
$Body.addClass('loaded')
})
2020-09-10 21:48:14 +02:00
// fire page printing
2022-05-03 20:50:57 +02:00
if (W.URLDetails.hash.indexOf('printpage') > -1) {
W.print()
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
$Body.data(NAME, ui)
$W.removeClass('lock-main-init')
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
static detectBootstrapScreenSize () {
const $el = $('<div class="env-test"></div>')
let envs = [...Consts.ENVS]
$Body.append($el)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
let curEnv = envs.shift()
envs = envs.reverse()
2020-09-10 21:48:14 +02:00
for (let i = 0; i < envs.length; ++i) {
2022-05-03 20:50:57 +02:00
const env = envs[i]
$el.addClass(`d-${env}-none`)
if ($el.is(':hidden')) {
curEnv = env
break
2020-09-10 21:48:14 +02:00
}
}
2022-05-03 20:50:57 +02:00
$el.remove()
$Body.removeClass(envs)
$Body.addClass(curEnv)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
let landscape = true
2020-09-10 21:48:14 +02:00
if ($W.width() > $W.height()) {
2022-05-03 20:50:57 +02:00
$Body.removeClass('portrait')
$Body.addClass('landscape')
2020-09-10 21:48:14 +02:00
} else {
2022-05-03 20:50:57 +02:00
landscape = false
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$Body.removeClass('landscape')
$Body.addClass('portrait')
2020-09-10 21:48:14 +02:00
}
console.log(
2021-08-18 20:51:15 +02:00
`${NAME}: screen size detected ${curEnv} | landscape ${landscape}`
2022-05-03 20:50:57 +02:00
)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
return curEnv
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
static updateLocation (url) {
let location = url || W.location.href
location = location.replace(W.URLDetails.base, '/')
const hash = location.indexOf('#')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
W.URLDetails.relative = location.split('#')[0]
2020-09-10 21:48:14 +02:00
W.URLDetails.hash =
2022-05-03 20:50:57 +02:00
hash >= 0 ? location.substr(location.indexOf('#')) : ''
2020-09-10 21:48:14 +02:00
}
// show site-wide alert
2022-05-03 20:50:57 +02:00
static alert (msg, cls) {
$SiteWideMessage.fadeOut('fast')
2020-09-10 21:48:14 +02:00
$SiteWideMessage.html(
2021-08-18 20:51:15 +02:00
`<div class="page-alert"><div class="alert alert-${cls}"><i class="close" data-dismiss="alert">&times;</i>${msg}</div></div>`
2022-05-03 20:50:57 +02:00
)
$SiteWideMessage.find('.page-alert').alert()
2020-09-10 21:48:14 +02:00
$SiteWideMessage.find('.close[data-dismiss="alert"]').click(() => {
2022-05-03 20:50:57 +02:00
$SiteWideMessage.fadeOut('slow', () => {
$SiteWideMessage.find('.page-alert').alert('close')
})
})
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$SiteWideMessage.fadeIn('slow')
2020-09-10 21:48:14 +02:00
if ($AlertNotify.length) {
2022-05-03 20:50:57 +02:00
$AlertNotify[0].play()
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
$W.trigger(`${Events.ALLERTAPPEARED}`)
2020-09-10 21:48:14 +02:00
}
// hide site-wide alert
2022-05-03 20:50:57 +02:00
static alertHide () {
2020-09-10 21:48:14 +02:00
if ($SiteWideMessage.length !== 0) {
2022-05-03 20:50:57 +02:00
$SiteWideMessage.fadeOut('slow', () => {
$SiteWideMessage.find('.alert').alert('close')
})
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
if ($AlertNotify.length && typeof $AlertNotify[0].stop !== 'undefined') {
$AlertNotify[0].stop()
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
$W.trigger(`${Events.ALLERTREMOVED}`)
2020-09-10 21:48:14 +02:00
}
// load all images
2022-05-03 20:50:57 +02:00
static loadImages () {
const $imgs = $Body.find('img').not('.loaded')
const $imgUrls = []
const $imgLazyUrls = []
2020-09-10 21:48:14 +02:00
// collect image details
$imgs.each((i, el) => {
2022-05-03 20:50:57 +02:00
const $el = $(el)
const src = $el.attr('src')
const lazySrc = $el.data('lazy-src')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
if ($el.hasClass('loaded')) {
return
2020-09-10 21:48:14 +02:00
}
if (src && src.length) {
2022-05-03 20:50:57 +02:00
$imgUrls.push(src)
2020-09-10 21:48:14 +02:00
}
if (lazySrc && lazySrc.length) {
2022-05-03 20:50:57 +02:00
$imgLazyUrls.push(lazySrc)
$el.addClass('loading')
2020-09-10 21:48:14 +02:00
AjaxUI.preload([lazySrc]).then(() => {
2022-05-03 20:50:57 +02:00
$el.attr('src', lazySrc)
2020-09-10 21:48:14 +02:00
$el.on(`${Events.LOADED}`, () => {
2022-05-03 20:50:57 +02:00
$el.addClass('loaded')
$el.removeClass('loading')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$el.trigger(`${Events.LAZYIMAGEREADY}`)
})
})
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
})
2020-09-10 21:48:14 +02:00
// load lazy backgrounds
$Body
2022-05-03 20:50:57 +02:00
.find('[data-lazy-bg]')
.not('.loaded')
2020-09-10 21:48:14 +02:00
.each((i, el) => {
2022-05-03 20:50:57 +02:00
const $el = $(el)
const lazySrc = $el.data('lazy-bg')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
if ($el.hasClass('loaded')) {
return
2020-09-10 21:48:14 +02:00
}
if (lazySrc && lazySrc.length) {
2022-05-03 20:50:57 +02:00
$imgLazyUrls.push(lazySrc)
$el.addClass('loading')
2020-09-10 21:48:14 +02:00
AjaxUI.preload([lazySrc]).then(() => {
2022-05-03 20:50:57 +02:00
$el.css({ 'background-image': `url(${lazySrc})` })
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$el.addClass('loaded')
$el.removeClass('loading')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$el.trigger(`${Events.LAZYIMAGEREADY}`)
})
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
})
2020-09-10 21:48:14 +02:00
// replace img src
$Body
2022-05-03 20:50:57 +02:00
.find('[data-src-replace]')
.not('.loaded')
2020-09-10 21:48:14 +02:00
.each((i, el) => {
2022-05-03 20:50:57 +02:00
const $el = $(el)
const lazySrc = $el.data('src-replace')
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
if ($el.hasClass('loaded')) {
return
2020-09-10 21:48:14 +02:00
}
if (lazySrc && lazySrc.length) {
2022-05-03 20:50:57 +02:00
$el.addClass('loaded')
$el.attr('src', lazySrc)
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
})
2020-09-10 21:48:14 +02:00
// load defined images
AjaxUI.preload($imgUrls).then(() => {
2022-05-03 20:50:57 +02:00
$W.trigger('images-loaded')
2020-09-10 21:48:14 +02:00
// load lazy images
AjaxUI.preload($imgLazyUrls).then(() => {
2022-05-03 20:50:57 +02:00
console.log(`${NAME}: All images are loaded!`)
2020-09-10 21:48:14 +02:00
setTimeout(() => {
2022-05-03 20:50:57 +02:00
$W.trigger(`${Events.LAZYIMAGESREADY}`)
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
console.groupEnd('Post-init')
console.timeEnd('Post-init')
}, 100)
})
})
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
static dispose () {
console.log(`${NAME}: dispose`)
2020-09-10 21:48:14 +02:00
}
}
$W.on(
`${Events.MAININIT} ${Events.AJAX} ${Events.AJAXMAIN} ${Events.LOADED}`,
() => {
2022-05-03 20:50:57 +02:00
if ($W.hasClass('lock-main-init')) {
console.warn(`${NAME}: locked`)
return
2020-09-10 21:48:14 +02:00
}
2022-05-03 20:50:57 +02:00
$W.addClass('lock-main-init')
MainUI.init()
2021-08-18 20:51:15 +02:00
}
2022-05-03 20:50:57 +02:00
)
2020-09-10 21:48:14 +02:00
$W.on(`${Events.RESIZE}`, () => {
2022-05-03 20:50:57 +02:00
MainUI.detectBootstrapScreenSize()
})
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
$W.on('beforeunload unload', () => {
2020-09-10 21:48:14 +02:00
Spinner.show(() => {
2022-05-03 20:50:57 +02:00
$Body.removeClass('loaded')
})
})
2020-09-10 21:48:14 +02:00
// hide spinner on target _blank
2021-01-04 07:45:07 +01:00
$('[target="_blank"],.external')
.not('[data-toggle="lightbox"],[data-lightbox-gallery]')
2022-05-03 20:50:57 +02:00
.on('click submit touch', (e) => {
console.log(`${NAME}: External link`)
2021-01-04 07:45:07 +01:00
setTimeout(() => {
Spinner.hide(() => {
2022-05-03 20:50:57 +02:00
$Body.addClass('loaded')
})
}, 1000)
})
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
W.MainUI = MainUI
2020-09-10 21:48:14 +02:00
2022-05-03 20:50:57 +02:00
return MainUI
})($)
2019-06-08 17:20:51 +02:00
2022-05-03 20:50:57 +02:00
export default MainUI