337 lines
13 KiB
JavaScript
337 lines
13 KiB
JavaScript
/*===============================================================================
|
|
************ Handle clicks and make them fast (on tap); ************
|
|
===============================================================================*/
|
|
app.initClickEvents = function () {
|
|
function handleScrollTop(e) {
|
|
/*jshint validthis:true */
|
|
var clicked = $(this);
|
|
var target = $(e.target);
|
|
var isLink = clicked[0].nodeName.toLowerCase() === 'a' ||
|
|
clicked.parents('a').length > 0 ||
|
|
target[0].nodeName.toLowerCase() === 'a' ||
|
|
target.parents('a').length > 0;
|
|
|
|
if (isLink) return;
|
|
var pageContent, page;
|
|
if (app.params.scrollTopOnNavbarClick && clicked.is('.navbar .center')) {
|
|
// Find active page
|
|
var navbar = clicked.parents('.navbar');
|
|
|
|
// Static Layout
|
|
pageContent = navbar.parents('.page-content');
|
|
|
|
if (pageContent.length === 0) {
|
|
// Fixed Layout
|
|
if (navbar.parents('.page').length > 0) {
|
|
pageContent = navbar.parents('.page').find('.page-content');
|
|
}
|
|
// Through Layout
|
|
if (pageContent.length === 0) {
|
|
if (navbar.nextAll('.pages').length > 0) {
|
|
pageContent = navbar.nextAll('.pages').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (app.params.scrollTopOnStatusbarClick && clicked.is('.statusbar-overlay')) {
|
|
if ($('.popup.modal-in').length > 0) {
|
|
// Check for opened popup
|
|
pageContent = $('.popup.modal-in').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');
|
|
}
|
|
else if ($('.panel.active').length > 0) {
|
|
// Check for opened panel
|
|
pageContent = $('.panel.active').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');
|
|
}
|
|
else if ($('.views > .view.active').length > 0) {
|
|
// View in tab bar app layout
|
|
pageContent = $('.views > .view.active').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');
|
|
}
|
|
else {
|
|
// Usual case
|
|
pageContent = $('.views').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');
|
|
}
|
|
}
|
|
|
|
if (pageContent && pageContent.length > 0) {
|
|
// Check for tab
|
|
if (pageContent.hasClass('tab')) {
|
|
pageContent = pageContent.parent('.tabs').children('.page-content.active');
|
|
}
|
|
if (pageContent.length > 0) pageContent.scrollTop(0, 300);
|
|
}
|
|
}
|
|
function handleClicks(e) {
|
|
/*jshint validthis:true */
|
|
var clicked = $(this);
|
|
var url = clicked.attr('href');
|
|
var isLink = clicked[0].nodeName.toLowerCase() === 'a';
|
|
|
|
// Check if link is external
|
|
if (isLink) {
|
|
if (clicked.is(app.params.externalLinks) || (url && url.indexOf('javascript:') >= 0)) {
|
|
if(url && clicked.attr('target') === '_system') {
|
|
e.preventDefault();
|
|
window.open(url, '_system');
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Collect Clicked data- attributes
|
|
var clickedData = clicked.dataset();
|
|
|
|
// Smart Select
|
|
if (clicked.hasClass('smart-select')) {
|
|
if (app.smartSelectOpen) app.smartSelectOpen(clicked);
|
|
}
|
|
|
|
// Open Panel
|
|
if (clicked.hasClass('open-panel')) {
|
|
if ($('.panel').length === 1) {
|
|
if ($('.panel').hasClass('panel-left')) app.openPanel('left');
|
|
else app.openPanel('right');
|
|
}
|
|
else {
|
|
if (clickedData.panel === 'right') app.openPanel('right');
|
|
else app.openPanel('left');
|
|
}
|
|
}
|
|
// Close Panel
|
|
if (clicked.hasClass('close-panel')) {
|
|
app.closePanel();
|
|
}
|
|
|
|
if (clicked.hasClass('panel-overlay') && app.params.panelsCloseByOutside) {
|
|
app.closePanel();
|
|
}
|
|
// Popover
|
|
if (clicked.hasClass('open-popover')) {
|
|
var popover;
|
|
if (clickedData.popover) {
|
|
popover = clickedData.popover;
|
|
}
|
|
else popover = '.popover';
|
|
app.popover(popover, clicked);
|
|
}
|
|
if (clicked.hasClass('close-popover')) {
|
|
app.closeModal('.popover.modal-in');
|
|
}
|
|
// Popup
|
|
var popup;
|
|
if (clicked.hasClass('open-popup')) {
|
|
if (clickedData.popup) {
|
|
popup = clickedData.popup;
|
|
}
|
|
else popup = '.popup';
|
|
app.popup(popup);
|
|
}
|
|
if (clicked.hasClass('close-popup')) {
|
|
if (clickedData.popup) {
|
|
popup = clickedData.popup;
|
|
}
|
|
else popup = '.popup.modal-in';
|
|
app.closeModal(popup);
|
|
}
|
|
// Login Screen
|
|
var loginScreen;
|
|
if (clicked.hasClass('open-login-screen')) {
|
|
if (clickedData.loginScreen) {
|
|
loginScreen = clickedData.loginScreen;
|
|
}
|
|
else loginScreen = '.login-screen';
|
|
app.loginScreen(loginScreen);
|
|
}
|
|
if (clicked.hasClass('close-login-screen')) {
|
|
app.closeModal('.login-screen.modal-in');
|
|
}
|
|
// Close Modal
|
|
if (clicked.hasClass('modal-overlay')) {
|
|
if ($('.modal.modal-in').length > 0 && app.params.modalCloseByOutside)
|
|
app.closeModal('.modal.modal-in');
|
|
if ($('.actions-modal.modal-in').length > 0 && app.params.actionsCloseByOutside)
|
|
app.closeModal('.actions-modal.modal-in');
|
|
|
|
if ($('.popover.modal-in').length > 0) app.closeModal('.popover.modal-in');
|
|
}
|
|
if (clicked.hasClass('popup-overlay')) {
|
|
if ($('.popup.modal-in').length > 0 && app.params.popupCloseByOutside)
|
|
app.closeModal('.popup.modal-in');
|
|
}
|
|
if (clicked.hasClass('picker-modal-overlay')) {
|
|
if ($('.picker-modal.modal-in').length > 0)
|
|
app.closeModal('.picker-modal.modal-in');
|
|
}
|
|
|
|
// Picker
|
|
if (clicked.hasClass('close-picker')) {
|
|
var pickerToClose = $('.picker-modal.modal-in');
|
|
if (pickerToClose.length > 0) {
|
|
app.closeModal(pickerToClose);
|
|
}
|
|
else {
|
|
pickerToClose = $('.popover.modal-in .picker-modal');
|
|
if (pickerToClose.length > 0) {
|
|
app.closeModal(pickerToClose.parents('.popover'));
|
|
}
|
|
}
|
|
}
|
|
if (clicked.hasClass('open-picker')) {
|
|
var pickerToOpen;
|
|
if (clickedData.picker) {
|
|
pickerToOpen = clickedData.picker;
|
|
}
|
|
else pickerToOpen = '.picker-modal';
|
|
app.pickerModal(pickerToOpen, clicked);
|
|
}
|
|
|
|
// Tabs
|
|
var isTabLink;
|
|
if (clicked.hasClass('tab-link')) {
|
|
isTabLink = true;
|
|
app.showTab(clickedData.tab || clicked.attr('href'), clicked);
|
|
}
|
|
// Swipeout Close
|
|
if (clicked.hasClass('swipeout-close')) {
|
|
app.swipeoutClose(clicked.parents('.swipeout-opened'));
|
|
}
|
|
// Swipeout Delete
|
|
if (clicked.hasClass('swipeout-delete')) {
|
|
if (clickedData.confirm) {
|
|
var text = clickedData.confirm;
|
|
var title = clickedData.confirmTitle;
|
|
if (title) {
|
|
app.confirm(text, title, function () {
|
|
app.swipeoutDelete(clicked.parents('.swipeout'));
|
|
}, function () {
|
|
if (clickedData.closeOnCancel) app.swipeoutClose(clicked.parents('.swipeout'));
|
|
});
|
|
}
|
|
else {
|
|
app.confirm(text, function () {
|
|
app.swipeoutDelete(clicked.parents('.swipeout'));
|
|
}, function () {
|
|
if (clickedData.closeOnCancel) app.swipeoutClose(clicked.parents('.swipeout'));
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
app.swipeoutDelete(clicked.parents('.swipeout'));
|
|
}
|
|
|
|
}
|
|
// Sortable
|
|
if (clicked.hasClass('toggle-sortable')) {
|
|
app.sortableToggle(clickedData.sortable);
|
|
}
|
|
if (clicked.hasClass('open-sortable')) {
|
|
app.sortableOpen(clickedData.sortable);
|
|
}
|
|
if (clicked.hasClass('close-sortable')) {
|
|
app.sortableClose(clickedData.sortable);
|
|
}
|
|
// Accordion
|
|
if (clicked.hasClass('accordion-item-toggle') || (clicked.hasClass('item-link') && clicked.parent().hasClass('accordion-item'))) {
|
|
var accordionItem = clicked.parent('.accordion-item');
|
|
if (accordionItem.length === 0) accordionItem = clicked.parents('.accordion-item');
|
|
if (accordionItem.length === 0) accordionItem = clicked.parents('li');
|
|
app.accordionToggle(accordionItem);
|
|
}
|
|
|
|
// Speed Dial
|
|
if (clicked.hasClass('floating-button') && clicked.parent().hasClass('speed-dial')) {
|
|
clicked.parent().toggleClass('speed-dial-opened');
|
|
}
|
|
if (clicked.hasClass('close-speed-dial')) {
|
|
$('.speed-dial-opened').removeClass('speed-dial-opened');
|
|
}
|
|
|
|
// Load Page
|
|
if (app.params.ajaxLinks && !clicked.is(app.params.ajaxLinks) || !isLink || !app.params.router) {
|
|
return;
|
|
}
|
|
if (isLink) {
|
|
e.preventDefault();
|
|
}
|
|
|
|
var validUrl = url && url.length > 0 && url !== '#' && !isTabLink;
|
|
var template = clickedData.template;
|
|
if (validUrl || clicked.hasClass('back') || template) {
|
|
var view;
|
|
if (clickedData.view) {
|
|
view = $(clickedData.view)[0].f7View;
|
|
}
|
|
else {
|
|
view = clicked.parents('.' + app.params.viewClass)[0] && clicked.parents('.' + app.params.viewClass)[0].f7View;
|
|
if (view && view.params.linksView) {
|
|
if (typeof view.params.linksView === 'string') view = $(view.params.linksView)[0].f7View;
|
|
else if (view.params.linksView instanceof View) view = view.params.linksView;
|
|
}
|
|
}
|
|
if (!view) {
|
|
if (app.mainView) view = app.mainView;
|
|
}
|
|
if (!view) return;
|
|
|
|
var pageName;
|
|
if (!template) {
|
|
if (url && url.indexOf('#') === 0 && url !== '#') {
|
|
if (view.params.domCache) {
|
|
pageName = url.split('#')[1];
|
|
}
|
|
else return;
|
|
}
|
|
if (url === '#' && !clicked.hasClass('back')) return;
|
|
}
|
|
else {
|
|
url = undefined;
|
|
}
|
|
|
|
var animatePages;
|
|
if (typeof clickedData.animatePages !== 'undefined') {
|
|
animatePages = clickedData.animatePages;
|
|
}
|
|
else {
|
|
if (clicked.hasClass('with-animation')) animatePages = true;
|
|
if (clicked.hasClass('no-animation')) animatePages = false;
|
|
}
|
|
|
|
var options = {
|
|
animatePages: animatePages,
|
|
ignoreCache: clickedData.ignoreCache,
|
|
force: clickedData.force,
|
|
reload: clickedData.reload,
|
|
reloadPrevious: clickedData.reloadPrevious,
|
|
pageName: pageName,
|
|
pushState: clickedData.pushState,
|
|
url: url
|
|
};
|
|
|
|
if (app.params.template7Pages) {
|
|
options.contextName = clickedData.contextName;
|
|
var context = clickedData.context;
|
|
if (context) {
|
|
options.context = JSON.parse(context);
|
|
}
|
|
}
|
|
if (template && template in t7.templates) {
|
|
options.template = t7.templates[template];
|
|
}
|
|
|
|
if (clicked.hasClass('back')) view.router.back(options);
|
|
else view.router.load(options);
|
|
}
|
|
}
|
|
$(document).on('click', 'a, .open-panel, .close-panel, .panel-overlay, .modal-overlay, .popup-overlay, .swipeout-delete, .swipeout-close, .close-popup, .open-popup, .open-popover, .open-login-screen, .close-login-screen .smart-select, .toggle-sortable, .open-sortable, .close-sortable, .accordion-item-toggle, .close-picker, .picker-modal-overlay', handleClicks);
|
|
if (app.params.scrollTopOnNavbarClick || app.params.scrollTopOnStatusbarClick) {
|
|
$(document).on('click', '.statusbar-overlay, .navbar .center', handleScrollTop);
|
|
}
|
|
|
|
// Prevent scrolling on overlays
|
|
function preventScrolling(e) {
|
|
e.preventDefault();
|
|
}
|
|
if (app.support.touch && !app.device.android) {
|
|
$(document).on((app.params.fastClicks ? 'touchstart' : 'touchmove'), '.panel-overlay, .modal-overlay, .preloader-indicator-overlay, .popup-overlay, .searchbar-overlay', preventScrolling);
|
|
}
|
|
};
|