{"version":3,"sources":["webpack:///./blob/blob_fork_suggestion.js","webpack:///./line_highlighter.js","webpack:///./blob/blob_line_permalink_updater.js","webpack:///./shortcuts_blob.js","webpack:///./pages/projects/init_blob.js","webpack:///./pages/projects/blame/show/index.js"],"names":["defaults","openButtons","forkButtons","cancelButtons","suggestionSections","actionTextPieces","BlobForkSuggestion","options","_classCallCheck","this","elementMap","Object","assign","onOpenButtonClick","bind","onCancelButtonClick","bindEvents","jquery__WEBPACK_IMPORTED_MODULE_0___default","on","forkPath","action","arguments","length","undefined","removeClass","attr","text","addClass","e","currentTarget","showSuggestionSection","hideSuggestionSection","off","__webpack_exports__","jquery__WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","LineHighlighter","highlightLineClass","fileHolderSelector","scrollFileHolder","hash","location","_hash","setHash","highlightLine","clickHandler","highlightHash","prototype","$fileHolder","newHash","range","clearHighlight","hashToRange","highlightRange","lineSelector","scrollOptions","offset","scrollTo","a","event","current","lineNumber","preventDefault","target","closest","data","shiftKey","matches","match","parseInt","i","ref","ref1","results","push","firstLineNumber","lastLineNumber","__setLocationHash__","value","history","pushState","url","document","title","lineNumberRe","blob_line_permalink_updater_updateLineNumbersOnBlobPermalinks","linksToUpdate","url_utility","test","hashUrlString","concat","Array","slice","call","forEach","permalinkButton","href","baseHref","getAttribute","setAttribute","blob_line_permalink_updater","blobContentHolder","lineNumberSelector","elementsToUpdate","updateBlameAndBlobPermalinkCb","setTimeout","addEventListener","skipResetBindings","fileBlobPermalinkUrl","ShortcutsBlob","opts","_this","_possibleConstructorReturn","__proto__","getPrototypeOf","mousetrap_default","moveToFilePermalink","shortcuts","visitUrl","line_highlighter","querySelector","querySelectorAll","fileBlobPermalinkUrlElement","shortcuts_navigation","shortcuts_blob","blob_fork_suggestion","init","blob_bundle","_pages_projects_init_blob__WEBPACK_IMPORTED_MODULE_0__"],"mappings":"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","file":"pages.projects.blame.show.91f40624.chunk.js","sourcesContent":["import $ from 'jquery';\n\nconst defaults = {\n // Buttons that will show the `suggestionSections`\n // has `data-fork-path`, and `data-action`\n openButtons: [],\n // Update the href(from `openButton` -> `data-fork-path`)\n // whenever a `openButton` is clicked\n forkButtons: [],\n // Buttons to hide the `suggestionSections`\n cancelButtons: [],\n // Section to show/hide\n suggestionSections: [],\n // Pieces of text that need updating depending on the action, `edit`, `replace`, `delete`\n actionTextPieces: [],\n};\n\nclass BlobForkSuggestion {\n constructor(options) {\n this.elementMap = Object.assign({}, defaults, options);\n this.onOpenButtonClick = this.onOpenButtonClick.bind(this);\n this.onCancelButtonClick = this.onCancelButtonClick.bind(this);\n }\n\n init() {\n this.bindEvents();\n\n return this;\n }\n\n bindEvents() {\n $(this.elementMap.openButtons).on('click', this.onOpenButtonClick);\n $(this.elementMap.cancelButtons).on('click', this.onCancelButtonClick);\n }\n\n showSuggestionSection(forkPath, action = 'edit') {\n $(this.elementMap.suggestionSections).removeClass('hidden');\n $(this.elementMap.forkButtons).attr('href', forkPath);\n $(this.elementMap.actionTextPieces).text(action);\n }\n\n hideSuggestionSection() {\n $(this.elementMap.suggestionSections).addClass('hidden');\n }\n\n onOpenButtonClick(e) {\n const forkPath = $(e.currentTarget).attr('data-fork-path');\n const action = $(e.currentTarget).attr('data-action');\n this.showSuggestionSection(forkPath, action);\n }\n\n onCancelButtonClick() {\n this.hideSuggestionSection();\n }\n\n destroy() {\n $(this.elementMap.openButtons).off('click', this.onOpenButtonClick);\n $(this.elementMap.cancelButtons).off('click', this.onCancelButtonClick);\n }\n}\n\nexport default BlobForkSuggestion;\n","/* eslint-disable func-names, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, no-use-before-define, no-underscore-dangle, no-param-reassign, prefer-template, quotes, comma-dangle, prefer-arrow-callback, consistent-return, one-var, one-var-declaration-per-line, no-else-return, max-len */\n\nimport $ from 'jquery';\n\n// LineHighlighter\n//\n// Handles single- and multi-line selection and highlight for blob views.\n//\n//\n// ### Example Markup\n//\n//
\n//\n\nconst LineHighlighter = function(options = {}) {\n options.highlightLineClass = options.highlightLineClass || 'hll';\n options.fileHolderSelector = options.fileHolderSelector || '.file-holder';\n options.scrollFileHolder = options.scrollFileHolder || false;\n options.hash = options.hash || location.hash;\n\n this.options = options;\n this._hash = options.hash;\n this.highlightLineClass = options.highlightLineClass;\n this.setHash = this.setHash.bind(this);\n this.highlightLine = this.highlightLine.bind(this);\n this.clickHandler = this.clickHandler.bind(this);\n this.highlightHash = this.highlightHash.bind(this);\n\n this.bindEvents();\n this.highlightHash();\n};\n\nLineHighlighter.prototype.bindEvents = function() {\n const $fileHolder = $(this.options.fileHolderSelector);\n\n $fileHolder.on('click', 'a[data-line-number]', this.clickHandler);\n $fileHolder.on('highlight:line', this.highlightHash);\n};\n\nLineHighlighter.prototype.highlightHash = function(newHash) {\n let range;\n if (newHash && typeof newHash === 'string') this._hash = newHash;\n\n this.clearHighlight();\n\n if (this._hash !== '') {\n range = this.hashToRange(this._hash);\n if (range[0]) {\n this.highlightRange(range);\n const lineSelector = `#L${range[0]}`;\n const scrollOptions = {\n // Scroll to the first highlighted line on initial load\n // Offset -50 for the sticky top bar, and another -100 for some context\n offset: -150\n };\n if (this.options.scrollFileHolder) {\n $(this.options.fileHolderSelector).scrollTo(lineSelector, scrollOptions);\n } else {\n $.scrollTo(lineSelector, scrollOptions);\n }\n }\n }\n};\n\nLineHighlighter.prototype.clickHandler = function(event) {\n var current, lineNumber, range;\n event.preventDefault();\n this.clearHighlight();\n lineNumber = $(event.target).closest('a').data('lineNumber');\n current = this.hashToRange(this._hash);\n if (!(current[0] && event.shiftKey)) {\n // If there's no current selection, or there is but Shift wasn't held,\n // treat this like a single-line selection.\n this.setHash(lineNumber);\n return this.highlightLine(lineNumber);\n } else if (event.shiftKey) {\n if (lineNumber < current[0]) {\n range = [lineNumber, current[0]];\n } else {\n range = [current[0], lineNumber];\n }\n this.setHash(range[0], range[1]);\n return this.highlightRange(range);\n }\n};\n\nLineHighlighter.prototype.clearHighlight = function() {\n return $(\".\" + this.highlightLineClass).removeClass(this.highlightLineClass);\n};\n\n// Convert a URL hash String into line numbers\n//\n// hash - Hash String\n//\n// Examples:\n//\n// hashToRange('#L5') # => [5, null]\n// hashToRange('#L5-15') # => [5, 15]\n// hashToRange('#foo') # => [null, null]\n//\n// Returns an Array\nLineHighlighter.prototype.hashToRange = function(hash) {\n var first, last, matches;\n // ?L(\\d+)(?:-(\\d+))?$/)\n matches = hash.match(/^#?L(\\d+)(?:-(\\d+))?$/);\n if (matches && matches.length) {\n first = parseInt(matches[1], 10);\n last = matches[2] ? parseInt(matches[2], 10) : null;\n return [first, last];\n } else {\n return [null, null];\n }\n};\n\n// Highlight a single line\n//\n// lineNumber - Line number to highlight\nLineHighlighter.prototype.highlightLine = function(lineNumber) {\n return $(\"#LC\" + lineNumber).addClass(this.highlightLineClass);\n};\n\n// Highlight all lines within a range\n//\n// range - Array containing the starting and ending line numbers\nLineHighlighter.prototype.highlightRange = function(range) {\n var i, lineNumber, ref, ref1, results;\n if (range[1]) {\n results = [];\n for (lineNumber = i = ref = range[0], ref1 = range[1]; ref <= ref1 ? i <= ref1 : i >= ref1; lineNumber = ref <= ref1 ? (i += 1) : (i -= 1)) {\n results.push(this.highlightLine(lineNumber));\n }\n return results;\n } else {\n return this.highlightLine(range[0]);\n }\n};\n\n// Set the URL hash string\nLineHighlighter.prototype.setHash = function(firstLineNumber, lastLineNumber) {\n var hash;\n if (lastLineNumber) {\n hash = \"#L\" + firstLineNumber + \"-\" + lastLineNumber;\n } else {\n hash = \"#L\" + firstLineNumber;\n }\n this._hash = hash;\n return this.__setLocationHash__(hash);\n};\n\n// Make the actual hash change in the browser\n//\n// This method is stubbed in tests.\nLineHighlighter.prototype.__setLocationHash__ = function(value) {\n return history.pushState({\n url: value\n // We're using pushState instead of assigning location.hash directly to\n // prevent the page from scrolling on the hashchange event\n }, document.title, value);\n};\n\nexport default LineHighlighter;\n","import { getLocationHash } from '../lib/utils/url_utility';\n\nconst lineNumberRe = /^L[0-9]+/;\n\nconst updateLineNumbersOnBlobPermalinks = (linksToUpdate) => {\n const hash = getLocationHash();\n if (hash && lineNumberRe.test(hash)) {\n const hashUrlString = `#${hash}`;\n\n [].concat(Array.prototype.slice.call(linksToUpdate)).forEach((permalinkButton) => {\n const baseHref = permalinkButton.getAttribute('data-original-href') || (() => {\n const href = permalinkButton.getAttribute('href');\n permalinkButton.setAttribute('data-original-href', href);\n return href;\n })();\n permalinkButton.setAttribute('href', `${baseHref}${hashUrlString}`);\n });\n }\n};\n\nfunction BlobLinePermalinkUpdater(blobContentHolder, lineNumberSelector, elementsToUpdate) {\n const updateBlameAndBlobPermalinkCb = () => {\n // Wait for the hash to update from the LineHighlighter callback\n setTimeout(() => {\n updateLineNumbersOnBlobPermalinks(elementsToUpdate);\n }, 0);\n };\n\n blobContentHolder.addEventListener('click', (e) => {\n if (e.target.matches(lineNumberSelector)) {\n updateBlameAndBlobPermalinkCb();\n }\n });\n updateBlameAndBlobPermalinkCb();\n}\n\nexport default BlobLinePermalinkUpdater;\n","import Mousetrap from 'mousetrap';\nimport { getLocationHash, visitUrl } from './lib/utils/url_utility';\nimport Shortcuts from './shortcuts';\n\nconst defaults = {\n skipResetBindings: false,\n fileBlobPermalinkUrl: null,\n};\n\nexport default class ShortcutsBlob extends Shortcuts {\n constructor(opts) {\n const options = Object.assign({}, defaults, opts);\n super(options.skipResetBindings);\n this.options = options;\n\n Mousetrap.bind('y', this.moveToFilePermalink.bind(this));\n }\n\n moveToFilePermalink() {\n if (this.options.fileBlobPermalinkUrl) {\n const hash = getLocationHash();\n const hashUrlString = hash ? `#${hash}` : '';\n visitUrl(`${this.options.fileBlobPermalinkUrl}${hashUrlString}`);\n }\n }\n}\n","import LineHighlighter from '~/line_highlighter';\nimport BlobLinePermalinkUpdater from '~/blob/blob_line_permalink_updater';\nimport ShortcutsNavigation from '~/shortcuts_navigation';\nimport ShortcutsBlob from '~/shortcuts_blob';\nimport BlobForkSuggestion from '~/blob/blob_fork_suggestion';\nimport initBlobBundle from '~/blob_edit/blob_bundle';\n\nexport default () => {\n new LineHighlighter(); // eslint-disable-line no-new\n\n new BlobLinePermalinkUpdater( // eslint-disable-line no-new\n document.querySelector('#blob-content-holder'),\n '.diff-line-num[data-line-number]',\n document.querySelectorAll('.js-data-file-blob-permalink-url, .js-blob-blame-link'),\n );\n\n const fileBlobPermalinkUrlElement = document.querySelector('.js-data-file-blob-permalink-url');\n const fileBlobPermalinkUrl = fileBlobPermalinkUrlElement && fileBlobPermalinkUrlElement.getAttribute('href');\n\n new ShortcutsNavigation(); // eslint-disable-line no-new\n\n new ShortcutsBlob({ // eslint-disable-line no-new\n skipResetBindings: true,\n fileBlobPermalinkUrl,\n });\n\n new BlobForkSuggestion({ // eslint-disable-line no-new\n openButtons: document.querySelectorAll('.js-edit-blob-link-fork-toggler'),\n forkButtons: document.querySelectorAll('.js-fork-suggestion-button'),\n cancelButtons: document.querySelectorAll('.js-cancel-fork-suggestion-button'),\n suggestionSections: document.querySelectorAll('.js-file-fork-suggestion-section'),\n actionTextPieces: document.querySelectorAll('.js-file-fork-suggestion-section-action'),\n }).init();\n\n initBlobBundle();\n};\n","import initBlob from '~/pages/projects/init_blob';\n\ndocument.addEventListener('DOMContentLoaded', initBlob);\n"],"sourceRoot":""}