{"version":3,"sources":["webpack:///./node_modules/fabric-customise-controls/dist/customiseControls.js","webpack:///./src/components/canvas/Box.js","webpack:///./src/components/canvas/util.js","webpack:///./src/components/common/ImagePlayer/PlayerFullscreenButtonMobile.vue?015d","webpack:///./src/components/common/ImagePlayer/ImagePlayer.vue?dfc3","webpack:///./src/components/canvas/GlobalControl.js","webpack:///./src/components/canvas/ZoomPanning.js","webpack:///./src/components/canvas/Player.js","webpack:///./src/components/canvas/CustomiseControls.js","webpack:///./src/components/canvas/Canvas.js","webpack:///./src/components/common/ImagePlayer/PlayerFullscreenButtonMobile.vue?363a","webpack:///src/components/common/ImagePlayer/PlayerFullscreenButtonMobile.vue","webpack:///./src/components/common/ImagePlayer/PlayerFullscreenButtonMobile.vue?64e7","webpack:///./src/components/common/ImagePlayer/PlayerFullscreenButtonMobile.vue","webpack:///src/components/common/ImagePlayer/ImagePlayer.vue","webpack:///./src/components/common/ImagePlayer/ImagePlayer.vue?7a2c","webpack:///./src/components/common/ImagePlayer/ImagePlayer.vue","webpack:///./src/assets/icon_close-white.svg","webpack:///./src/assets/Mobile_FullScreen_Button.svg","webpack:///./src/assets/Icon feather-map-pin.svg","webpack:///./src/components/common/ImagePlayer/ImagePlayer.vue?23d3"],"names":["window","fabric","minExtCompat","isVML","G_vmlCanvasManager","degreesToRadians","util","cursorOffset","mt","tr","mr","br","mb","bl","ml","tl","localeCompare","version","console","warn","object","extend","Object","prototype","useCustomIcons","cornerBackgroundColor","cornerShape","cornerPadding","customiseCornerIcons","obj","callback","setting","cornerConfig","hasOwnProperty","undefined","this","borderColor","cornerSize","icon","keys","settings","loadIcon","corner","self","Image","onload","onerror","src","match","substring","crossOrigin","customizeCornerIcons","drawControls","ctx","hasControls","methodName","wh","_calculateCurrentDimensions","width","x","height","y","scaleOffset","left","top","lineWidth","globalAlpha","isMoving","borderOpacityWhenMoving","strokeStyle","fillStyle","cornerColor","transparentCorners","cornerStrokeColor","save","_setLineDash","cornerDashArray","_drawControl","tlIcon","tlSettings","trIcon","trSettings","blIcon","blSettings","brIcon","brSettings","get","mtIcon","mtSettings","mbIcon","mbSettings","mrIcon","mrSettings","mlIcon","mlSettings","hasRotatingPoint","rotatingPointOffset","mtrIcon","mtrSettings","restore","control","isControlVisible","size","cornerStroke","cornerBG","fillRect","strokeRect","beginPath","arc","Math","PI","fill","stroke","closePath","clearRect","_setCornerCoords","coords","oCoords","newTheta","angle","point","cornerHypotenuse","cosHalfOffset","cos","sinHalfOffset","sin","Canvas","overwriteActions","fixedCursors","customiseControls","action","setCustomAction","cursor","setCustomCursor","cursorUrl","customizeControls","_getActionFromCorner","target","e","altActionKey","_setupCurrentTransform","alreadySelected","pointer","getPointer","_findTargetCorner","origin","_getOriginFromCorner","call","_currentTransform","scaleX","scaleY","skewX","skewY","offsetX","offsetY","originX","originY","ex","ey","lastX","lastY","theta","mouseXSign","mouseYSign","shiftKey","altKey","centeredKey","original","_removeAction","_moveLayerUpAction","_moveLayerDownAction","_rotateByDegrees","rotateByDegrees","_resetCurrentTransform","_this","getActiveObjects","forEach","o","off","discardActiveObject","remove","bringForward","sendBackwards","value","parseInt","needsOriginRestore","centeredRotation","_setOriginToCenter","set","setCoords","_setCenterToOrigin","renderAll","getCornerCursor","iconUrlPattern","actionIsDisabled","notAllowedCursor","setCursor","_getRotatedCornerCursor","defaultCursor","rotationCursor","module","exports","Box","selectable","fabricObject","visible","logId","canvas","Rect","rx","ry","strokeWidth","strokeUniform","hoverCursor","add","model","isVisible","shapes","index","indexOf","splice","transFromDataToBox","data","canvasElement","imageObject","doNotCheckMinimum","originWidth","originHeight","changeCoordinateFromCenterCenterToLeftTop","checkDrawingBoundary","ratio","clientWidth","clientHeight","clientRatio","originRatio","startX","startY","w","h","box","id","complete","transFromBoxToData","changeCoordinateFromLeftTopToCenterCenter","toFixed","assign","checDrawingMinimumSize","centerX","centerY","render","_vm","_h","$createElement","_c","_self","class","isFullscreen","staticStyle","on","onContextMenu","onMouseDown","attrs","isloading","loading","monitor","_e","isDraw","clickDraw","staticClass","canvasId","directives","name","rawName","expression","contextmenu","onDownloadFrameImage","_v","mobile","zoom","onClickZoom","onClickFullScreenPlayer","staticRenderFns","setObjectsSelection","isSelection","getObjects","bgImg","state","ZoomPanning","player","setZoom","getCenter","zoomToPoint","checkViewportBoundary","deltaY","maxZoom","minZoom","preventDefault","stopPropagation","dragLeftButton","type","button","GlobalControl","isPanning","lastPosX","clientX","lastPosY","clientY","vpt","viewportTransform","isPlay","cw","getWidth","ch","getHeight","bgw","getScaledWidth","bgh","getScaledHeight","Player","Map","images","startCallback","stopCallback","speed","updateFrameCallback","imagePath","FPS_INTERVAL","length","isPause","Promise","all","map","loadImage","then","imageObjs","filter","image","fitCanvas","loadedImageSrc","getSrc","startAnimation","stop","resolve","playingIndex","requestRenderAll","isInit","isResize","cancelAnimationFrame","animationRequest","manageCacheSize","Date","now","startTime","performAnimation","elapsed","requestAnimFrame","url","imageCache","has","hit","date","fromURL","cacheImages","IMAGE_CACHE_SIZE","cachedImages","entries","entry","push","sort","a","b","removeItems","slice","item","includes","removeImages","delete","dispose","canvasW","canvasH","ratioW","ratioH","scale","centerObject","CustomiseControls","updateEmitter","emit","toJson","function","require","active","EventEmitter","initialize","parentNode","zoomPanning","evented","wheel","onMouseWheel","bind","onMouseDownBefore","onMouseMove","onMouseUp","selectionBorderColor","selectionColor","registerOnResize","processZoom","processAltKey","downX","absolutePointer","downY","transform","startsWith","shapedUpdate","abs","getActiveObject","draw","resizeHandler","clearTimeout","resizeTimeout","setTimeout","reload","addEventListener","intervalCheckCanvasSize","checkWindowSize","startCheckWindowSize","bgImgPath","loadBgImage","setShapes","backupJson","setBgImg","options","drawBox","setVisibleShapes","play","brintToFrontShapes","onLoadedImageSrc","pause","clear","objects","currentLogId","shape","setVisible","bringToFront","disabledActiveObject","handler","onClickButton","methods","$emit","component","components","Loading","ContextMenu","PlayerZoom","PlayerFullscreenButton","props","liveViewDialog","default","currentCamImageSrc","currentLog","currentLogProps","hasAfterImages","admin","required","frame","download","isMobileLiveCamImage","defaultImages","Array","defaultImage","boxId","srcList","boxList","playNum","loaded","display","currentFrameIndex","computed","mapState","beforeImagePathsListLength","before_image_paths","created","first","mounted","document","querySelector","addUpdateHandler","updateHandler","addMarginLeftHandler","marginLeftHandler","addResizeInFullscreenHandler","resizeInFullscreenHandler","detectionClipInitialize","setNewLiveImageOnCanvas","destroyed","watch","newLog","prevLog","after_image_paths","log","addedAfterImg","changed","PREV_LOG_ID","NEW_LOG_ID","val","old","$log","debug","playerPause","closeContextMenu","playerPlay","playerStop","makeObject","json","setDraw","marginLeft","stopped","secondaryButton","evt","primaryButton","FileSaver","ClickOutside"],"mappings":"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","file":"js/chunk-10df95e0.04b7c81d.js","sourcesContent":["/*\n * fabric.js Controls Extension\n * for fabric.js current build\n * Simon Kunz 09.02.2016 for pixolith\n * Licensed under the MIT license.\n */\n\n'use strict';\n(function(window) {\n var fabric = window.fabric || (window.fabric = {}),\n minExtCompat = '1.6.0',\n isVML = function() {\n return typeof G_vmlCanvasManager !== 'undefined';\n },\n degreesToRadians = fabric.util.degreesToRadians,\n cursorOffset = {\n mt: 0, // n\n tr: 1, // ne\n mr: 2, // e\n br: 3, // se\n mb: 4, // s\n bl: 5, // sw\n ml: 6, // w\n tl: 7, // nw\n };\n\n if (minExtCompat.localeCompare(window.fabric.version) > -1) {\n console.warn(\n 'this extension might not be fully compatible with your version ' +\n 'of fabric.js (' +\n window.fabric.version +\n ').' +\n 'Consider using the latest compatible build of fabric.js (> ' +\n minExtCompat +\n ')'\n );\n }\n\n fabric.util.object.extend(fabric.Object.prototype, {\n /**\n * When true, image icons are loaded via the drawImage method\n * @type Boolean\n * @default false\n */\n\n useCustomIcons: false,\n\n /**\n * Sets a background-color for drawImage operations with transparency\n * @type string\n * @default transparent\n */\n\n cornerBackgroundColor: 'transparent',\n\n /**\n * Sets the shape of the background for drawImage operations with transparency\n * @type string\n * @default rect\n */\n\n cornerShape: '',\n\n /**\n * Inner Padding between Shape Background and drawn Image\n * @type int\n * @default rect\n */\n\n cornerPadding: 0,\n\n /**\n * Set a custom corner icon\n * @param {Object} obj settings and icon url.\n * @param callback function\n */\n\n customiseCornerIcons: function(obj, callback) {\n var setting, cornerConfig;\n\n for (setting in obj) {\n if (obj.hasOwnProperty(setting)) {\n cornerConfig = {};\n\n if (obj[setting].cornerShape !== undefined) {\n this.cornerShape = obj[setting].cornerShape;\n }\n\n if (obj[setting].cornerBackgroundColor !== undefined) {\n this.cornerBackgroundColor =\n obj[setting].cornerBackgroundColor;\n }\n\n if (obj[setting].borderColor !== undefined) {\n this.borderColor = obj[setting].borderColor;\n }\n\n if (obj[setting].cornerSize !== undefined) {\n this.cornerSize = obj[setting].cornerSize;\n }\n\n if (obj[setting].cornerPadding !== undefined) {\n this.cornerPadding = obj[setting].cornerPadding;\n }\n\n if (\n obj[setting].icon !== undefined ||\n Object.keys(obj)[0] === 'settings'\n ) {\n this.useCustomIcons = true;\n\n if (obj[setting].settings !== undefined) {\n cornerConfig.settings = obj[setting].settings;\n }\n\n if (obj[setting].icon !== undefined) {\n cornerConfig.icon = obj[setting].icon;\n\n this.loadIcon(setting, cornerConfig, function() {\n if (\n callback &&\n typeof callback === 'function'\n ) {\n callback();\n }\n });\n }\n }\n }\n }\n },\n\n /**\n * loads the icon image as an image src.\n * @param {Object} corner to load an icon.\n * @param cornerConfig as object containing icon url and corner specific settings\n * @param callback function.\n */\n\n loadIcon: function(corner, cornerConfig, callback) {\n var self = this,\n icon = new Image();\n\n icon.onload = function() {\n self[corner + 'Icon'] = this;\n\n if (cornerConfig.settings) {\n self[corner + 'Settings'] = cornerConfig.settings;\n }\n\n if (callback && typeof callback === 'function') {\n callback();\n }\n };\n\n icon.onerror = function() {\n fabric.warn(this.src + ' icon is not an image');\n };\n\n if (\n cornerConfig.icon.match(/^http[s]?:\\/\\//) ||\n cornerConfig.icon.substring(0, 2) === '//'\n ) {\n icon.crossOrigin = 'Anonymous';\n }\n\n icon.src = cornerConfig.icon;\n },\n\n /**\n * copy of the setter method for our american friends.\n * @param {Object} obj containing corner icon urls and settings.\n */\n\n customizeCornerIcons: function(obj) {\n this.customiseCornerIcons(obj);\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n\n drawControls: function(ctx) {\n if (!this.hasControls) {\n return this;\n }\n\n var wh = this._calculateCurrentDimensions(),\n width = wh.x,\n height = wh.y,\n scaleOffset = this.cornerSize,\n left = -(width + scaleOffset) / 2,\n top = -(height + scaleOffset) / 2,\n methodName;\n\n if (!this.useCustomIcons) {\n ctx.lineWidth = 1;\n ctx.globalAlpha = this.isMoving\n ? this.borderOpacityWhenMoving\n : 1;\n ctx.strokeStyle = ctx.fillStyle = this.cornerColor;\n\n if (!this.transparentCorners) {\n ctx.strokeStyle = this.cornerStrokeColor;\n }\n\n methodName = this.transparentCorners ? 'stroke' : 'fill';\n } else {\n methodName = 'drawImage';\n }\n\n ctx.save();\n this._setLineDash(ctx, this.cornerDashArray, null);\n\n // top-left\n this._drawControl(\n 'tl',\n ctx,\n methodName,\n left,\n top,\n this.tlIcon,\n this.tlSettings\n );\n\n // top-right\n this._drawControl(\n 'tr',\n ctx,\n methodName,\n left + width,\n top,\n this.trIcon,\n this.trSettings\n );\n\n // bottom-left\n this._drawControl(\n 'bl',\n ctx,\n methodName,\n left,\n top + height,\n this.blIcon,\n this.blSettings\n );\n\n // bottom-right\n this._drawControl(\n 'br',\n ctx,\n methodName,\n left + width,\n top + height,\n this.brIcon,\n this.brSettings\n );\n\n if (!this.get('lockUniScaling')) {\n // middle-top\n this._drawControl(\n 'mt',\n ctx,\n methodName,\n left + width / 2,\n top,\n this.mtIcon,\n this.mtSettings\n );\n\n // middle-bottom\n this._drawControl(\n 'mb',\n ctx,\n methodName,\n left + width / 2,\n top + height,\n this.mbIcon,\n this.mbSettings\n );\n\n // middle-right\n this._drawControl(\n 'mr',\n ctx,\n methodName,\n left + width,\n top + height / 2,\n this.mrIcon,\n this.mrSettings\n );\n\n // middle-left\n this._drawControl(\n 'ml',\n ctx,\n methodName,\n left,\n top + height / 2,\n this.mlIcon,\n this.mlSettings\n );\n }\n\n // middle-top-rotate\n if (this.hasRotatingPoint) {\n this._drawControl(\n 'mtr',\n ctx,\n methodName,\n left + width / 2,\n top - this.rotatingPointOffset,\n this.mtrIcon,\n this.mtrSettings\n );\n }\n\n ctx.restore();\n\n return this;\n },\n\n /** Draw controls either with background-shape and color (transparency) or plain image (modified core method)\n * @private\n * {string} icon url of the control\n */\n\n _drawControl: function(\n control,\n ctx,\n methodName,\n left,\n top,\n icon,\n settings\n ) {\n if (!this.isControlVisible(control)) {\n return;\n }\n\n var size = this.cornerSize,\n cornerStroke = this.cornerStrokeColor || 'transparent',\n cornerBG = this.cornerBackgroundColor || 'black',\n cornerShape = this.cornerShape || 'rect',\n cornerPadding =\n typeof this.cornerPadding === 'number'\n ? this.cornerPadding\n : 10;\n\n if (settings) {\n if (settings.cornerSize) {\n // Set the size, and also recalc left and top\n left = left + size / 2 - settings.cornerSize / 2;\n top = top + size / 2 - settings.cornerSize / 2;\n size = settings.cornerSize;\n }\n cornerShape = settings.cornerShape || cornerShape;\n cornerBG = settings.cornerBackgroundColor || cornerBG;\n cornerPadding =\n typeof settings.cornerPadding === 'number'\n ? settings.cornerPadding\n : cornerPadding;\n cornerStroke = settings.cornerStrokeColor || cornerStroke;\n }\n\n if (this.useCustomIcons) {\n if (cornerShape) {\n ctx.globalAlpha = 1;\n ctx.fillStyle = cornerBG;\n ctx.lineWidth = 1;\n ctx.strokeStyle = cornerStroke;\n switch (cornerShape) {\n case 'rect':\n ctx.fillRect(left, top, size, size);\n\n if (cornerStroke) {\n ctx.strokeRect(left, top, size, size);\n }\n\n break;\n case 'circle':\n ctx.beginPath();\n ctx.arc(\n left + size / 2,\n top + size / 2,\n size / 2,\n 0,\n 2 * Math.PI\n );\n ctx.fill();\n\n if (cornerStroke) {\n ctx.stroke();\n }\n\n ctx.closePath();\n break;\n }\n\n if (icon !== undefined) {\n ctx[methodName](\n icon,\n left + cornerPadding / 2,\n top + cornerPadding / 2,\n size - cornerPadding,\n size - cornerPadding\n );\n }\n } else {\n if (icon !== undefined) {\n ctx[methodName](icon, left, top, size, size);\n }\n }\n } else {\n isVML() ||\n this.transparentCorners ||\n ctx.clearRect(left, top, size, size);\n ctx[methodName + 'Rect'](left, top, size, size);\n if (!this.transparentCorners && cornerStroke) {\n ctx.strokeRect(left, top, size, size);\n }\n }\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords,\n newTheta = degreesToRadians(45 - this.angle);\n\n for (var point in coords) {\n /* Math.sqrt(2 * Math.pow(this.cornerSize, 2)) / 2, */\n /* 0.707106 stands for sqrt(2)/2 */\n var cornerHypotenuse = (this[point + 'Settings'] && this[point + 'Settings'].cornerSize || this.cornerSize) * 0.707106,\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta),\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta),\n x, y;\n\n x = coords[point].x;\n y = coords[point].y;\n coords[point].corner = {\n tl: {\n x: x - sinHalfOffset,\n y: y - cosHalfOffset,\n },\n tr: {\n x: x + cosHalfOffset,\n y: y - sinHalfOffset,\n },\n bl: {\n x: x - cosHalfOffset,\n y: y + sinHalfOffset,\n },\n br: {\n x: x + sinHalfOffset,\n y: y + cosHalfOffset,\n },\n };\n }\n },\n });\n\n fabric.util.object.extend(fabric.Canvas.prototype, {\n /**\n * When true, actions can be overwritten\n * @type Boolean\n * @default false\n */\n\n overwriteActions: false,\n\n /**\n * When true, cursors are fixed\n * @type Boolean\n * @default false\n */\n\n fixedCursors: false,\n\n /**\n * setter Method for actions and cursors.\n * @param {Object} obj containing corner action and cursor url/type.\n */\n\n customiseControls: function(obj) {\n var setting;\n\n for (setting in obj) {\n if (obj.hasOwnProperty(setting)) {\n if (obj[setting].action !== undefined) {\n this.overwriteActions = true;\n this.setCustomAction(setting, obj[setting].action);\n }\n\n if (obj[setting].cursor !== undefined) {\n this.fixedCursors = true;\n this.setCustomCursor(setting, obj[setting].cursor);\n }\n }\n }\n },\n\n /**\n * loads the icon image as an image src.\n * @param {Object} corner to load an icon.\n * @param action as a string.\n */\n\n setCustomAction: function(corner, action) {\n this[corner + 'Action'] = action;\n },\n\n /**\n * loads the icon image as an image src.\n * @param {Object} corner to load an icon.\n * @param cursorUrl as a string.\n */\n\n setCustomCursor: function(corner, cursorUrl) {\n this[corner + 'cursorIcon'] = cursorUrl;\n },\n\n /**\n * copy of the setter method for our american friends.\n * @param {Object} obj containing corner action and cursor url/type.\n */\n\n customizeControls: function(obj) {\n this.customiseControls(obj);\n },\n\n /**\n * @private\n */\n\n _getActionFromCorner: function(target, corner, e) {\n if (!corner) {\n return 'drag';\n }\n\n if (corner) {\n if (this[corner + 'Action'] && this.overwriteActions) {\n switch (corner) {\n case 'mtr':\n return this[corner + 'Action'] || 'rotate';\n case 'ml':\n case 'mr':\n if (e[this.altActionKey]) {\n return e[this.altActionKey]\n ? 'skewY'\n : 'scaleX';\n }\n return this[corner + 'Action'];\n case 'mt':\n case 'mb':\n if (e[this.altActionKey]) {\n return e[this.altActionKey]\n ? 'skewY'\n : 'scaleY';\n }\n return this[corner + 'Action'];\n default:\n return this[corner + 'Action'] || 'scale';\n }\n } else {\n switch (corner) {\n case 'mtr':\n return 'rotate';\n case 'ml':\n case 'mr':\n return e[this.altActionKey] ? 'skewY' : 'scaleX';\n case 'mt':\n case 'mb':\n return e[this.altActionKey] ? 'skewX' : 'scaleY';\n default:\n return 'scale';\n }\n }\n }\n\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @param {Boolean} alreadySelected\n */\n _setupCurrentTransform: function(e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e),\n corner = target._findTargetCorner(this.getPointer(e, true)),\n action = this._getActionFromCorner(target, corner, e),\n origin = this._getOriginFromCorner(target, corner);\n\n if (typeof action === 'function') {\n if (!alreadySelected) {\n return;\n }\n\n action.call(this, e, target);\n // as of fabric 1.7.11 object cache will try to slice the action to check for scale so we need to convert this to a string\n action = 'void';\n }\n\n this._currentTransform = {\n target: target,\n action: action,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n left: target.left,\n top: target.top,\n theta: degreesToRadians(target.angle),\n width: target.width * target.scaleX,\n mouseXSign: 1,\n mouseYSign: 1,\n shiftKey: e.shiftKey,\n altKey: e[this.centeredKey],\n };\n\n this._currentTransform.original = {\n left: target.left,\n top: target.top,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n originX: origin.x,\n originY: origin.y,\n };\n\n if (action === 'remove') {\n if (!alreadySelected) {\n return;\n }\n this._removeAction(e, target);\n }\n\n if (action === 'moveUp') {\n if (!alreadySelected) {\n return;\n }\n this._moveLayerUpAction(e, target);\n }\n\n if (action === 'moveDown') {\n if (!alreadySelected) {\n return;\n }\n this._moveLayerDownAction(e, target);\n }\n\n if (typeof action === 'object') {\n if (Object.keys(action)[0] === 'rotateByDegrees') {\n if (!alreadySelected) {\n return;\n }\n this._rotateByDegrees(e, target, action.rotateByDegrees);\n }\n }\n\n this._resetCurrentTransform();\n },\n\n /**\n * Custom remove object action\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n\n _removeAction: function(e, target) {\n var _this = this;\n if (\n this.getActiveObjects() &&\n this.getActiveObjects() !== 'undefined'\n ) {\n this.getActiveObjects().forEach(function(o) {\n o.off();\n _this.discardActiveObject();\n _this.remove(o);\n });\n } else {\n target.off();\n this.discardActiveObject();\n this.remove(target);\n }\n },\n\n /**\n * Custom move up object action\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n\n _moveLayerUpAction: function(e, target) {\n if (\n this.getActiveObjects() &&\n this.getActiveObjects() !== 'undefined'\n ) {\n this.getActiveObjects().forEach(function(o) {\n o.bringForward();\n });\n } else {\n target.bringForward();\n }\n },\n\n /**\n * Custom move down object action\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n\n _moveLayerDownAction: function(e, target) {\n if (\n this.getActiveObjects() &&\n this.getActiveObjects() !== 'undefined'\n ) {\n this.getActiveObjects().forEach(function(o) {\n o.sendBackwards();\n });\n } else {\n target.sendBackwards();\n }\n },\n\n /**\n * Custom move down object action\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @param {Integer} value of rotation\n */\n\n _rotateByDegrees: function(e, target, value) {\n var angle = parseInt(target.get('angle')) + value,\n needsOriginRestore = false;\n\n if (\n (target.originX !== 'center' || target.originY !== 'center') &&\n target.centeredRotation\n ) {\n this._setOriginToCenter(target);\n needsOriginRestore = true;\n }\n\n angle = angle > 360 ? angle - 360 : angle;\n\n if (\n this.getActiveObjects() &&\n this.getActiveObjects() !== 'undefined'\n ) {\n this.getActiveObjects().forEach(function(obj) {\n obj.set('angle', angle).setCoords();\n });\n } else {\n target.set('angle', angle).setCoords();\n }\n\n if (needsOriginRestore) {\n this._setCenterToOrigin(target);\n }\n\n this.renderAll();\n },\n\n /**\n * Sets either the standard behaviour cursors or if fixedCursors is true, tries to set a custom cursor\n * either by using an icon or a build-in cursor. Cursor icon extensions are matched with a regular expression.\n * @private\n * {string} corner name\n * {target} event handler of the hovered corner\n */\n getCornerCursor: function(corner, target, e) {\n var iconUrlPattern = /\\.(?:jpe?g|png|gif|jpg|jpeg|svg)$/;\n\n if (this.actionIsDisabled(corner, target, e)) {\n return this.notAllowedCursor;\n }\n\n if (this.fixedCursors && this[corner + 'cursorIcon']) {\n if (this[corner + 'cursorIcon'].match(iconUrlPattern)) {\n this.setCursor(\n 'url(' + this[corner + 'cursorIcon'] + '), auto'\n );\n } else {\n if (this[corner + 'cursorIcon'] === 'resize') {\n this.setCursor(\n this._getRotatedCornerCursor(corner, target, e)\n );\n } else {\n this.setCursor(this[corner + 'cursorIcon']);\n }\n }\n } else {\n if (corner in cursorOffset) {\n this.setCursor(\n this._getRotatedCornerCursor(corner, target, e)\n );\n } else if (corner === 'mtr' && target.hasRotatingPoint) {\n this.setCursor(this.rotationCursor);\n } else {\n this.setCursor(this.defaultCursor);\n return false;\n }\n }\n\n return false;\n },\n });\n\n if (typeof exports !== 'undefined') {\n module.exports = this;\n }\n})(window);\n","import { fabric } from 'fabric'\n\nexport default class Box {\n constructor(object) {\n this.x = object.x || 0\n this.y = object.y || 0\n this.width = object.width || 0\n this.height = object.height || 0\n this.selectable = object.selectable\n this.fabricObject = null\n this.visible = true\n this.logId = object.logId || 0\n }\n\n draw(canvas) {\n if (!this.fabricObject && this.width > 0 && this.height > 0) {\n this.fabricObject = new fabric.Rect({\n width: this.width,\n height: this.height,\n top: this.y,\n left: this.x,\n rx: 3,\n ry: 3,\n stroke: '#F9423A',\n fill: '',\n strokeWidth: 3,\n strokeUniform: true,\n hasRotatingPoint: false,\n hoverCursor: 'pointer',\n selectable: this.selectable,\n })\n canvas.add(this.fabricObject)\n this.fabricObject.model = this\n }\n }\n\n setVisible(isVisible, shapes) {\n if (shapes) {\n const index = shapes.indexOf(this)\n if (index !== -1) {\n this.visible = isVisible\n this.fabricObject.set('visible', isVisible)\n }\n }\n }\n\n remove(canvas, shapes) {\n if (shapes) {\n const index = shapes.indexOf(this)\n if (index !== -1) {\n shapes.splice(index, 1)\n }\n }\n if (this.fabricObject) {\n canvas.remove(this.fabricObject)\n }\n }\n\n shapedUpdate() {\n this.width = this.fabricObject.width * this.fabricObject.scaleX\n this.height = this.fabricObject.height * this.fabricObject.scaleY\n this.x = this.fabricObject.left\n this.y = this.fabricObject.top\n }\n}\n","export function transFromDataToBox(data, canvasElement, imageObject, doNotCheckMinimum = false) {\n const originWidth = imageObject.width\n const originHeight = imageObject.height\n data = changeCoordinateFromCenterCenterToLeftTop(data)\n checkDrawingBoundary(data, originWidth, originHeight, doNotCheckMinimum)\n\n const clientWidth = canvasElement.clientWidth\n const clientHeight = canvasElement.clientHeight\n const clientRatio = clientWidth / clientHeight\n const originRatio = originWidth / originHeight\n let startX = 0\n let startY = 0\n let ratio\n if (clientRatio > originRatio) {\n // width longer\n const w = (clientHeight * originWidth) / originHeight\n startX = clientWidth / 2 - w / 2\n ratio = clientHeight / originHeight\n } else {\n const h = (clientWidth * originHeight) / originWidth\n startY = clientHeight / 2 - h / 2\n ratio = clientWidth / originWidth\n }\n const box = {\n id: null,\n x: startX + data.x * ratio,\n y: startY + data.y * ratio,\n width: data.width * ratio,\n height: data.height * ratio,\n originX: 0,\n originY: 0,\n data: null,\n complete: true,\n }\n box.originX = box.x\n box.originY = box.y\n box.logId = data.logId\n return box\n}\n\nexport function transFromBoxToData(box, canvasElement, imageObject, logId) {\n const originWidth = imageObject.width\n const originHeight = imageObject.height\n const clientWidth = canvasElement.clientWidth\n const clientHeight = canvasElement.clientHeight\n const clientRatio = clientWidth / clientHeight\n const originRatio = originWidth / originHeight\n let startX = 0\n let startY = 0\n let ratio\n if (clientRatio > originRatio) {\n // width longer\n const w = (clientHeight * originWidth) / originHeight\n startX = clientWidth / 2 - w / 2\n ratio = originHeight / clientHeight\n } else {\n const h = (clientWidth * originHeight) / originWidth\n startY = clientHeight / 2 - h / 2\n ratio = originWidth / clientWidth\n }\n box = changeCoordinateFromLeftTopToCenterCenter(box)\n return {\n x: +((box.x - startX) * ratio).toFixed(0),\n y: +((box.y - startY) * ratio).toFixed(0),\n width: +(box.width * ratio).toFixed(0),\n height: +(box.height * ratio).toFixed(0),\n logId,\n }\n}\n\nfunction changeCoordinateFromCenterCenterToLeftTop(box) {\n return Object.assign({}, box, { x: box.x - box.width / 2, y: box.y - box.height / 2 })\n}\n\nfunction changeCoordinateFromLeftTopToCenterCenter(box) {\n return Object.assign({}, box, { x: box.x + box.width / 2, y: box.y + box.height / 2 })\n}\n\nfunction checkDrawingBoundary(box, originWidth, originHeight, doNotCheckMinimum) {\n if (!doNotCheckMinimum) {\n checDrawingMinimumSize(box)\n }\n // if log data is wrong, data is fixing\n if (box.x < 0) {\n box.width = box.width + box.x\n box.x = 0\n }\n if (box.y < 0) {\n box.height = box.height + box.y\n box.y = 0\n }\n // check boundary and modify size\n if (box.x + box.width > originWidth) {\n box.width = originWidth - box.x\n }\n if (box.y + box.height > originHeight) {\n box.height = originHeight - box.y\n }\n}\n\nfunction checDrawingMinimumSize(box) {\n // check box min size and position centerization\n if (box.width < 50) {\n let centerX = box.x + box.width / 2\n box.x = centerX - 25\n box.width = 50\n }\n if (box.height < 50) {\n let centerY = box.y + box.height / 2\n box.y = centerY - 25\n box.height = 50\n }\n}\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerFullscreenButtonMobile.vue?vue&type=style&index=0&id=b8eb2716&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{ 'mobile-full': _vm.isFullscreen },staticStyle:{\"position\":\"relative\",\"overflow\":\"hidden\"},on:{\"contextmenu\":_vm.onContextMenu,\"mousedown\":_vm.onMouseDown}},[_c('Loading',{attrs:{\"loading\":_vm.isloading && _vm.loading}}),(!_vm.monitor)?_c('div',{class:{ 'icon-draw-container': true, 'icon-draw-container--selected': _vm.isDraw || !_vm.src },on:{\"click\":_vm.clickDraw}},[_c('img',{staticClass:\"icon-draw\",attrs:{\"src\":require(\"@/assets/Icon feather-map-pin.svg\")}})]):_vm._e(),_c('canvas',{attrs:{\"id\":_vm.canvasId}}),_c('ContextMenu',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeContextMenu),expression:\"closeContextMenu\"}],attrs:{\"data\":_vm.contextmenu,\"width\":120},on:{\"mousedown\":_vm.onDownloadFrameImage}},[_vm._v(\"Save Image\")]),(_vm.src && !_vm.mobile)?_c('PlayerZoom',{attrs:{\"zoom\":_vm.zoom},on:{\"click\":_vm.onClickZoom}}):_vm._e(),(_vm.mobile && !_vm.isFullscreen)?_c('PlayerFullscreenButton',{staticClass:\"fullscreen-button\",on:{\"clickToFullscreenPlayer\":_vm.onClickFullScreenPlayer}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { fabric } from 'fabric'\n\nfunction setObjectsSelection(canvas, isSelection) {\n canvas.discardActiveObject()\n canvas.set('selection', isSelection)\n canvas.getObjects().forEach((object) => {\n if (!(object instanceof fabric.Image)) {\n if (object.model && !object.model.selectable) {\n object.setCoords()\n } else {\n object.set('selectable', isSelection)\n object.setCoords()\n }\n }\n })\n}\n\nfunction setCursor(canvas, bgImg, cursor) {\n if (canvas) {\n canvas.setCursor(cursor)\n canvas.set('defaultCursor', cursor)\n canvas.set('hoverCursor', cursor)\n }\n if (bgImg) {\n bgImg.set('defaultCursor', cursor)\n bgImg.set('hoverCursor', cursor)\n }\n}\n\nexport default {\n state: {},\n setObjectsSelection,\n setCursor,\n}\n","import { fabric } from 'fabric'\nimport GlobalControl from './GlobalControl'\n\nexport default class ZoomPanning {\n zoom = 1\n maxZoom = 5\n minZoom = 1\n isPanning = false\n lastPosX = -1\n lastPosY = -1\n canvas\n player\n bgImg\n cursor\n\n constructor(canvas, player) {\n this.canvas = canvas\n this.player = player\n }\n\n setBgImg(bgImg) {\n this.bgImg = bgImg\n this.setZoom(1)\n }\n\n setZoom(zoom) {\n this.zoom = zoom\n const { left, top } = this.canvas.getCenter()\n const pointer = { x: left, y: top }\n this.canvas.zoomToPoint(pointer, this.zoom)\n this.checkViewportBoundary()\n }\n\n processZoom(e) {\n if (e.e.deltaY > 0 && this.maxZoom > this.zoom) {\n this.zoom += 0.1\n this.zoom = +this.zoom.toFixed(1)\n this.canvas.zoomToPoint(e.pointer, this.zoom)\n } else if (this.minZoom < this.zoom) {\n this.zoom -= 0.1\n this.zoom = +this.zoom.toFixed(1)\n this.canvas.zoomToPoint(e.pointer, this.zoom)\n }\n e.e.preventDefault()\n e.e.stopPropagation()\n this.checkViewportBoundary()\n }\n\n processAltKey(e, dragLeftButton = false) {\n if ((e.e.altKey || dragLeftButton) && e.e.type === 'mousedown' && e.e.button === 0) {\n GlobalControl.setObjectsSelection(this.canvas, false)\n this.cursor = 'grab'\n GlobalControl.setCursor(this.canvas, this.bgImg, this.cursor)\n this.isPanning = true\n this.lastPosX = e.e.clientX\n this.lastPosY = e.e.clientY\n } else if (this.isPanning && e.e.type === 'mousemove') {\n var vpt = this.canvas.viewportTransform\n vpt[4] += e.e.clientX - this.lastPosX\n vpt[5] += e.e.clientY - this.lastPosY\n this.lastPosX = e.e.clientX\n this.lastPosY = e.e.clientY\n if (this.cursor !== 'grabbing') {\n this.cursor = 'grabbing'\n GlobalControl.setCursor(this.canvas, this.bgImg, this.cursor)\n }\n this.checkViewportBoundary()\n } else if (e.e.type === 'mouseup') {\n if (this.isPanning && !this.player.isPlay) {\n GlobalControl.setObjectsSelection(this.canvas, true)\n }\n this.isPanning = false\n if (e.e.altKey || dragLeftButton) {\n this.cursor = 'grab'\n } else {\n this.cursor = 'default'\n }\n GlobalControl.setCursor(this.canvas, this.bgImg, this.cursor)\n }\n }\n\n /**\n * @private\n */\n checkViewportBoundary() {\n if (this.bgImg) {\n let vpt = this.canvas.viewportTransform\n let cw = this.canvas.getWidth()\n let ch = this.canvas.getHeight()\n let bgw = +this.bgImg.getScaledWidth().toFixed()\n let bgh = +this.bgImg.getScaledHeight().toFixed()\n let offsetX = ((cw - bgw) / 2) * this.zoom\n let offsetY = ((ch - bgh) / 2) * this.zoom\n if (this.zoom <= 1) {\n vpt[4] = 0\n vpt[5] = 0\n } else {\n // over left\n if (vpt[4] > -offsetX) {\n vpt[4] = -offsetX\n }\n // over up\n if (vpt[5] > -offsetY) {\n vpt[5] = -offsetY\n }\n // over right\n if (vpt[4] < cw - bgw * this.zoom - offsetX) {\n vpt[4] = cw - bgw * this.zoom - offsetX\n }\n // over down\n if (vpt[5] < ch - bgh * this.zoom - offsetY) {\n vpt[5] = ch - bgh * this.zoom - offsetY\n }\n }\n }\n }\n}\n","import { fabric } from 'fabric'\nimport GlobalControl from './GlobalControl'\n\nexport default class Player {\n canvas\n images = []\n imagePath = []\n imageCache = new Map()\n IMAGE_CACHE_SIZE = 150\n isPlay = false\n isPause = false\n playingIndex = 0\n now = 0\n then = 0\n startTime = 0\n elapsed = 0\n FPS_INTERVAL = 1000 / 10\n stopCallback\n animationRequest\n\n constructor(canvas) {\n this.canvas = canvas\n }\n\n play(images, startCallback, stopCallback, { speed = 0, updateFrameCallback }) {\n this.imagePath = images\n this.stopCallback = stopCallback\n this.updateFrameCallback = updateFrameCallback\n if (speed) {\n this.FPS_INTERVAL = speed\n }\n if (!this.isPlay && images && images.length) {\n this.isPause = false\n this.isPlay = true\n return Promise.all(images.map((imagePath) => this.loadImage(imagePath))).then((imageObjs) => {\n if (this.isPlay) {\n this.images = imageObjs.filter((image) => {\n if (image) {\n this.fitCanvas(image)\n }\n return !!image\n })\n this.canvas.remove(...this.images)\n this.canvas.add(...this.images)\n const loadedImageSrc = this.images.map((image) => image.getSrc())\n startCallback && startCallback(loadedImageSrc)\n this.startAnimation()\n } else {\n this.stop(true)\n }\n })\n } else if (this.isPlay && this.isPause) {\n // nothing\n return Promise.resolve()\n } else {\n return Promise.resolve(this.stop(true))\n }\n }\n\n pause(playingIndex) {\n // console.log('Player$pause', playingIndex)\n this.isPlay = false\n this.isPause = true\n if (playingIndex !== undefined) {\n // console.log('Player$pause$playingIndex')\n this.canvas.add(...this.images)\n this.images.forEach((image) => image.set('visible', false))\n this.playingIndex = playingIndex\n this.updateFrameCallback && this.updateFrameCallback(this.playingIndex, false)\n this.images[this.playingIndex] && this.images[this.playingIndex].set('visible', true)\n this.canvas.requestRenderAll()\n }\n }\n\n stop(isInit, isResize) {\n // console.log('Player$stop')\n if (this.isPlay && this.stopCallback) {\n // console.log('Player$stop$stopCallback')\n this.stopCallback()\n }\n this.isPlay = false\n this.isPause = false\n if (isInit) {\n // console.log('Player$stop$init', this.playingIndex)\n this.playingIndex = 0\n this.updateFrameCallback && this.updateFrameCallback(this.playingIndex, isResize)\n this.images.forEach((image) => image.set('visible', false))\n }\n cancelAnimationFrame(this.animationRequest)\n this.canvas.remove(...this.images)\n GlobalControl.setObjectsSelection(this.canvas, true)\n this.manageCacheSize()\n }\n\n /**\n * @private\n */\n startAnimation() {\n GlobalControl.setObjectsSelection(this.canvas, false)\n this.then = Date.now()\n this.startTime = this.then\n const performAnimation = () => {\n this.now = Date.now()\n this.elapsed = this.now - this.then\n if (this.elapsed > this.FPS_INTERVAL) {\n this.then = this.now - (this.elapsed % this.FPS_INTERVAL)\n if (this.images[this.playingIndex - 1]) {\n this.images[this.playingIndex - 1].set('visible', false)\n this.canvas.requestRenderAll()\n }\n if (this.images[this.playingIndex]) {\n this.images[this.playingIndex].set('visible', true)\n this.canvas.requestRenderAll()\n // console.log('Player$startAnimation', this.playingIndex)\n this.updateFrameCallback(this.playingIndex, false)\n } else {\n this.stop(true)\n }\n if (this.isPlay && !this.isPause) {\n this.playingIndex++\n } else if (this.isPause) {\n // nothing\n } else {\n this.stop(true)\n }\n }\n if (this.isPlay) {\n this.animationRequest = fabric.util.requestAnimFrame(performAnimation)\n }\n }\n this.animationRequest = fabric.util.requestAnimFrame(performAnimation)\n }\n\n /**\n * @private\n */\n loadImage(url) {\n if (this.imageCache.has(url)) {\n this.imageCache.get(url).hit++\n this.imageCache.get(url).date = Date.now()\n return Promise.resolve(this.imageCache.get(url).image)\n } else {\n return new Promise((resolve) => {\n fabric.Image.fromURL(url, (image) => {\n if (image.width && image.height) {\n image.set('selectable', false)\n image.set('hoverCursor', 'default')\n image.set('visible', false)\n this.cacheImages(url, image)\n resolve(image)\n } else {\n // load fail\n resolve()\n }\n })\n })\n }\n }\n\n /**\n * @private\n */\n cacheImages(url, image) {\n this.imageCache.set(url, { hit: 0, date: Date.now(), image })\n }\n\n /**\n * @private\n */\n manageCacheSize() {\n // restirct cache\n if (this.imageCache.size > this.IMAGE_CACHE_SIZE) {\n const cachedImages = []\n for (const entry of this.imageCache.entries()) {\n cachedImages.push(entry)\n }\n // select hit & date is low\n cachedImages.sort((a, b) => a[1].hit - b[1].hit)\n cachedImages.sort((a, b) => a[1].date - b[1].date)\n const removeItems = cachedImages.slice(0, this.imageCache.size - this.IMAGE_CACHE_SIZE).filter((item) => !this.imagePath.includes(item[0]))\n const removeImages = removeItems.map((item) => item[1].image)\n // console.log('remove caches ', removeImages.length)\n this.canvas.remove(...removeImages)\n removeItems.forEach((item) => {\n this.imageCache.delete(item[0])\n item[1].image.dispose()\n })\n }\n }\n\n /**\n * @private\n */\n fitCanvas(obj) {\n const canvasW = this.canvas.get('width')\n const canvasH = this.canvas.get('height')\n const ratioW = canvasW / obj.width\n const ratioH = canvasH / obj.height\n if (ratioW < ratioH) {\n obj.scale(ratioW)\n } else {\n obj.scale(ratioH)\n }\n this.canvas.centerObject(obj)\n }\n}\n","import { fabric } from 'fabric'\nimport 'fabric-customise-controls'\n\nexport class CustomiseControls {\n constructor(canvas) {\n fabric.Canvas.prototype.customiseControls({\n tr: {\n action: (e, target) => {\n target.model.remove(canvas.canvas, canvas.shapes)\n canvas.updateEmitter.emit('update', canvas.toJson())\n },\n cursor: 'pointer',\n },\n function() {\n this.canvas.requestRenderAll()\n },\n })\n\n fabric.Object.prototype.customiseCornerIcons({\n settings: {\n cornerBackgroundColor: '#fff',\n cornerSize: 5,\n },\n tr: {\n icon: require('../../assets/icon_close-white.svg'),\n settings: {\n cornerSize: 18,\n cornerShape: 'circle',\n cornerBackgroundColor: '#30FFFF',\n cornerPadding: 8,\n },\n },\n function() {\n this.canvas.requestRenderAll()\n },\n })\n }\n}\n","import { fabric } from 'fabric'\nimport ZoomPanning from './ZoomPanning'\nimport Player from './Player.js'\nimport Box from './Box'\nimport { EventEmitter } from 'events'\nimport { transFromDataToBox, transFromBoxToData } from './util'\nimport { CustomiseControls } from './CustomiseControls'\nimport GlobalControl from './GlobalControl'\n\nexport default class Canvas {\n canvas\n canvasElement\n scale = 1\n bgImgPath\n bgImg\n zoomPanning\n player\n resize$\n shapes = []\n backupJson\n customiseControls\n downX\n downY\n isDraw = false\n updateEmitter = new EventEmitter()\n active = true\n dragLeftButton = false\n cursor\n intervalCheckCanvasSize\n resizeTimeout\n currentLogId = 0\n\n constructor(canvasElement, active = true) {\n this.canvasElement = canvasElement\n this.active = active\n this.initialize(canvasElement)\n }\n\n /**\n * @private\n */\n initialize(canvasElement) {\n this.canvas = new fabric.Canvas(canvasElement, {\n width: canvasElement.parentNode.clientWidth,\n height: canvasElement.parentNode.clientHeight,\n hasRotatingPoint: false,\n })\n this.player = new Player(this.canvas)\n this.zoomPanning = new ZoomPanning(this.canvas, this.player)\n this.customiseControls = new CustomiseControls(this)\n if (this.active) {\n if (this.active !== true && this.active.selectable) {\n fabric.Object.prototype.hasControls = true\n fabric.Object.prototype.evented = true\n }\n if (this.active === true || (this.active !== true && this.active.wheel)) {\n this.canvas.on('mouse:wheel', this.onMouseWheel.bind(this))\n }\n if (this.active !== true && this.active.dragLeftButton) {\n this.dragLeftButton = true\n }\n this.canvas.on('mouse:down:before', this.onMouseDownBefore.bind(this))\n this.canvas.on('mouse:down', this.onMouseDown.bind(this))\n this.canvas.on('mouse:move', this.onMouseMove.bind(this))\n this.canvas.on('mouse:up', this.onMouseUp.bind(this))\n } else {\n fabric.Object.prototype.hasControls = false\n fabric.Object.prototype.evented = false\n this.canvas.selectionBorderColor = 'rgba(255, 255, 255, 0)'\n this.canvas.selectionColor = 'rgba(255, 255, 255, 0)'\n }\n this.registerOnResize()\n this.updateEmitter.emit('resizeInFullscreen')\n if (this.active) {\n fabric.Object.prototype.evented = true\n fabric.Object.prototype.hasControls = true\n // this.canvas.requestRenderAll()\n }\n }\n\n /**\n * @private\n */\n onMouseWheel(e) {\n this.zoomPanning.processZoom(e)\n this.canvas.requestRenderAll()\n }\n\n /**\n * @private\n */\n onMouseDownBefore(e) {\n this.zoomPanning.processAltKey(e, this.dragLeftButton)\n }\n\n /**\n * @private\n */\n onMouseDown(e) {\n this.downX = e.absolutePointer.x\n this.downY = e.absolutePointer.y\n }\n\n /**\n * @private\n */\n onMouseMove(e) {\n this.zoomPanning.processAltKey(e, this.dragLeftButton)\n this.canvas.requestRenderAll()\n }\n\n /**\n * @private\n */\n onMouseUp(e) {\n if (!this.zoomPanning.isPanning) {\n // edit\n if (!this.isDraw && e.transform && e.transform.action) {\n if (e.transform.action.startsWith('scale') || e.transform.action.startsWith('drag')) {\n e.target.model.shapedUpdate()\n this.updateEmitter.emit('update', this.toJson())\n }\n }\n\n // draw\n const width = Math.abs(e.absolutePointer.x - this.downX)\n const height = Math.abs(e.absolutePointer.y - this.downY)\n\n if (this.isDraw && width && height) {\n if (this.canvas.getActiveObject()) {\n this.canvas.discardActiveObject()\n }\n const box = new Box({\n x: this.downX < e.absolutePointer.x ? this.downX : e.absolutePointer.x,\n y: this.downY < e.absolutePointer.y ? this.downY : e.absolutePointer.y,\n width,\n height,\n selectable: this.active === true || this.active.selectable,\n })\n this.shapes.push(box)\n box.draw(this.canvas)\n this.canvas.discardActiveObject()\n this.updateEmitter.emit('update', this.toJson())\n }\n }\n\n if (!!this.canvas.getActiveObject() && this.canvas.getActiveObject().type === 'activeSelection') {\n this.canvas.discardActiveObject()\n }\n this.zoomPanning.processAltKey(e)\n this.canvas.requestRenderAll()\n }\n\n /**\n * @private\n */\n registerOnResize() {\n // console.log('Canvas$registerOnResize')\n if (!this.resizeHandler) {\n this.resizeHandler = () => {\n clearTimeout(this.resizeTimeout)\n // console.log('Canvas$registerOnResize$dispose')\n this.dispose(true)\n this.resizeTimeout = setTimeout(() => {\n this.reload()\n }, 500)\n }\n window.addEventListener('resize', this.resizeHandler)\n }\n }\n\n /**\n * @private\n */\n startCheckWindowSize() {\n clearTimeout(this.intervalCheckCanvasSize)\n this.intervalCheckCanvasSize = setTimeout(() => {\n if (!this.checkWindowSize()) {\n this.startCheckWindowSize()\n }\n }, 500)\n this.checkWindowSize()\n }\n\n /**\n * @private\n */\n checkWindowSize() {\n if (\n this.canvas &&\n (this.canvasElement.parentNode.parentNode.clientWidth !== this.canvasElement.clientWidth ||\n this.canvasElement.parentNode.parentNode.clientHeight !== this.canvasElement.clientHeight)\n ) {\n this.reload()\n return true\n }\n return false\n }\n\n reload() {\n // console.log('Canvas$reload')\n this.dispose()\n this.initialize(this.canvasElement)\n if (this.bgImgPath) {\n this.loadBgImage(this.bgImgPath).then(() => {\n this.setShapes(this.backupJson)\n })\n }\n }\n\n loadBgImage(url) {\n this.bgImgPath = url\n if (url) {\n return new Promise((resolve) => {\n fabric.Image.fromURL(url, (image) => {\n if (this.canvas && image.width && image.height && url == this.bgImgPath) {\n image.set('selectable', false)\n image.set('hoverCursor', 'default')\n this.fitCanvas(image)\n this.canvas.add(image)\n this.zoomPanning.setBgImg(image)\n this.bgImg = image\n this.canvas.renderAll()\n resolve(image)\n this.startCheckWindowSize()\n } else {\n // load fail\n resolve(null)\n }\n })\n })\n } else {\n return Promise.resolve(null)\n }\n }\n\n setZoom(zoom) {\n this.zoomPanning.setZoom(zoom)\n this.canvas.requestRenderAll()\n }\n\n /**\n * @private\n */\n fitCanvas(obj) {\n const canvasW = this.canvas.get('width')\n const canvasH = this.canvas.get('height')\n const ratioW = canvasW / obj.width\n const ratioH = canvasH / obj.height\n if (ratioW < ratioH) {\n obj.scale(ratioW)\n } else {\n obj.scale(ratioH)\n }\n this.canvas.centerObject(obj)\n this.updateEmitter.emit('margin-left', obj.left)\n this.scale = obj.get('scaleX')\n }\n\n play(images, stopCallback, options) {\n if (!options.drawBox) {\n this.setVisibleShapes(false)\n }\n return new Promise((resolve) => {\n this.player\n .play(\n images,\n (loadedImageSrc) => {\n if (options.drawBox) {\n this.brintToFrontShapes()\n }\n if (options.onLoadedImageSrc && typeof options.onLoadedImageSrc === 'function') {\n options.onLoadedImageSrc(loadedImageSrc)\n }\n },\n () => {\n this.brintToFrontShapes()\n this.setVisibleShapes(true)\n stopCallback && stopCallback()\n },\n options\n )\n .then(() => {\n resolve()\n })\n })\n }\n\n pause(playingIndex) {\n this.player.pause(playingIndex)\n }\n\n stop(isInit, isResize) {\n // console.log('Canvas$stop', isInit)\n this.player.stop(isInit, isResize)\n }\n\n clear(isResize) {\n if (this.canvas) {\n this.backupJson = this.toJson()\n this.shapes = []\n // console.log('Canvas$clear')\n this.stop(true, isResize)\n this.canvas.clear()\n }\n }\n\n dispose(isResize) {\n if (this.canvas) {\n clearTimeout(this.intervalCheckCanvasSize)\n // console.log('Canvas$dispose')\n this.clear(isResize)\n this.canvas.off()\n this.canvas.dispose()\n this.canvas = null\n }\n }\n\n setShapes(objects) {\n objects.forEach((object) => {\n const obj = transFromDataToBox(object, this.canvasElement, this.bgImg)\n const box = new Box({ ...obj, selectable: this.active === true || this.active.selectable })\n if (obj.logId === this.currentLogId) {\n this.shapes.push(box)\n }\n box.draw(this.canvas)\n })\n this.backupJson = this.toJson()\n }\n\n setVisibleShapes(isVisible) {\n this.shapes.forEach((shape) => {\n shape.setVisible(isVisible, this.shapes)\n })\n }\n\n brintToFrontShapes() {\n this.shapes.forEach((shape) => {\n shape.fabricObject.bringToFront()\n })\n }\n\n toJson() {\n return this.shapes.map((shape) => {\n return transFromBoxToData(shape, this.canvasElement, this.bgImg, shape.logId)\n })\n }\n\n setDraw(isDraw) {\n this.isDraw = isDraw\n if (isDraw) {\n fabric.Object.prototype.evented = false\n GlobalControl.setCursor(this.canvas, this.bgImg, 'crosshair')\n this.disabledActiveObject()\n } else {\n fabric.Object.prototype.evented = true\n GlobalControl.setCursor(this.canvas, this.bgImg, 'default')\n }\n }\n\n addUpdateHandler(handler) {\n this.updateEmitter.on('update', handler)\n }\n\n addResizeInFullscreenHandler(handler) {\n this.updateEmitter.on('resizeInFullscreen', handler)\n }\n\n addMarginLeftHandler(handler) {\n this.updateEmitter.on('margin-left', handler)\n }\n\n disabledActiveObject() {\n if (this.canvas) {\n this.canvas.discardActiveObject()\n this.canvas.requestRenderAll()\n }\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"button-fullscreen-icon-container\"},[_c('img',{attrs:{\"src\":require(\"@/assets/Mobile_FullScreen_Button.svg\"),\"width\":\"16px\"},on:{\"click\":_vm.onClickButton}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerFullscreenButtonMobile.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerFullscreenButtonMobile.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PlayerFullscreenButtonMobile.vue?vue&type=template&id=b8eb2716&scoped=true&\"\nimport script from \"./PlayerFullscreenButtonMobile.vue?vue&type=script&lang=js&\"\nexport * from \"./PlayerFullscreenButtonMobile.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PlayerFullscreenButtonMobile.vue?vue&type=style&index=0&id=b8eb2716&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b8eb2716\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n

\n
\n
\n
Save Image\n
\n\n
\n
\n\n\n\n\n\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImagePlayer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImagePlayer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ImagePlayer.vue?vue&type=template&id=6562c3da&scoped=true&\"\nimport script from \"./ImagePlayer.vue?vue&type=script&lang=js&\"\nexport * from \"./ImagePlayer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ImagePlayer.vue?vue&type=style&index=0&id=6562c3da&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6562c3da\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installDirectives from \"!../../../../node_modules/vuetify-loader/lib/runtime/installDirectives.js\"\nimport ClickOutside from 'vuetify/lib/directives/click-outside'\ninstallDirectives(component, {ClickOutside})\n","module.exports = __webpack_public_path__ + \"img/icon_close-white.0a820c33.svg\";","module.exports = __webpack_public_path__ + \"img/Mobile_FullScreen_Button.36d2f871.svg\";","module.exports = __webpack_public_path__ + \"img/Icon feather-map-pin.f4f37ece.svg\";","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--9-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--9-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--9-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--9-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImagePlayer.vue?vue&type=style&index=0&id=6562c3da&lang=scss&scoped=true&\""],"sourceRoot":""}