123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /**
- * Licensed Materials - Property of IBM
- *
- * IBM Cognos Products: BI
- *
- * Copyright IBM Corp. 2017
- *
- * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- /**
- * @file Lasso selection view
- */
- 'use strict';
- define(['../../../lib/@waca/core-client/js/core-client/ui/View', 'jquery', '../../../lib/@waca/core-client/js/core-client/utils/BrowserUtils', '../../../lib/@waca/dashboard-common/dist/utils/EventChainLocal'], function (BaseView, $, BrowserUtils, EventChainLocal) {
- var keyCodes = {
- LEFT_CLICK: 1,
- ESCAPE: 27
- };
- var POINTER_EVENTS = {
- DOWN: 'mousedown touchstart',
- MOVE: 'mousemove touchmove',
- UP: 'mouseup touchend',
- LEAVE: 'mouseleave'
- };
- var LassoSelectView = BaseView.extend({
- id: 'lw-lasso-select',
- /**
- * @param {options} set of initial properties
- *
- */
- init: function init($target, cordinateResolver, isDragging) {
- BaseView.inherited('init', this, arguments);
- this.$el.prependTo(document.body);
- this.$target = $target;
- this.targetNode = this.$target.get(0);
- this.$body = $(document.body);
- this.cordinateResolver = cordinateResolver;
- this._isDragging = isDragging;
- this.handlers = {
- mousemove: this._getPipedHandler(this._handleMouseMove),
- mouseup: this._getPipedHandler(this._handleMouseUp),
- mousedown: this._getPipedHandler(this._handleMouseDown),
- keyup: this._getPipedHandler(this._handleKeyup),
- mouseleave: this._getPipedHandler(this._handleMouseLeave)
- };
- if (!this._isIE()) {
- this._configCursor();
- }
- this.$el.on(POINTER_EVENTS.MOVE, this.handlers.mousemove);
- this.$body.keyup(this.handlers.keyup);
- this.$target.on(POINTER_EVENTS.LEAVE, this.handlers.mouseleave).on(POINTER_EVENTS.MOVE, this.handlers.mousemove).on(POINTER_EVENTS.DOWN, this.handlers.mousedown);
- },
- /**
- * Mouse move event handler
- * @param {Object} event Jquery event object
- */
- _handleMouseMove: function _handleMouseMove(event) {
- this._updateCursor(event);
- var left = Math.min(event.pageX, this.left);
- var top = Math.min(event.pageY, this.top);
- var width = Math.abs(event.pageX - this.left);
- var height = Math.abs(event.pageY - this.top);
- var cssUpdate = {
- left: left,
- top: top,
- width: width,
- height: height
- };
- if (this._isDragging(event)) {
- this.$el.css(cssUpdate);
- if (this._isLassoWithinTarget()) {
- this.trigger('lassoSelect:cordsChange', { event: event, cords: this._getCords() });
- }
- }
- },
- /**
- * Handle key up event
- * @param {Object} event Jquery event object
- */
- _handleKeyup: function _handleKeyup(e) {
- if (e.keyCode === keyCodes.ESCAPE) {
- this.trigger('lassoSelect:cancel', {});
- }
- },
- /**
- * Mouse up event handler
- * @param {Object} event Jquery event object
- */
- _handleMouseUp: function _handleMouseUp(event) {
- if (this._isLassoWithinTarget()) {
- this.trigger('lassoSelect:done', { event: event, cords: this._getCords() });
- }
- var cssUpdate = {
- left: 0,
- top: 0,
- width: 0,
- height: 0
- };
- this.$el.css(cssUpdate);
- this.$body.off(POINTER_EVENTS.UP, this.handlers.mouseup);
- },
- /**
- * Mouse down event handler
- * @param {Object} event Jquery event object
- */
- _handleMouseDown: function _handleMouseDown(event) {
- if (event.type === 'touchstart' || event.which === keyCodes.LEFT_CLICK) {
- this.left = event.pageX;
- this.top = event.pageY;
- this.$body.on(POINTER_EVENTS.UP, this.handlers.mouseup);
- }
- },
- _handleMouseLeave: function _handleMouseLeave(event) {
- this._updateCursor(event, false);
- },
- remove: function remove() {
- this.$el.off(POINTER_EVENTS.MOVE, this.handlers.mousemove);
- this.$body.off(POINTER_EVENTS.UP, this.handlers.mouseup).off('keyup', this.handlers.keyup);
- this.$target.off(POINTER_EVENTS.DOWN, this.handlers.mousedown).off(POINTER_EVENTS.LEAVE, this.handlers.mouseleave).off(POINTER_EVENTS.MOVE, this.handlers.mousemove);
- if (this._initCursor) {
- this.targetNode.style.cursor = this._initCursor.target;
- }
- this.handlers = null;
- if (this.$cursor) {
- this.$cursor.remove();
- this.$cursor = null;
- }
- BaseView.inherited('remove', this, arguments);
- },
- /**
- * Returns the co-ordinate of the polygon (square) forming the lasso selection
- */
- _getCords: function _getCords() {
- var rect = this.el.getBoundingClientRect();
- var cords = [{ x: rect.left, y: rect.top }, // left top
- { x: rect.right, y: rect.top }, // right top
- { x: rect.right, y: rect.bottom }, // right bottom
- { x: rect.left, y: rect.bottom // left bottom
- }];
- return cords;
- },
- /**
- * Returns true if the event lasso area is within the target region
- */
- _isLassoWithinTarget: function _isLassoWithinTarget() {
- var targetRectCord = this.$target.get(0).getBoundingClientRect();
- var lassoRectCord = this.el.getBoundingClientRect();
- return lassoRectCord.top >= targetRectCord.top && lassoRectCord.left >= targetRectCord.left && lassoRectCord.right <= targetRectCord.right && lassoRectCord.bottom <= targetRectCord.bottom;
- },
- /**
- *
- * Pass handler through a pipe
- * @param handler - input handler function
- * @return Handler function which executes logic before calling the input handler.
- */
- _getPipedHandler: function _getPipedHandler(handler) {
- var func = function func(event) {
- if (this._isTouch(event)) {
- event.preventDefault();
- this.cordinateResolver(event);
- }
- // Lasso interaction don't deselect the widget
- var eventChainLocal = new EventChainLocal(event);
- eventChainLocal.setProperty('preventWidgetDeselect', true);
- handler.bind(this)(event);
- };
- return func.bind(this);
- },
- _isTouch: function _isTouch(event) {
- return event.type && (event.type === 'touchstart' || event.type === 'touchmove' || event.type === 'touchend');
- },
- _updateCursor: function _updateCursor(event, show) {
- if (!this._isIE()) {
- return;
- }
- var OFFSET = {
- LEFT: 10,
- TOP: 12
- };
- if (show === false) {
- if (this.$cursor) {
- this.$cursor.hide();
- }
- return;
- }
- if (this.$cursor && !this.$cursor.is(':visible')) {
- this.$cursor.show();
- } else if (!this.$cursor) {
- this.$cursor = $('<div class="lassoIconBox">');
- this.$cursor.prependTo(document.body);
- }
- this.$cursor.css({ left: event.pageX + OFFSET.LEFT, top: event.pageY + OFFSET.TOP });
- },
- _isIE: function _isIE() {
- return BrowserUtils.isIE();
- },
- _configCursor: function _configCursor() {
- var curVal = 'url(dashboard-analytics/images/pointer-marquee_32.svg), auto';
- this._initCursor = {};
- this._initCursor.target = this.targetNode.style.cursor;
- this.targetNode.style.cursor = curVal;
- },
- getCoordinates: function getCoordinates() {
- return this._getCords();
- }
- });
- return LassoSelectView;
- });
- //# sourceMappingURL=LassoSelectView.js.map
|