{"version":3,"sources":["webpack:///./image_diff/helpers/badge_helper.js","webpack:///./image_diff/helpers/comment_indicator_helper.js","webpack:///./image_diff/image_badge.js","webpack:///./image_diff/image_diff.js","webpack:///./lib/utils/image_utility.js","webpack:///./image_diff/view_types.js","webpack:///./image_diff/replaced_image_diff.js","webpack:///./commit/image_file.js","webpack:///./image_diff/helpers/index.js","webpack:///./image_diff/helpers/dom_helper.js","webpack:///./image_diff/helpers/utils_helper.js"],"names":["createImageBadge","noteId","_ref","x","y","classNames","arguments","length","undefined","buttonEl","document","createElement","concat","forEach","className","classList","add","setAttribute","dataset","style","left","top","addCommentIndicator","containerEl","innerHTML","gl","utils","spriteIcon","appendChild","defaultMeta","width","height","ImageBadge","options","_classCallCheck","this","discussionId","actual","browser","imageEl","helpers","resizeCoordinatesToImageElement","ImageDiff","el","image_diff_classCallCheck","canCreateNote","renderCommentBadge","$noteContainer","jquery_default","imageBadges","imageFrameEl","querySelector","bindEvents","element","imageClickedWrapper","imageClicked","bind","imageBlurredWrapper","removeCommentIndicator","addBadgeWrapper","addBadge","removeBadgeWrapper","removeBadge","renderBadgesWrapper","renderBadges","complete","naturalHeight","addEventListener","on","toggleCollapsed","commentIndicatorOnClick","event","customEvent","detail","selection","getTargetSelection","currentTarget","setPositionDataAttribute","showCommentIndicator","discussionsEls","querySelectorAll","_toConsumableArray","renderBadge","discussionEl","index","imageBadge","generateBadgeFromDiscussionDOM","push","coordinate","addImageCommentBadge","numberBadgeOptions","Object","assign","badgeText","addImageBadge","_event$detail","image_badge","addAvatarBadge","badgeNumber","updateDiscussionBadgeNumber","_this","indexToRemove","imageBadgeEls","badge","updatedBadgeNumber","innerText","updateDiscussionAvatarBadgeNumber","splice","remove","viewTypes","TWO_UP","SWIPE","ONION_SKIN","image_diff","_imageFrameEls","_viewModesEls","defaultViewType","imageFrameEls","_defineProperty","viewModesEl","viewModesEls","currentView","generateImageEls","_this2","imageEls","getOwnPropertyNames","viewType","_get","ReplacedImageDiff","prototype","__proto__","getPrototypeOf","call","changeToViewTwoUp","changeView","changeToViewSwipe","changeToViewOnionSkin","newView","validate","find","indicator","existingBadges","replaced_image_diff_toConsumableArray","map","setTimeout","renderNewView","removed","normalizedIndicator","image","availWidth","viewModes","ImageFile","file","image_file_classCallCheck","views","two-up","each","wrap","requestImageInfo","text","removeClass","swipe","maxHeight","maxWidth","view","$swipeWrap","$swipeBar","$swipeFrame","wrapPadding","ref","prepareFrames","css","parseInt","replace","initDraggable","e","onion-skin","dragTrackWidth","$frame","$track","$dragger","$frameAdded","framePadding","opacity","deletedWidth","deletedHeight","initViewModes","waitForImages","initView","viewMode","hasClass","activateViewMode","filter","addClass","fadeOut","fadeIn","$el","padding","callback","dragging","$body","$offsetEl","parent","off","pageX","offset","frame","img","domImg","get","naturalWidth","__webpack_exports__","commentIndicatorEl","willRemove","meta","stopPropagation","closest","focus","_ref2","_ref3","avatarBadgeEl","position","positionObject","JSON","parse","stringify","newBadgeNumber","discussionNotesEl","formEl","isCollapsed","contains","display","imageWidth","imageHeight","widthRatio","heightRatio","Math","round","firstNoteEl","id","offsetX","offsetY","actualWidth","actualHeight","normalizedX","max","min","normalizedY","initImageDiff","fileEl","diff","image_file","init","replaced_image_diff"],"mappings":"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","file":"commons~pages.projects.commit.show~pages.projects.compare.show~pages.projects.snippets.show~pages.sn~a0b736c0.d61b5787.chunk.js","sourcesContent":["export function createImageBadge(noteId, { x, y }, classNames = []) {\n const buttonEl = document.createElement('button');\n const classList = classNames.concat(['js-image-badge']);\n classList.forEach(className => buttonEl.classList.add(className));\n buttonEl.setAttribute('type', 'button');\n buttonEl.setAttribute('disabled', true);\n buttonEl.dataset.noteId = noteId;\n buttonEl.style.left = `${x}px`;\n buttonEl.style.top = `${y}px`;\n\n return buttonEl;\n}\n\nexport function addImageBadge(containerEl, { coordinate, badgeText, noteId }) {\n const buttonEl = createImageBadge(noteId, coordinate, ['badge']);\n buttonEl.innerText = badgeText;\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function addImageCommentBadge(containerEl, { coordinate, noteId }) {\n const buttonEl = createImageBadge(noteId, coordinate, ['image-comment-badge']);\n buttonEl.innerHTML = gl.utils.spriteIcon('image-comment-dark');\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function addAvatarBadge(el, event) {\n const { noteId, badgeNumber } = event.detail;\n\n // Add badge to new comment\n const avatarBadgeEl = el.querySelector(`#${noteId} .badge`);\n avatarBadgeEl.innerText = badgeNumber;\n avatarBadgeEl.classList.remove('hidden');\n}\n","export function addCommentIndicator(containerEl, { x, y }) {\n const buttonEl = document.createElement('button');\n buttonEl.classList.add('btn-transparent');\n buttonEl.classList.add('comment-indicator');\n buttonEl.setAttribute('type', 'button');\n buttonEl.style.left = `${x}px`;\n buttonEl.style.top = `${y}px`;\n\n buttonEl.innerHTML = gl.utils.spriteIcon('image-comment-dark');\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function removeCommentIndicator(imageFrameEl) {\n const commentIndicatorEl = imageFrameEl.querySelector('.comment-indicator');\n const imageEl = imageFrameEl.querySelector('img');\n const willRemove = !!commentIndicatorEl;\n let meta = {};\n\n if (willRemove) {\n meta = {\n x: parseInt(commentIndicatorEl.style.left, 10),\n y: parseInt(commentIndicatorEl.style.top, 10),\n image: {\n width: imageEl.width,\n height: imageEl.height,\n },\n };\n\n commentIndicatorEl.remove();\n }\n\n return Object.assign({}, meta, {\n removed: willRemove,\n });\n}\n\nexport function showCommentIndicator(imageFrameEl, coordinate) {\n const { x, y } = coordinate;\n const commentIndicatorEl = imageFrameEl.querySelector('.comment-indicator');\n\n if (commentIndicatorEl) {\n commentIndicatorEl.style.left = `${x}px`;\n commentIndicatorEl.style.top = `${y}px`;\n } else {\n addCommentIndicator(imageFrameEl, coordinate);\n }\n}\n\nexport function commentIndicatorOnClick(event) {\n // Prevent from triggering onAddImageDiffNote in notes.js\n event.stopPropagation();\n\n const buttonEl = event.currentTarget;\n const diffViewerEl = buttonEl.closest('.diff-viewer');\n const textareaEl = diffViewerEl.querySelector('.note-container .note-textarea');\n textareaEl.focus();\n}\n","import imageDiffHelper from './helpers/index';\n\nconst defaultMeta = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n};\n\nexport default class ImageBadge {\n constructor(options) {\n const { noteId, discussionId } = options;\n\n this.actual = options.actual || defaultMeta;\n this.browser = options.browser || defaultMeta;\n this.noteId = noteId;\n this.discussionId = discussionId;\n\n if (options.imageEl && !options.browser) {\n this.browser = imageDiffHelper.resizeCoordinatesToImageElement(options.imageEl, this.actual);\n }\n }\n}\n","import $ from 'jquery';\nimport imageDiffHelper from './helpers/index';\nimport ImageBadge from './image_badge';\nimport { isImageLoaded } from '../lib/utils/image_utility';\n\nexport default class ImageDiff {\n constructor(el, options) {\n this.el = el;\n this.canCreateNote = !!(options && options.canCreateNote);\n this.renderCommentBadge = !!(options && options.renderCommentBadge);\n this.$noteContainer = $('.note-container', this.el);\n this.imageBadges = [];\n }\n\n init() {\n this.imageFrameEl = this.el.querySelector('.diff-file .js-image-frame');\n this.imageEl = this.imageFrameEl.querySelector('img');\n\n this.bindEvents();\n }\n\n bindEvents() {\n this.imageClickedWrapper = this.imageClicked.bind(this);\n this.imageBlurredWrapper = imageDiffHelper.removeCommentIndicator.bind(null, this.imageFrameEl);\n this.addBadgeWrapper = this.addBadge.bind(this);\n this.removeBadgeWrapper = this.removeBadge.bind(this);\n this.renderBadgesWrapper = this.renderBadges.bind(this);\n\n // Render badges\n if (isImageLoaded(this.imageEl)) {\n this.renderBadges();\n } else {\n this.imageEl.addEventListener('load', this.renderBadgesWrapper);\n }\n\n // jquery makes the event delegation here much simpler\n this.$noteContainer.on('click', '.js-diff-notes-toggle', imageDiffHelper.toggleCollapsed);\n $(this.el).on('click', '.comment-indicator', imageDiffHelper.commentIndicatorOnClick);\n\n if (this.canCreateNote) {\n this.el.addEventListener('click.imageDiff', this.imageClickedWrapper);\n this.el.addEventListener('blur.imageDiff', this.imageBlurredWrapper);\n this.el.addEventListener('addBadge.imageDiff', this.addBadgeWrapper);\n this.el.addEventListener('removeBadge.imageDiff', this.removeBadgeWrapper);\n }\n }\n\n imageClicked(event) {\n const customEvent = event.detail;\n const selection = imageDiffHelper.getTargetSelection(customEvent);\n const el = customEvent.currentTarget;\n\n imageDiffHelper.setPositionDataAttribute(el, selection.actual);\n imageDiffHelper.showCommentIndicator(this.imageFrameEl, selection.browser);\n }\n\n renderBadges() {\n const discussionsEls = this.el.querySelectorAll('.note-container .discussion-notes .notes');\n [...discussionsEls].forEach(this.renderBadge.bind(this));\n }\n\n renderBadge(discussionEl, index) {\n const imageBadge = imageDiffHelper\n .generateBadgeFromDiscussionDOM(this.imageFrameEl, discussionEl);\n\n this.imageBadges.push(imageBadge);\n\n const options = {\n coordinate: imageBadge.browser,\n noteId: imageBadge.noteId,\n };\n\n if (this.renderCommentBadge) {\n imageDiffHelper.addImageCommentBadge(this.imageFrameEl, options);\n } else {\n const numberBadgeOptions = Object.assign({}, options, {\n badgeText: index + 1,\n });\n\n imageDiffHelper.addImageBadge(this.imageFrameEl, numberBadgeOptions);\n }\n }\n\n addBadge(event) {\n const { x, y, width, height, noteId, discussionId } = event.detail;\n const badgeText = this.imageBadges.length + 1;\n const imageBadge = new ImageBadge({\n actual: {\n x,\n y,\n width,\n height,\n },\n imageEl: this.imageFrameEl.querySelector('img'),\n noteId,\n discussionId,\n });\n\n this.imageBadges.push(imageBadge);\n\n imageDiffHelper.addImageBadge(this.imageFrameEl, {\n coordinate: imageBadge.browser,\n badgeText,\n noteId,\n });\n\n imageDiffHelper.addAvatarBadge(this.el, {\n detail: {\n noteId,\n badgeNumber: badgeText,\n },\n });\n\n const discussionEl = this.el.querySelector(`#discussion_${discussionId}`);\n imageDiffHelper.updateDiscussionBadgeNumber(discussionEl, badgeText);\n }\n\n removeBadge(event) {\n const { badgeNumber } = event.detail;\n const indexToRemove = badgeNumber - 1;\n const imageBadgeEls = this.imageFrameEl.querySelectorAll('.badge');\n\n if (this.imageBadges.length !== badgeNumber) {\n // Cascade badges count numbers for (avatar badges + image badges)\n this.imageBadges.forEach((badge, index) => {\n if (index > indexToRemove) {\n const { discussionId } = badge;\n const updatedBadgeNumber = index;\n const discussionEl = this.el.querySelector(`#discussion_${discussionId}`);\n\n imageBadgeEls[index].innerText = updatedBadgeNumber;\n\n imageDiffHelper.updateDiscussionBadgeNumber(discussionEl, updatedBadgeNumber);\n imageDiffHelper.updateDiscussionAvatarBadgeNumber(discussionEl, updatedBadgeNumber);\n }\n });\n }\n\n this.imageBadges.splice(indexToRemove, 1);\n\n const imageBadgeEl = imageBadgeEls[indexToRemove];\n imageBadgeEl.remove();\n }\n}\n","/* eslint-disable import/prefer-default-export */\n\nexport function isImageLoaded(element) {\n return element.complete && element.naturalHeight !== 0;\n}\n","export const viewTypes = {\n TWO_UP: 'TWO_UP',\n SWIPE: 'SWIPE',\n ONION_SKIN: 'ONION_SKIN',\n};\n\nexport function isValidViewType(validate) {\n return !!Object.getOwnPropertyNames(viewTypes).find(viewType => viewType === validate);\n}\n","import imageDiffHelper from './helpers/index';\nimport { viewTypes, isValidViewType } from './view_types';\nimport ImageDiff from './image_diff';\n\nexport default class ReplacedImageDiff extends ImageDiff {\n init(defaultViewType = viewTypes.TWO_UP) {\n this.imageFrameEls = {\n [viewTypes.TWO_UP]: this.el.querySelector('.two-up .js-image-frame'),\n [viewTypes.SWIPE]: this.el.querySelector('.swipe .js-image-frame'),\n [viewTypes.ONION_SKIN]: this.el.querySelector('.onion-skin .js-image-frame'),\n };\n\n const viewModesEl = this.el.querySelector('.view-modes-menu');\n this.viewModesEls = {\n [viewTypes.TWO_UP]: viewModesEl.querySelector('.two-up'),\n [viewTypes.SWIPE]: viewModesEl.querySelector('.swipe'),\n [viewTypes.ONION_SKIN]: viewModesEl.querySelector('.onion-skin'),\n };\n\n this.currentView = defaultViewType;\n this.generateImageEls();\n this.bindEvents();\n }\n\n generateImageEls() {\n this.imageEls = {};\n\n const viewTypeNames = Object.getOwnPropertyNames(viewTypes);\n viewTypeNames.forEach((viewType) => {\n this.imageEls[viewType] = this.imageFrameEls[viewType].querySelector('img');\n });\n }\n\n bindEvents() {\n super.bindEvents();\n\n this.changeToViewTwoUp = this.changeView.bind(this, viewTypes.TWO_UP);\n this.changeToViewSwipe = this.changeView.bind(this, viewTypes.SWIPE);\n this.changeToViewOnionSkin = this.changeView.bind(this, viewTypes.ONION_SKIN);\n\n this.viewModesEls[viewTypes.TWO_UP].addEventListener('click', this.changeToViewTwoUp);\n this.viewModesEls[viewTypes.SWIPE].addEventListener('click', this.changeToViewSwipe);\n this.viewModesEls[viewTypes.ONION_SKIN].addEventListener('click', this.changeToViewOnionSkin);\n }\n\n get imageEl() {\n return this.imageEls[this.currentView];\n }\n\n get imageFrameEl() {\n return this.imageFrameEls[this.currentView];\n }\n\n changeView(newView) {\n if (!isValidViewType(newView)) {\n return;\n }\n\n const indicator = imageDiffHelper.removeCommentIndicator(this.imageFrameEl);\n\n this.currentView = newView;\n\n // Clear existing badges on new view\n const existingBadges = this.imageFrameEl.querySelectorAll('.badge');\n [...existingBadges].map(badge => badge.remove());\n\n // Remove existing references to old view image badges\n this.imageBadges = [];\n\n // Image_file.js has a fade animation of 200ms for loading the view\n // Need to wait an additional 250ms for the images to be displayed\n // on window in order to re-normalize their dimensions\n setTimeout(this.renderNewView.bind(this, indicator), 250);\n }\n\n renderNewView(indicator) {\n // Generate badge coordinates on new view\n this.renderBadges();\n\n // Re-render indicator in new view\n if (indicator.removed) {\n const normalizedIndicator = imageDiffHelper\n .resizeCoordinatesToImageElement(this.imageEl, {\n x: indicator.x,\n y: indicator.y,\n width: indicator.image.width,\n height: indicator.image.height,\n });\n imageDiffHelper.showCommentIndicator(this.imageFrameEl, normalizedIndicator);\n }\n }\n}\n","/* eslint-disable func-names, space-before-function-paren, wrap-iife, no-var, no-use-before-define, prefer-arrow-callback, no-else-return, consistent-return, prefer-template, quotes, one-var, one-var-declaration-per-line, no-unused-vars, no-return-assign, comma-dangle, quote-props, no-unused-expressions, no-sequences, object-shorthand, max-len */\n\nimport $ from 'jquery';\n\n// Width where images must fits in, for 2-up this gets divided by 2\nconst availWidth = 900;\nconst viewModes = ['two-up', 'swipe'];\n\nexport default class ImageFile {\n constructor(file) {\n this.file = file;\n this.requestImageInfo($('.two-up.view .frame.deleted img', this.file), (function(_this) {\n return function(deletedWidth, deletedHeight) {\n return _this.requestImageInfo($('.two-up.view .frame.added img', _this.file), function(width, height) {\n _this.initViewModes();\n\n // Load two-up view after images are loaded\n // so that we can display the correct width and height information\n const $images = $('.two-up.view img', _this.file);\n\n $images.waitForImages(function() {\n _this.initView('two-up');\n });\n });\n };\n })(this));\n }\n\n initViewModes() {\n const viewMode = viewModes[0];\n $('.view-modes', this.file).removeClass('hide');\n $('.view-modes-menu', this.file).on('click', 'li', (function(_this) {\n return function(event) {\n if (!$(event.currentTarget).hasClass('active')) {\n return _this.activateViewMode(event.currentTarget.className);\n }\n };\n })(this));\n return this.activateViewMode(viewMode);\n }\n\n activateViewMode(viewMode) {\n $('.view-modes-menu li', this.file).removeClass('active').filter(\".\" + viewMode).addClass('active');\n return $(\".view:visible:not(.\" + viewMode + \")\", this.file).fadeOut(200, (function(_this) {\n return function() {\n $(\".view.\" + viewMode, _this.file).fadeIn(200);\n return _this.initView(viewMode);\n };\n })(this));\n }\n\n initView(viewMode) {\n return this.views[viewMode].call(this);\n }\n // eslint-disable-next-line class-methods-use-this\n initDraggable($el, padding, callback) {\n var dragging = false;\n var $body = $('body');\n var $offsetEl = $el.parent();\n\n $el.off('mousedown').on('mousedown', function() {\n dragging = true;\n $body.css('user-select', 'none');\n });\n\n $body.off('mouseup').off('mousemove').on('mouseup', function() {\n dragging = false;\n $body.css('user-select', '');\n })\n .on('mousemove', function(e) {\n var left;\n if (!dragging) return;\n\n left = e.pageX - ($offsetEl.offset().left + padding);\n\n callback(e, left);\n });\n }\n\n prepareFrames(view) {\n var maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n $('.frame', view).each((function(_this) {\n return function(index, frame) {\n var height, width;\n width = $(frame).width();\n height = $(frame).height();\n maxWidth = width > maxWidth ? width : maxWidth;\n return maxHeight = height > maxHeight ? height : maxHeight;\n };\n })(this)).css({\n width: maxWidth,\n height: maxHeight\n });\n return [maxWidth, maxHeight];\n }\n // eslint-disable-next-line\n views = {\n 'two-up': function() {\n return $('.two-up.view .wrap', this.file).each((function(_this) {\n return function(index, wrap) {\n $('img', wrap).each(function() {\n var currentWidth;\n currentWidth = $(this).width();\n if (currentWidth > availWidth / 2) {\n return $(this).width(availWidth / 2);\n }\n });\n return _this.requestImageInfo($('img', wrap), function(width, height) {\n $('.image-info .meta-width', wrap).text(width + \"px\");\n $('.image-info .meta-height', wrap).text(height + \"px\");\n return $('.image-info', wrap).removeClass('hide');\n });\n };\n })(this));\n },\n 'swipe': function() {\n var maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n return $('.swipe.view', this.file).each((function(_this) {\n return function(index, view) {\n var $swipeWrap, $swipeBar, $swipeFrame, wrapPadding, ref;\n ref = _this.prepareFrames(view), maxWidth = ref[0], maxHeight = ref[1];\n $swipeFrame = $('.swipe-frame', view);\n $swipeWrap = $('.swipe-wrap', view);\n $swipeBar = $('.swipe-bar', view);\n\n $swipeFrame.css({\n width: maxWidth + 16,\n height: maxHeight + 28\n });\n $swipeWrap.css({\n width: maxWidth + 1,\n height: maxHeight + 2\n });\n // Set swipeBar left position to match image frame\n $swipeBar.css({\n left: 1\n });\n\n wrapPadding = parseInt($swipeWrap.css('right').replace('px', ''), 10);\n\n _this.initDraggable($swipeBar, wrapPadding, function(e, left) {\n if (left > 0 && left < $swipeFrame.width() - (wrapPadding * 2)) {\n $swipeWrap.width((maxWidth + 1) - left);\n $swipeBar.css('left', left);\n }\n });\n };\n })(this));\n },\n 'onion-skin': function() {\n var dragTrackWidth, maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n dragTrackWidth = $('.drag-track', this.file).width() - $('.dragger', this.file).width();\n return $('.onion-skin.view', this.file).each((function(_this) {\n return function(index, view) {\n var $frame, $track, $dragger, $frameAdded, framePadding, ref, dragging = false;\n ref = _this.prepareFrames(view), maxWidth = ref[0], maxHeight = ref[1];\n $frame = $('.onion-skin-frame', view);\n $frameAdded = $('.frame.added', view);\n $track = $('.drag-track', view);\n $dragger = $('.dragger', $track);\n\n $frame.css({\n width: maxWidth + 16,\n height: maxHeight + 28\n });\n $('.swipe-wrap', view).css({\n width: maxWidth + 1,\n height: maxHeight + 2\n });\n $dragger.css({\n left: dragTrackWidth\n });\n\n $frameAdded.css('opacity', 1);\n framePadding = parseInt($frameAdded.css('right').replace('px', ''), 10);\n\n _this.initDraggable($dragger, framePadding, function(e, left) {\n var opacity = left / dragTrackWidth;\n\n if (opacity >= 0 && opacity <= 1) {\n $dragger.css('left', left);\n $frameAdded.css('opacity', opacity);\n }\n });\n };\n })(this));\n }\n }\n\n requestImageInfo(img, callback) {\n const domImg = img.get(0);\n if (domImg) {\n if (domImg.complete) {\n return callback.call(this, domImg.naturalWidth, domImg.naturalHeight);\n } else {\n return img.on('load', (function(_this) {\n return function() {\n return callback.call(_this, domImg.naturalWidth, domImg.naturalHeight);\n };\n })(this));\n }\n }\n }\n}\n","import * as badgeHelper from './badge_helper';\nimport * as commentIndicatorHelper from './comment_indicator_helper';\nimport * as domHelper from './dom_helper';\nimport * as utilsHelper from './utils_helper';\n\nexport default {\n addCommentIndicator: commentIndicatorHelper.addCommentIndicator,\n removeCommentIndicator: commentIndicatorHelper.removeCommentIndicator,\n showCommentIndicator: commentIndicatorHelper.showCommentIndicator,\n commentIndicatorOnClick: commentIndicatorHelper.commentIndicatorOnClick,\n\n addImageBadge: badgeHelper.addImageBadge,\n addImageCommentBadge: badgeHelper.addImageCommentBadge,\n addAvatarBadge: badgeHelper.addAvatarBadge,\n\n setPositionDataAttribute: domHelper.setPositionDataAttribute,\n updateDiscussionAvatarBadgeNumber: domHelper.updateDiscussionAvatarBadgeNumber,\n updateDiscussionBadgeNumber: domHelper.updateDiscussionBadgeNumber,\n toggleCollapsed: domHelper.toggleCollapsed,\n\n resizeCoordinatesToImageElement: utilsHelper.resizeCoordinatesToImageElement,\n generateBadgeFromDiscussionDOM: utilsHelper.generateBadgeFromDiscussionDOM,\n getTargetSelection: utilsHelper.getTargetSelection,\n initImageDiff: utilsHelper.initImageDiff,\n};\n","export function setPositionDataAttribute(el, options) {\n // Update position data attribute so that the\n // new comment form can use this data for ajax request\n const { x, y, width, height } = options;\n const position = el.dataset.position;\n const positionObject = Object.assign({}, JSON.parse(position), {\n x,\n y,\n width,\n height,\n });\n\n el.setAttribute('data-position', JSON.stringify(positionObject));\n}\n\nexport function updateDiscussionAvatarBadgeNumber(discussionEl, newBadgeNumber) {\n const avatarBadgeEl = discussionEl.querySelector('.image-diff-avatar-link .badge');\n avatarBadgeEl.innerText = newBadgeNumber;\n}\n\nexport function updateDiscussionBadgeNumber(discussionEl, newBadgeNumber) {\n const discussionBadgeEl = discussionEl.querySelector('.badge');\n discussionBadgeEl.innerText = newBadgeNumber;\n}\n\nexport function toggleCollapsed(event) {\n const toggleButtonEl = event.currentTarget;\n const discussionNotesEl = toggleButtonEl.closest('.discussion-notes');\n const formEl = discussionNotesEl.querySelector('.discussion-form');\n const isCollapsed = discussionNotesEl.classList.contains('collapsed');\n\n if (isCollapsed) {\n discussionNotesEl.classList.remove('collapsed');\n } else {\n discussionNotesEl.classList.add('collapsed');\n }\n\n // Override the inline display style set in notes.js\n if (formEl && !isCollapsed) {\n formEl.style.display = 'none';\n } else if (formEl && isCollapsed) {\n formEl.style.display = 'block';\n }\n}\n","import ImageBadge from '../image_badge';\nimport ImageDiff from '../image_diff';\nimport ReplacedImageDiff from '../replaced_image_diff';\nimport ImageFile from '../../commit/image_file';\n\nexport function resizeCoordinatesToImageElement(imageEl, meta) {\n const { x, y, width, height } = meta;\n\n const imageWidth = imageEl.width;\n const imageHeight = imageEl.height;\n\n const widthRatio = imageWidth / width;\n const heightRatio = imageHeight / height;\n\n return {\n x: Math.round(x * widthRatio),\n y: Math.round(y * heightRatio),\n width: imageWidth,\n height: imageHeight,\n };\n}\n\nexport function generateBadgeFromDiscussionDOM(imageFrameEl, discussionEl) {\n const position = JSON.parse(discussionEl.dataset.position);\n const firstNoteEl = discussionEl.querySelector('.note');\n const badge = new ImageBadge({\n actual: position,\n imageEl: imageFrameEl.querySelector('img'),\n noteId: firstNoteEl.id,\n discussionId: discussionEl.dataset.discussionId,\n });\n\n return badge;\n}\n\nexport function getTargetSelection(event) {\n const containerEl = event.currentTarget;\n const imageEl = containerEl.querySelector('img');\n\n const x = event.offsetX;\n const y = event.offsetY;\n\n const width = imageEl.width;\n const height = imageEl.height;\n\n const actualWidth = imageEl.naturalWidth;\n const actualHeight = imageEl.naturalHeight;\n\n const widthRatio = actualWidth / width;\n const heightRatio = actualHeight / height;\n\n // Browser will include the frame as a clickable target,\n // which would result in potential 1px out of bounds value\n // This bound the coordinates to inside the frame\n const normalizedX = Math.max(0, x) && Math.min(x, width);\n const normalizedY = Math.max(0, y) && Math.min(y, height);\n\n return {\n browser: {\n x: normalizedX,\n y: normalizedY,\n width,\n height,\n },\n actual: {\n // Round x, y so that we don't need to deal with decimals\n x: Math.round(normalizedX * widthRatio),\n y: Math.round(normalizedY * heightRatio),\n width: actualWidth,\n height: actualHeight,\n },\n };\n}\n\nexport function initImageDiff(fileEl, canCreateNote, renderCommentBadge) {\n const options = {\n canCreateNote,\n renderCommentBadge,\n };\n let diff;\n\n // ImageFile needs to be invoked before initImageDiff so that badges\n // can mount to the correct location\n new ImageFile(fileEl); // eslint-disable-line no-new\n\n if (fileEl.querySelector('.diff-file .js-single-image')) {\n diff = new ImageDiff(fileEl, options);\n diff.init();\n } else if (fileEl.querySelector('.diff-file .js-replaced-image')) {\n diff = new ReplacedImageDiff(fileEl, options);\n diff.init();\n }\n\n return diff;\n}\n"],"sourceRoot":""}