UNPKG

framework7

Version:

Full featured mobile HTML framework for building iOS & Android apps

618 lines (520 loc) 21.1 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _ssrWindow = require("ssr-window"); var _dom = _interopRequireDefault(require("../../shared/dom7")); var _utils = require("../../shared/utils"); var _getSupport = require("../../shared/get-support"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Swipeout = { init: function init() { var app = this; var document = (0, _ssrWindow.getDocument)(); var touchesStart = {}; var isTouched; var isMoved; var isScrolling; var touchStartTime; var touchesDiff; var $swipeoutEl; var $swipeoutContent; var $actionsRight; var $actionsLeft; var actionsLeftWidth; var actionsRightWidth; var translate; var opened; var openedActionsSide; var $leftButtons; var $rightButtons; var direction; var $overswipeLeftButton; var $overswipeRightButton; var overswipeLeft; var overswipeRight; function handleTouchStart(e) { if (!app.swipeout.allow) return; isMoved = false; isTouched = true; isScrolling = undefined; touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; touchStartTime = new Date().getTime(); $swipeoutEl = (0, _dom.default)(this); } function handleTouchMove(e) { if (!isTouched) return; var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX; var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY; if (typeof isScrolling === 'undefined') { isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)); } if (isScrolling) { isTouched = false; return; } if (!isMoved) { if ((0, _dom.default)('.list.sortable-opened').length > 0) return; $swipeoutContent = $swipeoutEl.find('.swipeout-content'); $actionsRight = $swipeoutEl.find('.swipeout-actions-right'); $actionsLeft = $swipeoutEl.find('.swipeout-actions-left'); actionsLeftWidth = null; actionsRightWidth = null; $leftButtons = null; $rightButtons = null; $overswipeRightButton = null; $overswipeLeftButton = null; if ($actionsLeft.length > 0) { actionsLeftWidth = $actionsLeft.outerWidth(); $leftButtons = $actionsLeft.children('a'); $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe'); } if ($actionsRight.length > 0) { actionsRightWidth = $actionsRight.outerWidth(); $rightButtons = $actionsRight.children('a'); $overswipeRightButton = $actionsRight.find('.swipeout-overswipe'); } opened = $swipeoutEl.hasClass('swipeout-opened'); if (opened) { openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right'; } $swipeoutEl.removeClass('swipeout-transitioning'); if (!app.params.swipeout.noFollow) { $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened'); $swipeoutEl.removeClass('swipeout-opened'); } } isMoved = true; if (e.cancelable) { e.preventDefault(); } touchesDiff = pageX - touchesStart.x; translate = touchesDiff; if (opened) { if (openedActionsSide === 'right') translate -= actionsRightWidth;else translate += actionsLeftWidth; } if (translate > 0 && $actionsLeft.length === 0 || translate < 0 && $actionsRight.length === 0) { if (!opened) { isTouched = false; isMoved = false; $swipeoutContent.transform(''); if ($rightButtons && $rightButtons.length > 0) { $rightButtons.transform(''); } if ($leftButtons && $leftButtons.length > 0) { $leftButtons.transform(''); } return; } translate = 0; } if (translate < 0) direction = 'to-left';else if (translate > 0) direction = 'to-right';else if (!direction) direction = 'to-left'; var buttonOffset; var progress; e.f7PreventSwipePanel = true; if (app.params.swipeout.noFollow) { if (opened) { if (openedActionsSide === 'right' && touchesDiff > 0) { app.swipeout.close($swipeoutEl); } if (openedActionsSide === 'left' && touchesDiff < 0) { app.swipeout.close($swipeoutEl); } } else { if (touchesDiff < 0 && $actionsRight.length > 0) { app.swipeout.open($swipeoutEl, 'right'); } if (touchesDiff > 0 && $actionsLeft.length > 0) { app.swipeout.open($swipeoutEl, 'left'); } } isTouched = false; isMoved = false; return; } overswipeLeft = false; overswipeRight = false; if ($actionsRight.length > 0) { // Show right actions var buttonTranslate = translate; progress = buttonTranslate / actionsRightWidth; if (buttonTranslate < -actionsRightWidth) { var ratio = buttonTranslate / -actionsRightWidth; buttonTranslate = -actionsRightWidth - Math.pow(-buttonTranslate - actionsRightWidth, 0.8); translate = buttonTranslate; if ($overswipeRightButton.length > 0 && ratio > app.params.swipeout.overswipeRatio) { overswipeRight = true; } } if (direction !== 'to-left') { progress = 0; buttonTranslate = 0; } $rightButtons.each(function (buttonEl) { var $buttonEl = (0, _dom.default)(buttonEl); if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') { $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft; } buttonOffset = buttonEl.f7SwipeoutButtonOffset; if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') { $buttonEl.css({ left: (overswipeRight ? -buttonOffset : 0) + "px" }); if (overswipeRight) { if (!$buttonEl.hasClass('swipeout-overswipe-active')) { $swipeoutEl.trigger('swipeout:overswipeenter'); app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]); } $buttonEl.addClass('swipeout-overswipe-active'); } else { if ($buttonEl.hasClass('swipeout-overswipe-active')) { $swipeoutEl.trigger('swipeout:overswipeexit'); app.emit('swipeoutOverswipeExit', $swipeoutEl[0]); } $buttonEl.removeClass('swipeout-overswipe-active'); } } $buttonEl.transform("translate3d(" + (buttonTranslate - buttonOffset * (1 + Math.max(progress, -1))) + "px,0,0)"); }); } if ($actionsLeft.length > 0) { // Show left actions var _buttonTranslate = translate; progress = _buttonTranslate / actionsLeftWidth; if (_buttonTranslate > actionsLeftWidth) { var _ratio = _buttonTranslate / actionsRightWidth; _buttonTranslate = actionsLeftWidth + Math.pow(_buttonTranslate - actionsLeftWidth, 0.8); translate = _buttonTranslate; if ($overswipeLeftButton.length > 0 && _ratio > app.params.swipeout.overswipeRatio) { overswipeLeft = true; } } if (direction !== 'to-right') { _buttonTranslate = 0; progress = 0; } $leftButtons.each(function (buttonEl, index) { var $buttonEl = (0, _dom.default)(buttonEl); if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') { $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth; } buttonOffset = buttonEl.f7SwipeoutButtonOffset; if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') { $buttonEl.css({ left: (overswipeLeft ? buttonOffset : 0) + "px" }); if (overswipeLeft) { if (!$buttonEl.hasClass('swipeout-overswipe-active')) { $swipeoutEl.trigger('swipeout:overswipeenter'); app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]); } $buttonEl.addClass('swipeout-overswipe-active'); } else { if ($buttonEl.hasClass('swipeout-overswipe-active')) { $swipeoutEl.trigger('swipeout:overswipeexit'); app.emit('swipeoutOverswipeExit', $swipeoutEl[0]); } $buttonEl.removeClass('swipeout-overswipe-active'); } } if ($leftButtons.length > 1) { $buttonEl.css('z-index', $leftButtons.length - index); } $buttonEl.transform("translate3d(" + (_buttonTranslate + buttonOffset * (1 - Math.min(progress, 1))) + "px,0,0)"); }); } $swipeoutEl.trigger('swipeout', progress); app.emit('swipeout', $swipeoutEl[0], progress); $swipeoutContent.transform("translate3d(" + translate + "px,0,0)"); } function handleTouchEnd() { if (!isTouched || !isMoved) { isTouched = false; isMoved = false; return; } isTouched = false; isMoved = false; var timeDiff = new Date().getTime() - touchStartTime; var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft; var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth; var action; var $buttons; var i; if (timeDiff < 300 && (touchesDiff < -10 && direction === 'to-left' || touchesDiff > 10 && direction === 'to-right') || timeDiff >= 300 && Math.abs(translate) > actionsWidth / 2) { action = 'open'; } else { action = 'close'; } if (timeDiff < 300) { if (Math.abs(translate) === 0) action = 'close'; if (Math.abs(translate) === actionsWidth) action = 'open'; } if (action === 'open') { Swipeout.el = $swipeoutEl[0]; $swipeoutEl.trigger('swipeout:open'); app.emit('swipeoutOpen', $swipeoutEl[0]); $swipeoutEl.addClass('swipeout-opened swipeout-transitioning'); var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth; $swipeoutContent.transform("translate3d(" + newTranslate + "px,0,0)"); $actions.addClass('swipeout-actions-opened'); $buttons = direction === 'to-left' ? $rightButtons : $leftButtons; if ($buttons) { for (i = 0; i < $buttons.length; i += 1) { (0, _dom.default)($buttons[i]).transform("translate3d(" + newTranslate + "px,0,0)"); } } if (overswipeRight) { $actionsRight.find('.swipeout-overswipe').trigger('click', 'f7Overswipe'); } if (overswipeLeft) { $actionsLeft.find('.swipeout-overswipe').trigger('click', 'f7Overswipe'); } } else { $swipeoutEl.trigger('swipeout:close'); app.emit('swipeoutClose', $swipeoutEl[0]); Swipeout.el = undefined; $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened'); $swipeoutContent.transform(''); $actions.removeClass('swipeout-actions-opened'); } var buttonOffset; if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) { $leftButtons.each(function (buttonEl) { var $buttonEl = (0, _dom.default)(buttonEl); buttonOffset = buttonEl.f7SwipeoutButtonOffset; if (typeof buttonOffset === 'undefined') { $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth; } $buttonEl.transform("translate3d(" + buttonOffset + "px,0,0)"); }); } if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) { $rightButtons.each(function (buttonEl) { var $buttonEl = (0, _dom.default)(buttonEl); buttonOffset = buttonEl.f7SwipeoutButtonOffset; if (typeof buttonOffset === 'undefined') { $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft; } $buttonEl.transform("translate3d(" + -buttonOffset + "px,0,0)"); }); } $swipeoutContent.transitionEnd(function () { if (opened && action === 'open' || !opened && action === 'close') return; $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed'); app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]); $swipeoutEl.removeClass('swipeout-transitioning'); if (opened && action === 'close') { if ($actionsRight.length > 0) { $rightButtons.transform(''); } if ($actionsLeft.length > 0) { $leftButtons.transform(''); } } }); } var passiveListener = (0, _getSupport.getSupport)().passiveListener ? { passive: true } : false; app.on('touchstart', function (e) { if (Swipeout.el) { var $targetEl = (0, _dom.default)(e.target); if (!((0, _dom.default)(Swipeout.el).is($targetEl[0]) || $targetEl.parents('.swipeout').is(Swipeout.el) || $targetEl.hasClass('modal-in') || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0 || $targetEl.hasClass('actions-modal') || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0)) { app.swipeout.close(Swipeout.el); } } }); (0, _dom.default)(document).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener); app.on('touchmove:active', handleTouchMove); app.on('touchend:passive', handleTouchEnd); }, allow: true, el: undefined, open: function open() { var app = this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var el = args[0], side = args[1], callback = args[2]; if (typeof args[1] === 'function') { el = args[0]; callback = args[1]; side = args[2]; } var $el = (0, _dom.default)(el).eq(0); if ($el.length === 0) return; if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) return; if (!side) { if ($el.find('.swipeout-actions-right').length > 0) side = 'right';else side = 'left'; } var $swipeoutActions = $el.find(".swipeout-actions-" + side); var $swipeoutContent = $el.find('.swipeout-content'); if ($swipeoutActions.length === 0) return; $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning'); app.emit('swipeoutOpen', $el[0]); $swipeoutActions.addClass('swipeout-actions-opened'); var $buttons = $swipeoutActions.children('a'); var swipeoutActionsWidth = $swipeoutActions.outerWidth(); var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth; if ($buttons.length > 1) { $buttons.each(function (buttonEl, buttonIndex) { var $buttonEl = (0, _dom.default)(buttonEl); if (side === 'right') { $buttonEl.transform("translate3d(" + -buttonEl.offsetLeft + "px,0,0)"); } else { $buttonEl.css('z-index', $buttons.length - buttonIndex).transform("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"); } }); } $el.addClass('swipeout-transitioning'); $swipeoutContent.transitionEnd(function () { $el.trigger('swipeout:opened'); app.emit('swipeoutOpened', $el[0]); if (callback) callback.call($el[0]); }); (0, _utils.nextFrame)(function () { $buttons.transform("translate3d(" + translate + "px,0,0)"); $swipeoutContent.transform("translate3d(" + translate + "px,0,0)"); }); Swipeout.el = $el[0]; }, close: function close(el, callback) { var app = this; var $el = (0, _dom.default)(el).eq(0); if ($el.length === 0) return; if (!$el.hasClass('swipeout-opened')) return; var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left'; var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened'); var $buttons = $swipeoutActions.children('a'); var swipeoutActionsWidth = $swipeoutActions.outerWidth(); app.swipeout.allow = false; $el.trigger('swipeout:close'); app.emit('swipeoutClose', $el[0]); $el.removeClass('swipeout-opened').addClass('swipeout-transitioning'); var closeTimeout; function onSwipeoutClose() { app.swipeout.allow = true; if ($el.hasClass('swipeout-opened')) return; $el.removeClass('swipeout-transitioning'); $buttons.transform(''); $el.trigger('swipeout:closed'); app.emit('swipeoutClosed', $el[0]); if (callback) callback.call($el[0]); if (closeTimeout) clearTimeout(closeTimeout); } $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose); closeTimeout = setTimeout(onSwipeoutClose, 500); $buttons.each(function (buttonEl) { var $buttonEl = (0, _dom.default)(buttonEl); if (side === 'right') { $buttonEl.transform("translate3d(" + -buttonEl.offsetLeft + "px,0,0)"); } else { $buttonEl.transform("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"); } $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active'); }); if (Swipeout.el && Swipeout.el === $el[0]) Swipeout.el = undefined; }, delete: function _delete(el, callback) { var app = this; var $el = (0, _dom.default)(el).eq(0); if ($el.length === 0) return; Swipeout.el = undefined; $el.trigger('swipeout:delete'); app.emit('swipeoutDelete', $el[0]); $el.css({ height: $el.outerHeight() + "px" }); $el.transitionEnd(function () { $el.trigger('swipeout:deleted'); app.emit('swipeoutDeleted', $el[0]); if (callback) callback.call($el[0]); if ($el.parents('.virtual-list').length > 0) { var virtualList = $el.parents('.virtual-list')[0].f7VirtualList; var virtualIndex = $el[0].f7VirtualListIndex; if (virtualList && typeof virtualIndex !== 'undefined') virtualList.deleteItem(virtualIndex); } else if (app.params.swipeout.removeElements) { if (app.params.swipeout.removeElementsWithTimeout) { setTimeout(function () { $el.remove(); }, app.params.swipeout.removeElementsTimeout); } else { $el.remove(); } } else { $el.removeClass('swipeout-deleting swipeout-transitioning'); } }); // eslint-disable-next-line // $el[0]._clientLeft = $el[0].clientLeft; (0, _utils.nextFrame)(function () { $el.addClass('swipeout-deleting swipeout-transitioning').css({ height: '0px' }).find('.swipeout-content').transform('translate3d(-100%,0,0)'); }); } }; var _default = { name: 'swipeout', params: { swipeout: { actionsNoFold: false, noFollow: false, removeElements: true, removeElementsWithTimeout: false, removeElementsTimeout: 0, overswipeRatio: 1.2 } }, create: function create() { var app = this; (0, _utils.bindMethods)(app, { swipeout: Swipeout }); }, clicks: { '.swipeout-open': function openSwipeout($clickedEl, data) { if (data === void 0) { data = {}; } var app = this; app.swipeout.open(data.swipeout, data.side); }, '.swipeout-close': function closeSwipeout($clickedEl) { var app = this; var $swipeoutEl = $clickedEl.closest('.swipeout'); if ($swipeoutEl.length === 0) return; app.swipeout.close($swipeoutEl); }, '.swipeout-delete': function deleteSwipeout($clickedEl, data) { if (data === void 0) { data = {}; } var app = this; var $swipeoutEl = $clickedEl.closest('.swipeout'); if ($swipeoutEl.length === 0) return; var _data = data, confirm = _data.confirm, confirmTitle = _data.confirmTitle; if (data.confirm) { app.dialog.confirm(confirm, confirmTitle, function () { app.swipeout.delete($swipeoutEl); }); } else { app.swipeout.delete($swipeoutEl); } } }, on: { init: function init() { var app = this; if (!app.params.swipeout) return; app.swipeout.init(); } } }; exports.default = _default;