{"version":3,"sources":["webpack:///./diff_notes/icons/collapse_icon.svg","webpack:////builds/gitlab/gitlabhq/node_modules/mousetrap/plugins/pause/mousetrap-pause.js","webpack:///./autosave.js","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","webpack:///./task_list.js","webpack:///./diff_notes/models/note.js","webpack:///./lib/utils/sticky.js","webpack:///./droplab/plugins/input_setter.js","webpack:///./files_comment_button.js","webpack:///./single_file_diff.js","webpack:///./diff.js","webpack:///./diff_notes/models/discussion.js","webpack:///./diff_notes/stores/comments.js","webpack:///./diff_notes/services/resolve.js","webpack:///./diff_notes/mixins/discussion.js","webpack:///./diff_notes/components/comment_resolve_btn.js","webpack:///./diff_notes/components/jump_to_discussion.js","webpack:///./diff_notes/components/resolve_btn.js","webpack:///./diff_notes/components/resolve_count.js","webpack:///./diff_notes/components/resolve_discussion_btn.js","webpack:///./diff_notes/components/diff_note_avatars.js","webpack:///./diff_notes/components/new_issue_for_discussion.js","webpack:///./diff_notes/diff_notes_bundle.js","webpack:///./commit_merge_requests.js","webpack:///./pages/projects/commit/show/index.js","webpack:////builds/gitlab/gitlabhq/node_modules/stickyfilljs/dist/stickyfill.js","webpack:///./comment_type_toggle.js","webpack:///./notes.js","webpack:///./behaviors/shortcuts/shortcuts_navigation.js","webpack:////builds/gitlab/gitlabhq/node_modules/deckar01-task_list/dist/task_list.js","webpack:///./project_select_combo_button.js","webpack:///./project_select.js","webpack:///./pages/projects/project.js","webpack:///./init_changes_dropdown.js","webpack:///./init_notes.js","webpack:///./pages/projects/index.js","webpack:///./mini_pipeline_graph_dropdown.js","webpack:///./dropzone_input.js","webpack:///./gl_form.js","webpack:///./zen_mode.js"],"names":["module","exports","Mousetrap","self","_originalStopCallback","stopCallback","enabled","e","element","combo","pause","unpause","Autosave","field","key","_this","this","_classCallCheck","isLocalStorageAvailable","AccessorUtilities","isLocalStorageAccessSafe","join","data","restore","on","save","length","text","window","localStorage","getItem","val","trigger","event","Event","bubbles","cancelable","get","dispatchEvent","setItem","reset","removeItem","off","createImageBadge","noteId","_ref","x","y","classNames","arguments","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","discussionId","actual","browser","imageEl","imageDiffHelper","resizeCoordinatesToImageElement","ImageDiff","el","image_diff_classCallCheck","canCreateNote","renderCommentBadge","$noteContainer","$","imageBadges","imageFrameEl","querySelector","bindEvents","imageClickedWrapper","imageClicked","bind","imageBlurredWrapper","removeCommentIndicator","addBadgeWrapper","addBadge","removeBadgeWrapper","removeBadge","renderBadgesWrapper","renderBadges","complete","naturalHeight","addEventListener","toggleCollapsed","commentIndicatorOnClick","customEvent","detail","selection","getTargetSelection","currentTarget","setPositionDataAttribute","showCommentIndicator","_toConsumableArray","querySelectorAll","renderBadge","discussionEl","index","imageBadge","generateBadgeFromDiscussionDOM","push","coordinate","addImageCommentBadge","numberBadgeOptions","Object","assign","badgeText","addImageBadge","_event$detail","addAvatarBadge","badgeNumber","updateDiscussionBadgeNumber","indexToRemove","imageBadgeEls","badge","updatedBadgeNumber","innerText","updateDiscussionAvatarBadgeNumber","splice","remove","viewTypes","TWO_UP","SWIPE","ONION_SKIN","ReplacedImageDiff","_this$imageFrameEls","_this$viewModesEls","defaultViewType","imageFrameEls","_defineProperty","viewModesEl","viewModesEls","currentView","generateImageEls","imageEls","getOwnPropertyNames","viewType","_get","_getPrototypeOf","prototype","call","changeToViewTwoUp","changeView","changeToViewSwipe","changeToViewOnionSkin","newView","validate","find","indicator","replaced_image_diff_toConsumableArray","map","setTimeout","renderNewView","removed","normalizedIndicator","image","availWidth","viewModes","ImageFile","file","image_file_classCallCheck","two-up","each","wrap","requestImageInfo","removeClass","swipe","maxHeight","maxWidth","view","_ref2","$swipeWrap","$swipeBar","$swipeFrame","wrapPadding","_slicedToArray","prepareFrames","css","parseInt","replace","initDraggable","onion-skin","dragTrackWidth","_ref4","$frame","$track","$dragger","$frameAdded","framePadding","opacity","deletedWidth","deletedHeight","initViewModes","waitForImages","initView","viewMode","hasClass","activateViewMode","filter","addClass","fadeOut","fadeIn","views","$el","padding","callback","dragging","$body","$offsetEl","parent","pageX","offset","frame","img","domImg","naturalWidth","helpers","__webpack_exports__","commentIndicatorHelper","commentIndicatorEl","willRemove","meta","stopPropagation","closest","focus","_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","init","TaskList","selector","dataType","fieldName","lockVersion","taskListContainerSelector","updateHandler","update","onSuccess","onError","errorMessages","response","_typeof","errors","Flash","__","disable","taskList","getTaskListTarget","disableTaskListItems","_patchData$this$dataT","$target","target","_e$detail","checked","lineNumber","lineSource","patchData","line_number","line_source","axios","patch","attr","then","lock_version","enableTaskListItems","catch","NoteModel","noteObj","canResolve","resolved","resolved_by","resolvedBy","authorName","authorAvatar","noteTruncated","__webpack_require__","d","stickyMonitor","polyfillSticky","stickyfilljs__WEBPACK_IMPORTED_MODULE_0__","stickyfilljs__WEBPACK_IMPORTED_MODULE_0___default","n","isSticky","scrollY","stickyTop","insertPlaceholder","floor","offsetTop","placeholder","createPlaceholder","heightBefore","offsetHeight","parentNode","insertBefore","nextElementSibling","CSS","supports","passive","StickyFill","InputSetter","hook","destroyed","config","eventWrapper","addEvents","setInputs","list","removeEvents","removeEventListener","selectedItem","selected","Array","isArray","setInput","input","newValue","getAttribute","valueAttribute","inputAttribute","hasAttribute","tagName","value","textContent","destroy","LINE_COLUMN_CLASSES","files_comment_button","$diffFile","userCanCreateNote","isParallelView","Cookies","showButton","hideButton","buttonParentElement","getButtonParent","validateButtonParent","hoveredElement","previousElementSibling","WRAPPER","LOADING_HTML","COLLAPSED_HTML","SingleFileDiff","toggleDiff","content","$toggleIcon","diffForPath","isOpen","collapsedContent","loadingContent","html","hide","after","cb","hasError","getContentHTML","show","diffNotesCompileComponents","syntaxHighlight","$file","FilesCommentButton","is","createFlash","isBound","Diff","diff_classCallCheck","tab","getElementById","isLocked","firstFile","first","handleClickUnfold","handleClickLineNum","handleParallelLineDown","getLocationHash","highlightSelectedLine","openAnchoredDiff","since","to","_this$lineNumbers2","lineNumbers","oldLineNumber","newLineNumber","bottom","unfold","prevNewLine","prev","parents","link","params","replaceWith","flash","locationHash","anchoredDiff","split","diffFile","clickTarget","hash","preventDefault","history","pushState","location","line","table","lineClass","name","children","toArray","elm","$diffFiles","DiscussionModel","notes","loading","Vue","set","delete","keys","note","discussionSelector","$discussionHeadline","discussion_headline_html","append","localTimeAgo","CommentsStore","state","getNote","createDiscussion","discussion","create","createNote","deleteNote","notesCount","unresolvedDiscussionIds","ids","isResolved","ResolveServiceClass","root","resolve_classCallCheck","noteResource","resource","discussionResource","mergeRequestId","unResolveAll","resolveAll","resp","json","unResolveAllNotes","resolveAllNotes","mrWidget","checkStatus","updateHeadline","DiffNotesResolveServiceClass","DiscussionMixins","computed","discussionCount","discussions","resolvedDiscussionCount","resolvedCount","unresolvedDiscussionCount","unresolvedCount","CommentAndResolveBtn","extend","props","type","String","required","textareaIsEmpty","isResolvable","isDiscussionResolved","buttonText","created","mounted","$textarea","component","JumpToDiscussion","mixins","allResolved","lastResolvedId","lastId","methods","jumpToNextUnresolvedDiscussion","discussionsSelector","discussionIdsInScope","firstUnresolvedDiscussionId","nextUnresolvedDiscussionId","activeTab","mrTabs","currentAction","hasDiscussionsToJumpTo","jumpToFirstDiscussion","discussionIdsForElements","elements","i","activateTab","currentDiscussionFound","prevEl","$notesHolder","scrollTo","ResolveBtn","Number","Boolean","resolvedByName","watch","handler","deep","$refs","button","tooltip","container","beforeDestroy","updateTooltip","$nextTick","resolve","_this2","ResolveService","unresolve","ResolveCount","loggedOut","resolvedCountText","ResolveDiscussionBtn","toggleResolveForDiscussion","DiffNoteAvatars","components","userAvatarImage","isVisible","lineType","storeState","shownAvatars","collapseIcon","discussionClassName","notesSubset","slice","extraNotesTitle","extra","moreText","plusSign","addNoCommentClass","_this3","setDiscussionVisible","clickedAvatar","_this4","Notes","instance","onAddDiffNote","toggleDiscussionsToggleState","toggleClass","nextUntil","$notesHolders","$visibleNotesHolders","getTooltipText","template","NewIssueForDiscussion","createHeader","childElementCount","mergeRequestCount","headerText","n__","getHeaderText","class","createItem","mergeRequest","$item","$link","href","path","iid","createLink","$title","title","createTitle","fetchCommitMergeRequests","$container","$content","mergeRequests","s__","$header","createContent","projectPath","performanceHeight","ZenMode","ShortcutsNavigation","MiniPipelineGraph","initNotes","initChangesDropdown","load","commitPath","diffNoteApps","tmpApp","outerHTML","$mount","one","$destroy","$components","$this","_createClass","defineProperties","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","seppuku","getComputedStyle","testNode","some","prefix","shadowRootExists","ShadowRoot","scroll","stickies","targetObj","sourceObject","hasOwnProperty","parseNumeric","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetParent","Sticky","TypeError","HTMLElement","Error","sticky","_node","_stickyMode","_active","refresh","_removed","_deactivate","nodeComputedStyle","nodeComputedProps","marginTop","marginBottom","marginLeft","marginRight","cssFloat","isNaN","referenceNode","host","nodeWinOffset","getBoundingClientRect","parentWinOffset","parentComputedStyle","_parent","styles","_offsetToWindow","right","documentElement","clientWidth","_offsetToParent","borderTopWidth","borderLeftWidth","borderRightWidth","_styles","nodeTopValue","_limits","start","pageYOffset","end","borderBottomWidth","parentPosition","_recalcPosition","clone","_clone","border","borderSpacing","fontSize","stickyMode","abs","removeChild","Stickyfill","addOne","nodeList","addedStickies","_loop","refreshAll","removeOne","_loop2","removeAll","checkScroll","pageXOffset","fastCheckTimer","startFastCheckTimer","setInterval","_fastCheck","docHiddenKey","visibilityChangeEventName","clearInterval","ISetter","CommentTypeToggle","opts","dropdownTrigger","dropdownList","noteTypeInput","submitButton","closeButton","reopenButton","droplab","DropLab","setConfig","normalizeNewlines","str","autosize","Autosize","REGEX_QUICK_ACTIONS","notes_url","note_ids","last_fetched_at","enableGFM","defaultAutocompleteConfig","notes_classCallCheck","updateTargetButtons","updateComment","visibilityChange","cancelDiscussionForm","onAddImageDiffNote","setupDiscussionNoteForm","onReplyToDiscussionNote","removeNote","cancelEdit","updateNote","addDiscussionNote","addNoteError","addNote","resetMainTargetForm","keydownNoteText","toggleCommitList","postComment","clearFlashWrapper","clearFlash","onHashChange","updatedNotesTrackingMap","noteable_url","URL","notesCountBadge","basePollingInterval","maxPollingSteps","$wrapperEl","isInMRPage","cleanBinding","addBinding","setPollingInterval","setupMainTargetNoteForm","collapseLongCommitList","setViewType","getPagePath","insertAfter","$anchor","loadLazyDiff","showEditForm","removeAttachment","updateFormAttachment","onClickRetryLazyLoad","reenableTargetFormSubmitButton","discussionNoteForm","editNote","myLastNote","isMetaKey","which","gon","current_user_id","confirm","removeDiscussionNoteForm","removeNoteEditForm","interval","pollingInterval","hidden","getContent","refreshing","headers","X-Last-Fetched-At","renderNote","shouldReset","nthInterval","pow","initRefresh","noteEntity","votesBlock","commands_changes","checkMergeRequestStatus","eq","loadAwardsHandler","awardsHandler","addAwardToEmojiBar","emoji_award","scrollToAwards","$note","updateNoteTargetSelector","$noteToCleanHighlight","$form","$notesList","discussion_html","renderDiscussionNote","valid","isNewNote","$newNote","animateAppendNote","setupNewNote","updateNotesCount","isUpdatedNote","isEditing","initialContent","trim","currentContent","sanitizedNoteNote","isTextareaUntouched","putConflictEditWarningInPlace","$updatedNote","animateUpdateNote","commands_only","addFlash","parentTimeline","discussionContainer","form","row","diffAvatarContainer","discussion_id","discussion_line_code","on_image","prevAll","diff_discussion_html","$discussion","renderGFM","$notes","contentContainerClass","discussion_resolvable","renderDiscussionAvatar","changesDiscussionContainer","avatarHolder","click","createEvent","initEvent","formClone","setupNoteForm","initCommentTypeToggle","textarea","glForm","GLForm","formParentTimeline","$parentTimeline","isNewDiffComment","$targetNote","$noteEntityEl","revertNoteEditForm","isAllowed","isInViewport","scrollToElement","$editForm","getEditFormSelector","$currentlyEditing","checkContentToAllowEditing","putEditFormInPlace","enable","noteElId","notesTr","removeBadgeEvent","CustomEvent","replyToDiscussionNote","replyLink","cleanForm","dataHolder","diffFileData","discussionID","showReplyInput","toggleDiffNote","newForm","clickEvent","appendTo","addForm","hasNotes","replyButton","rowCssToAdd","forceShow","_ref2$showReplyInput","nextRow","next","targetRow","lineTypeSelector","notesContentSelector","notesContent","isCurrentlyShown","showNow","blurEvent","filename","closebtn","closetext","reopenbtn","reopentext","$originalContentEl","originalContent","postUrl","targetId","targetType","updateCount","$retryButton","prop","renderPlaceholderComponent","url","$errorContainer","$successContainer","renderDiffContent","Promise","$element","$closestSystemCommitList","siblings","systemNotes","has","systemNote","$systemNote","headerMessage","_len","flashParams","_key","flashContainer","_construct","formData","serialize","formContent","_","escape","formAction","formContentOriginal","test","tempFormContent","executedCommands","command","RegExp","commandDescription","description","toLowerCase","uniqueId","isDiscussionNote","currentUsername","currentUserFullname","currentUserAvatar","discussionClass","$tempNote","_ref5","$submitBtn","noteUniqueId","systemNoteUniqueId","$notesContainer","$closeBtn","isMainForm","isDiscussionForm","isDiscussionResolve","_this$getFormData","getFormData","hasQuickActions","stripQuickActions","createPlaceholderNote","current_username","current_user_fullname","current_user_avatar_url","createPlaceholderSystemNote","getQuickActionDescription","AjaxCache","GfmAutoComplete","dataSources","commands","post","res","notePosition","_JSON$parse","addBadgeEvent","handleQuickActions","closestDiffFile","$editingNote","$noteBodyText","_this$getFormData2","cachedNoteBodyText","_ref6","updateNoteError","initDroplab","addTargetClass","GlSkeletonLoading","render","lines","prepend","fileHolder","noteIds","inArray","noteHtml","_possibleConstructorReturn","findAndFollowLink","enabledHelp","Shortcuts","jQuery","factory","modules","installedModules","moduleId","l","m","c","getter","o","__esModule","object","property","p","s","NodeArray","indexOf","item","apply","eventName","initCustomEvent","el1","updateTaskList","checkbox","disabled","changeEvent","changedEvent","checkboxes","ref","result","defaultPrevented","updateSource","incomplete","escapePattern","incompletePattern","completePattern","itemPattern","startFencesPattern","endFencesPattern","itemsInParasPattern","source","itemIndex","clean","inCodeBlock","j","len","results","match","fn","method","ProjectSelectComboButton","select","projectSelectInput","newItemBtn","resourceType","resourceLabel","formattedText","deriveTextVariants","groupId","initLocalStorage","openDropdown","getProjectFromLocalStorage","selectProject","localStorageKey","localStorageItemType","setBtnTextFromLocalStorage","t","select2","selectedProjectData","projectMeta","setNewItemBtnAttributes","setProjectInLocalStorage","cachedProjectData","project","defaultTextPrefix","presetTextSuffix","projectString","projectSelect","simpleFilter","includeGroups","allProjects","orderBy","withIssuesEnabled","withMergeRequestsEnabled","withShared","includeProjectsInSubgroups","allowClear","minimumInputLength","query","finalCallback","projectsCallback","projects","groupsCallback","groups","Api","term","groupProjects","with_issues_enabled","with_merge_requests_enabled","with_shared","include_subgroups","order_by","membership","web_url","name_with_namespace","initSelection","dropdownCssClass","Project","$cloneOptions","$projectCloneField","$cloneBtnLabel","mobileCloneField","selectedCloneOption","cloneType","activeText","$label","clipboardText","initRefSwitcher","submit","projectId","cookieKey","projectSelectDropdown","changeProject","refListItem","refLink","$dropdown","glDropdown","search","selectable","filterable","filterRemote","filterByText","inputFieldName","renderRow","li","cloneNode","header","obj","toggleLabel","clicked","$visit","shouldVisit","action","divider","visitUrl","jquery__WEBPACK_IMPORTED_MODULE_0__","jquery__WEBPACK_IMPORTED_MODULE_0___default","_lib_utils_sticky__WEBPACK_IMPORTED_MODULE_1__","remoteFilter","_notes__WEBPACK_IMPORTED_MODULE_0__","dataEl","notesUrl","notesIds","now","diffView","initialize","r","_projects_gke_cluster_dropdowns__WEBPACK_IMPORTED_MODULE_0__","_persistent_user_callout__WEBPACK_IMPORTED_MODULE_1__","_project__WEBPACK_IMPORTED_MODULE_2__","_behaviors_shortcuts_shortcuts_navigation__WEBPACK_IMPORTED_MODULE_3__","page","body","callout","PersistentUserCallout","initGkeDropdowns","dropdownListSelector","getBuildsList","stageContainer","parentElement","relatedTarget","endpoint","stageEndpoint","renderBuildsList","toggleLoading","stopDropdownClickPropagation","dropdown","toggle","dropzoneInput","handlePaste","pasteText","addFileToForm","updateAttachingMessage","isImage","getFilename","uploadFile","$attachButton","$attachingFileMessage","$cancelButton","$retryLink","$uploadProgress","$uploadingErrorContainer","$uploadingErrorMessage","$uploadingProgressContainer","uploadsPath","uploads_path","maxFileSize","max_file_size","formTextarea","$mdArea","setupMarkdownPreview","$formDropzone","dropzone","dictDefaultMessage","clickable","paramName","maxFilesize","uploadMultiple","csrf","previewContainer","processing","alert","dragover","dragleave","drop","success","processingFileCount","getQueuedFiles","getUploadingFiles","shouldPad","markdown","error","errorMessage","xhr","message","responseText","isString","totaluploadprogress","totalUploadProgress","files","sending","removedfile","queuecomplete","child","Dropzone","forElement","removeAllFiles","dropzoneInstance","failedFiles","failedFile","status","ERROR","accepted","addFile","pasteEvent","originalEvent","clipboardData","items","getAsFile","caretStart","selectionStart","caretEnd","selectionEnd","textEnd","beforeSelection","substring","afterSelection","setSelectionRange","scrollHeight","getData","closeSpinner","FormData","md","$child","insertToTextArea","messageContainer","attachingMessage","filesCount","autoDiscover","GFMConfig","setupForm","clearEventListeners","autoComplete","isNewForm","disableButtonIfEmptyField","setup","addEventListeners","addMarkdownListeners","isAutosizeable","setupAutosize","setHeightData","destroyAutosize","outerHeight","removeMarkdownListeners","active_backdrop","active_textarea","enter","exit","keyCode","backdrop","removeAttr","$dropzone","zen_area"],"mappings":"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","file":"pages.projects.commit.show.7658df24.chunk.js","sourcesContent":["module.exports = \"\\n\"","/**\n * adds a pause and unpause method to Mousetrap\n * this allows you to enable or disable keyboard shortcuts\n * without having to reset Mousetrap and rebind everything\n */\n/* global Mousetrap:true */\nMousetrap = (function(Mousetrap) {\n var self = Mousetrap,\n _originalStopCallback = self.stopCallback,\n enabled = true;\n\n self.stopCallback = function(e, element, combo) {\n if (!enabled) {\n return true;\n }\n\n return _originalStopCallback(e, element, combo);\n };\n\n self.pause = function() {\n enabled = false;\n };\n\n self.unpause = function() {\n enabled = true;\n };\n\n return self;\n}) (Mousetrap);\n","/* eslint-disable no-param-reassign, prefer-template, no-void, consistent-return */\n\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class Autosave {\n constructor(field, key) {\n this.field = field;\n\n this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe();\n if (key.join != null) {\n key = key.join('/');\n }\n this.key = 'autosave/' + key;\n this.field.data('autosave', this);\n this.restore();\n this.field.on('input', () => this.save());\n }\n\n restore() {\n if (!this.isLocalStorageAvailable) return;\n if (!this.field.length) return;\n\n const text = window.localStorage.getItem(this.key);\n\n if ((text != null ? text.length : void 0) > 0) {\n this.field.val(text);\n }\n\n this.field.trigger('input');\n // v-model does not update with jQuery trigger\n // https://github.com/vuejs/vue/issues/2804#issuecomment-216968137\n const event = new Event('change', { bubbles: true, cancelable: false });\n const field = this.field.get(0);\n if (field) {\n field.dispatchEvent(event);\n }\n }\n\n save() {\n if (!this.field.length) return;\n\n const text = this.field.val();\n\n if (this.isLocalStorageAvailable && (text != null ? text.length : void 0) > 0) {\n return window.localStorage.setItem(this.key, text);\n }\n\n return this.reset();\n }\n\n reset() {\n if (!this.isLocalStorageAvailable) return;\n\n return window.localStorage.removeItem(this.key);\n }\n\n dispose() {\n this.field.off('input');\n }\n}\n","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', 'badge-pill']);\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.generateBadgeFromDiscussionDOM(\n this.imageFrameEl,\n discussionEl,\n );\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.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, no-var, prefer-arrow-callback, no-else-return, consistent-return, prefer-template, one-var, no-unused-vars, no-return-assign, no-unused-expressions, no-sequences */\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(\n $('.two-up.view .frame.deleted img', this.file),\n (function(_this) {\n return function(deletedWidth, deletedHeight) {\n return _this.requestImageInfo($('.two-up.view .frame.added img', _this.file), function(\n width,\n height,\n ) {\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\n initViewModes() {\n const viewMode = viewModes[0];\n $('.view-modes', this.file).removeClass('hide');\n $('.view-modes-menu', this.file).on(\n 'click',\n 'li',\n (function(_this) {\n return function(event) {\n if (!$(event.currentTarget).hasClass('active')) {\n return _this.activateViewMode(event.currentTarget.className);\n }\n };\n })(this),\n );\n return this.activateViewMode(viewMode);\n }\n\n activateViewMode(viewMode) {\n $('.view-modes-menu li', this.file)\n .removeClass('active')\n .filter('.' + viewMode)\n .addClass('active');\n return $('.view:visible:not(.' + viewMode + ')', this.file).fadeOut(\n 200,\n (function(_this) {\n return function() {\n $('.view.' + viewMode, _this.file).fadeIn(200);\n return _this.initView(viewMode);\n };\n })(this),\n );\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\n .off('mouseup')\n .off('mousemove')\n .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)\n .each(\n (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),\n )\n .css({\n width: maxWidth,\n height: maxHeight,\n });\n return [maxWidth, maxHeight];\n }\n\n views = {\n 'two-up': function() {\n return $('.two-up.view .wrap', this.file).each(\n (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 },\n swipe() {\n var maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n return $('.swipe.view', this.file).each(\n (function(_this) {\n return function(index, view) {\n var $swipeWrap, $swipeBar, $swipeFrame, wrapPadding, ref;\n (ref = _this.prepareFrames(view)), ([maxWidth, maxHeight] = ref);\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 },\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(\n (function(_this) {\n return function(index, view) {\n var $frame,\n $track,\n $dragger,\n $frameAdded,\n framePadding,\n ref,\n dragging = false;\n (ref = _this.prepareFrames(view)), ([maxWidth, maxHeight] = ref);\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\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(\n 'load',\n (function(_this) {\n return function() {\n return callback.call(_this, domImg.naturalWidth, domImg.naturalHeight);\n };\n })(this),\n );\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;\n\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, height } = imageEl;\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","import $ from 'jquery';\nimport 'deckar01-task_list';\nimport { __ } from '~/locale';\nimport axios from './lib/utils/axios_utils';\nimport Flash from './flash';\n\nexport default class TaskList {\n constructor(options = {}) {\n this.selector = options.selector;\n this.dataType = options.dataType;\n this.fieldName = options.fieldName;\n this.lockVersion = options.lockVersion;\n this.taskListContainerSelector = `${this.selector} .js-task-list-container`;\n this.updateHandler = this.update.bind(this);\n this.onSuccess = options.onSuccess || (() => {});\n this.onError =\n options.onError ||\n function showFlash(e) {\n let errorMessages = '';\n\n if (e.response.data && typeof e.response.data === 'object') {\n errorMessages = e.response.data.errors.join(' ');\n }\n\n return new Flash(errorMessages || __('Update failed'), 'alert');\n };\n\n this.init();\n }\n\n init() {\n this.disable(); // Prevent duplicate event bindings\n\n $(this.taskListContainerSelector).taskList('enable');\n $(document).on('tasklist:changed', this.taskListContainerSelector, this.updateHandler);\n }\n\n getTaskListTarget(e) {\n return e && e.currentTarget ? $(e.currentTarget) : $(this.taskListContainerSelector);\n }\n\n disableTaskListItems(e) {\n this.getTaskListTarget(e).taskList('disable');\n }\n\n enableTaskListItems(e) {\n this.getTaskListTarget(e).taskList('enable');\n }\n\n disable() {\n this.disableTaskListItems();\n $(document).off('tasklist:changed', this.taskListContainerSelector);\n }\n\n update(e) {\n const $target = $(e.target);\n const { index, checked, lineNumber, lineSource } = e.detail;\n const patchData = {};\n\n patchData[this.dataType] = {\n [this.fieldName]: $target.val(),\n lock_version: this.lockVersion,\n update_task: {\n index,\n checked,\n line_number: lineNumber,\n line_source: lineSource,\n },\n };\n\n this.disableTaskListItems(e);\n\n return axios\n .patch($target.data('updateUrl') || $('form.js-issuable-update').attr('action'), patchData)\n .then(({ data }) => {\n this.lockVersion = data.lock_version;\n this.enableTaskListItems(e);\n\n return this.onSuccess(data);\n })\n .catch(({ response }) => {\n this.enableTaskListItems(e);\n\n return this.onError(response.data);\n });\n }\n}\n","class NoteModel {\n constructor(discussionId, noteObj) {\n this.discussionId = discussionId;\n this.id = noteObj.noteId;\n this.canResolve = noteObj.canResolve;\n this.resolved = noteObj.resolved;\n this.resolved_by = noteObj.resolvedBy;\n this.authorName = noteObj.authorName;\n this.authorAvatar = noteObj.authorAvatar;\n this.noteTruncated = noteObj.noteTruncated;\n }\n}\n\nwindow.NoteModel = NoteModel;\n","import StickyFill from 'stickyfilljs';\n\nexport const createPlaceholder = () => {\n const placeholder = document.createElement('div');\n placeholder.classList.add('sticky-placeholder');\n\n return placeholder;\n};\n\nexport const isSticky = (el, scrollY, stickyTop, insertPlaceholder) => {\n const top = Math.floor(el.offsetTop - scrollY);\n\n if (top <= stickyTop && !el.classList.contains('is-stuck')) {\n const placeholder = insertPlaceholder ? createPlaceholder() : null;\n const heightBefore = el.offsetHeight;\n\n el.classList.add('is-stuck');\n\n if (insertPlaceholder) {\n el.parentNode.insertBefore(placeholder, el.nextElementSibling);\n\n placeholder.style.height = `${heightBefore - el.offsetHeight}px`;\n }\n } else if (top > stickyTop && el.classList.contains('is-stuck')) {\n el.classList.remove('is-stuck');\n\n if (\n insertPlaceholder &&\n el.nextElementSibling &&\n el.nextElementSibling.classList.contains('sticky-placeholder')\n ) {\n el.nextElementSibling.remove();\n }\n }\n};\n\n/**\n * Create a listener that will toggle a 'is-stuck' class, based on the current scroll position.\n *\n * - If the current environment does not support `position: sticky`, do nothing.\n *\n * @param {HTMLElement} el The `position: sticky` element.\n * @param {Number} stickyTop Used to determine when an element is stuck.\n * @param {Boolean} insertPlaceholder Should a placeholder element be created when element is stuck?\n */\nexport const stickyMonitor = (el, stickyTop, insertPlaceholder = true) => {\n if (!el) return;\n\n if (\n typeof CSS === 'undefined' ||\n !CSS.supports('(position: -webkit-sticky) or (position: sticky)')\n )\n return;\n\n document.addEventListener(\n 'scroll',\n () => isSticky(el, window.scrollY, stickyTop, insertPlaceholder),\n {\n passive: true,\n },\n );\n};\n\n/**\n * Polyfill the `position: sticky` behavior.\n *\n * - If the current environment supports `position: sticky`, do nothing.\n * - Can receive an iterable element list (NodeList, jQuery collection, etc.) or single HTMLElement.\n */\nexport const polyfillSticky = el => {\n StickyFill.add(el);\n};\n","/* eslint-disable */\n\nconst InputSetter = {\n init(hook) {\n this.hook = hook;\n this.destroyed = false;\n this.config = hook.config.InputSetter || (this.hook.config.InputSetter = {});\n\n this.eventWrapper = {};\n\n this.addEvents();\n },\n\n addEvents() {\n this.eventWrapper.setInputs = this.setInputs.bind(this);\n this.hook.list.list.addEventListener('click.dl', this.eventWrapper.setInputs);\n },\n\n removeEvents() {\n this.hook.list.list.removeEventListener('click.dl', this.eventWrapper.setInputs);\n },\n\n setInputs(e) {\n if (this.destroyed) return;\n\n const selectedItem = e.detail.selected;\n\n if (!Array.isArray(this.config)) this.config = [this.config];\n\n this.config.forEach(config => this.setInput(config, selectedItem));\n },\n\n setInput(config, selectedItem) {\n const input = config.input || this.hook.trigger;\n const newValue = selectedItem.getAttribute(config.valueAttribute);\n const inputAttribute = config.inputAttribute;\n\n if (input.hasAttribute(inputAttribute)) return input.setAttribute(inputAttribute, newValue);\n if (input.tagName === 'INPUT') return (input.value = newValue);\n return (input.textContent = newValue);\n },\n\n destroy() {\n this.destroyed = true;\n\n this.removeEvents();\n },\n};\n\nexport default InputSetter;\n","/* Developer beware! Do not add logic to showButton or hideButton\n * that will force a reflow. Doing so will create a significant performance\n * bottleneck for pages with large diffs. For a comprehensive list of what\n * causes reflows, visit https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n */\n\nimport Cookies from 'js-cookie';\n\nconst LINE_NUMBER_CLASS = 'diff-line-num';\nconst UNFOLDABLE_LINE_CLASS = 'js-unfold';\nconst NO_COMMENT_CLASS = 'no-comment-btn';\nconst EMPTY_CELL_CLASS = 'empty-cell';\nconst OLD_LINE_CLASS = 'old_line';\nconst LINE_COLUMN_CLASSES = `.${LINE_NUMBER_CLASS}, .line_content`;\nconst DIFF_CONTAINER_SELECTOR = '.files';\nconst DIFF_EXPANDED_CLASS = 'diff-expanded';\n\nexport default {\n init($diffFile) {\n /* Caching is used only when the following members are *true*.\n * This is because there are likely to be\n * differently configured versions of diffs in the same session.\n * However if these values are true, they\n * will be true in all cases */\n\n if (!this.userCanCreateNote) {\n // data-can-create-note is an empty string when true, otherwise undefined\n this.userCanCreateNote =\n $diffFile.closest(DIFF_CONTAINER_SELECTOR).data('canCreateNote') === '';\n }\n\n this.isParallelView = Cookies.get('diff_view') === 'parallel';\n\n if (this.userCanCreateNote) {\n $diffFile\n .on('mouseover', LINE_COLUMN_CLASSES, e => this.showButton(this.isParallelView, e))\n .on('mouseleave', LINE_COLUMN_CLASSES, e => this.hideButton(this.isParallelView, e));\n }\n },\n\n showButton(isParallelView, e) {\n const buttonParentElement = this.getButtonParent(e.currentTarget, isParallelView);\n\n if (!this.validateButtonParent(buttonParentElement)) return;\n\n buttonParentElement.classList.add('is-over');\n buttonParentElement.nextElementSibling.classList.add('is-over');\n },\n\n hideButton(isParallelView, e) {\n const buttonParentElement = this.getButtonParent(e.currentTarget, isParallelView);\n\n buttonParentElement.classList.remove('is-over');\n buttonParentElement.nextElementSibling.classList.remove('is-over');\n },\n\n getButtonParent(hoveredElement, isParallelView) {\n if (isParallelView) {\n if (!hoveredElement.classList.contains(LINE_NUMBER_CLASS)) {\n return hoveredElement.previousElementSibling;\n }\n } else if (!hoveredElement.classList.contains(OLD_LINE_CLASS)) {\n return hoveredElement.parentNode.querySelector(`.${OLD_LINE_CLASS}`);\n }\n return hoveredElement;\n },\n\n validateButtonParent(buttonParentElement) {\n return (\n !buttonParentElement.classList.contains(EMPTY_CELL_CLASS) &&\n !buttonParentElement.classList.contains(UNFOLDABLE_LINE_CLASS) &&\n !buttonParentElement.classList.contains(NO_COMMENT_CLASS) &&\n !buttonParentElement.parentNode.classList.contains(DIFF_EXPANDED_CLASS)\n );\n },\n};\n","/* eslint-disable func-names, prefer-arrow-callback, consistent-return, */\n\nimport $ from 'jquery';\nimport { __ } from './locale';\nimport axios from './lib/utils/axios_utils';\nimport createFlash from './flash';\nimport FilesCommentButton from './files_comment_button';\nimport imageDiffHelper from './image_diff/helpers/index';\nimport syntaxHighlight from './syntax_highlight';\n\nconst WRAPPER = '
';\nconst LOADING_HTML = '';\nconst ERROR_HTML =\n '
Could not load diff
';\nconst COLLAPSED_HTML =\n '
This diff is collapsed.
';\n\nexport default class SingleFileDiff {\n constructor(file) {\n this.file = file;\n this.toggleDiff = this.toggleDiff.bind(this);\n this.content = $('.diff-content', this.file);\n this.$toggleIcon = $('.diff-toggle-caret', this.file);\n this.diffForPath = this.content.find('[data-diff-for-path]').data('diffForPath');\n this.isOpen = !this.diffForPath;\n if (this.diffForPath) {\n this.collapsedContent = this.content;\n this.loadingContent = $(WRAPPER)\n .addClass('loading')\n .html(LOADING_HTML)\n .hide();\n this.content = null;\n this.collapsedContent.after(this.loadingContent);\n this.$toggleIcon.addClass('fa-caret-right');\n } else {\n this.collapsedContent = $(WRAPPER)\n .html(COLLAPSED_HTML)\n .hide();\n this.content.after(this.collapsedContent);\n this.$toggleIcon.addClass('fa-caret-down');\n }\n\n $('.js-file-title, .click-to-expand', this.file).on(\n 'click',\n function(e) {\n this.toggleDiff($(e.target));\n }.bind(this),\n );\n }\n\n toggleDiff($target, cb) {\n if (\n !$target.hasClass('js-file-title') &&\n !$target.hasClass('click-to-expand') &&\n !$target.hasClass('diff-toggle-caret')\n )\n return;\n this.isOpen = !this.isOpen;\n if (!this.isOpen && !this.hasError) {\n this.content.hide();\n this.$toggleIcon.addClass('fa-caret-right').removeClass('fa-caret-down');\n this.collapsedContent.show();\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n gl.diffNotesCompileComponents();\n }\n } else if (this.content) {\n this.collapsedContent.hide();\n this.content.show();\n this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right');\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n gl.diffNotesCompileComponents();\n }\n } else {\n this.$toggleIcon.addClass('fa-caret-down').removeClass('fa-caret-right');\n return this.getContentHTML(cb);\n }\n }\n\n getContentHTML(cb) {\n this.collapsedContent.hide();\n this.loadingContent.show();\n\n axios\n .get(this.diffForPath)\n .then(({ data }) => {\n this.loadingContent.hide();\n if (data.html) {\n this.content = $(data.html);\n syntaxHighlight(this.content);\n } else {\n this.hasError = true;\n this.content = $(ERROR_HTML);\n }\n this.collapsedContent.after(this.content);\n\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n gl.diffNotesCompileComponents();\n }\n\n const $file = $(this.file);\n FilesCommentButton.init($file);\n\n const canCreateNote = $file.closest('.files').is('[data-can-create-note]');\n imageDiffHelper.initImageDiff($file[0], canCreateNote);\n\n if (cb) cb();\n })\n .catch(() => {\n createFlash(__('An error occurred while retrieving diff'));\n });\n }\n}\n","import $ from 'jquery';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport { __ } from '~/locale';\nimport { getLocationHash } from './lib/utils/url_utility';\nimport FilesCommentButton from './files_comment_button';\nimport SingleFileDiff from './single_file_diff';\nimport imageDiffHelper from './image_diff/helpers/index';\n\nconst UNFOLD_COUNT = 20;\nlet isBound = false;\n\nexport default class Diff {\n constructor() {\n const $diffFile = $('.files .diff-file');\n\n $diffFile.each((index, file) => {\n if (!$.data(file, 'singleFileDiff')) {\n $.data(file, 'singleFileDiff', new SingleFileDiff(file));\n }\n });\n\n const tab = document.getElementById('diffs');\n if (!tab || (tab && tab.dataset && tab.dataset.isLocked !== ''))\n FilesCommentButton.init($diffFile);\n\n const firstFile = $('.files')\n .first()\n .get(0);\n const canCreateNote = firstFile && firstFile.hasAttribute('data-can-create-note');\n $diffFile.each((index, file) => imageDiffHelper.initImageDiff(file, canCreateNote));\n\n if (!isBound) {\n $(document)\n .on('click', '.js-unfold', this.handleClickUnfold.bind(this))\n .on('click', '.diff-line-num a', this.handleClickLineNum.bind(this))\n .on('mousedown', 'td.line_content.parallel', this.handleParallelLineDown.bind(this));\n isBound = true;\n }\n\n if (getLocationHash()) {\n this.highlightSelectedLine();\n }\n\n this.openAnchoredDiff();\n }\n\n handleClickUnfold(e) {\n const $target = $(e.target);\n const [oldLineNumber, newLineNumber] = this.lineNumbers($target.parent());\n const offset = newLineNumber - oldLineNumber;\n const bottom = $target.hasClass('js-unfold-bottom');\n let since;\n let to;\n let unfold = true;\n\n if (bottom) {\n const lineNumber = newLineNumber + 1;\n since = lineNumber;\n to = lineNumber + UNFOLD_COUNT;\n } else {\n const lineNumber = newLineNumber - 1;\n since = lineNumber - UNFOLD_COUNT;\n to = lineNumber;\n\n // make sure we aren't loading more than we need\n const prevNewLine = this.lineNumbers($target.parent().prev())[1];\n if (since <= prevNewLine + 1) {\n since = prevNewLine + 1;\n unfold = false;\n }\n }\n\n const file = $target.parents('.diff-file');\n const link = file.data('blobDiffPath');\n const view = file.data('view');\n\n const params = { since, to, bottom, offset, unfold, view };\n axios\n .get(link, { params })\n .then(({ data }) => $target.parent().replaceWith(data))\n .catch(() => flash(__('An error occurred while loading diff')));\n }\n\n openAnchoredDiff(cb) {\n const locationHash = getLocationHash();\n const anchoredDiff = locationHash && locationHash.split('_')[0];\n\n if (!anchoredDiff) return;\n\n const diffTitle = $(`#${anchoredDiff}`);\n const diffFile = diffTitle.closest('.diff-file');\n const nothingHereBlock = $('.nothing-here-block:visible', diffFile);\n if (nothingHereBlock.length) {\n const clickTarget = $('.js-file-title, .click-to-expand', diffFile);\n diffFile.data('singleFileDiff').toggleDiff(clickTarget, () => {\n this.highlightSelectedLine();\n if (cb) cb();\n });\n } else if (cb) {\n cb();\n }\n }\n\n handleClickLineNum(e) {\n const hash = $(e.currentTarget).attr('href');\n e.preventDefault();\n if (window.history.pushState) {\n window.history.pushState(null, null, hash);\n } else {\n window.location.hash = hash;\n }\n this.highlightSelectedLine();\n }\n // eslint-disable-next-line class-methods-use-this\n handleParallelLineDown(e) {\n const line = $(e.currentTarget);\n const table = line.closest('table');\n\n table.removeClass('left-side-selected right-side-selected');\n\n const lineClass = ['left-side', 'right-side'].filter(name => line.hasClass(name))[0];\n if (lineClass) {\n table.addClass(`${lineClass}-selected`);\n }\n }\n // eslint-disable-next-line class-methods-use-this\n diffViewType() {\n return $('.inline-parallel-buttons a.active').data('viewType');\n }\n // eslint-disable-next-line class-methods-use-this\n lineNumbers(line) {\n const children = line.find('.diff-line-num').toArray();\n if (children.length !== 2) {\n return [0, 0];\n }\n return children.map(elm => parseInt($(elm).data('linenumber'), 10) || 0);\n }\n // eslint-disable-next-line class-methods-use-this\n highlightSelectedLine() {\n const hash = getLocationHash();\n const $diffFiles = $('.diff-file');\n $diffFiles.find('.hll').removeClass('hll');\n\n if (hash) {\n $diffFiles\n .find(`tr#${hash}:not(.match) td, td#${hash}, td[data-line-code=\"${hash}\"]`)\n .addClass('hll');\n }\n }\n}\n","/* eslint-disable camelcase, guard-for-in, no-restricted-syntax */\n/* global NoteModel */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport { localTimeAgo } from '../../lib/utils/datetime_utility';\n\nclass DiscussionModel {\n constructor(discussionId) {\n this.id = discussionId;\n this.notes = {};\n this.loading = false;\n this.canResolve = false;\n }\n\n createNote(noteObj) {\n Vue.set(this.notes, noteObj.noteId, new NoteModel(this.id, noteObj));\n }\n\n deleteNote(noteId) {\n Vue.delete(this.notes, noteId);\n }\n\n getNote(noteId) {\n return this.notes[noteId];\n }\n\n notesCount() {\n return Object.keys(this.notes).length;\n }\n\n isResolved() {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (!note.resolved) {\n return false;\n }\n }\n return true;\n }\n\n resolveAllNotes(resolved_by) {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (!note.resolved) {\n note.resolved = true;\n note.resolved_by = resolved_by;\n }\n }\n }\n\n unResolveAllNotes() {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (note.resolved) {\n note.resolved = false;\n note.resolved_by = null;\n }\n }\n }\n\n updateHeadline(data) {\n const discussionSelector = `.discussion[data-discussion-id=\"${this.id}\"]`;\n const $discussionHeadline = $(`${discussionSelector} .js-discussion-headline`);\n\n if (data.discussion_headline_html) {\n if ($discussionHeadline.length) {\n $discussionHeadline.replaceWith(data.discussion_headline_html);\n } else {\n $(`${discussionSelector} .discussion-header`).append(data.discussion_headline_html);\n }\n\n localTimeAgo($('.js-timeago', `${discussionSelector}`));\n } else {\n $discussionHeadline.remove();\n }\n }\n\n isResolvable() {\n if (!this.canResolve) {\n return false;\n }\n\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (note.canResolve) {\n return true;\n }\n }\n\n return false;\n }\n}\n\nwindow.DiscussionModel = DiscussionModel;\n","/* eslint-disable object-shorthand, func-names, camelcase, no-restricted-syntax, guard-for-in */\n/* global DiscussionModel */\n\nimport Vue from 'vue';\n\nwindow.CommentsStore = {\n state: {},\n get: function(discussionId, noteId) {\n return this.state[discussionId].getNote(noteId);\n },\n createDiscussion: function(discussionId, canResolve) {\n let discussion = this.state[discussionId];\n if (!this.state[discussionId]) {\n discussion = new DiscussionModel(discussionId);\n Vue.set(this.state, discussionId, discussion);\n }\n\n if (canResolve !== undefined) {\n discussion.canResolve = canResolve;\n }\n\n return discussion;\n },\n create: function(noteObj) {\n const discussion = this.createDiscussion(noteObj.discussionId);\n\n discussion.createNote(noteObj);\n },\n update: function(discussionId, noteId, resolved, resolved_by) {\n const discussion = this.state[discussionId];\n const note = discussion.getNote(noteId);\n note.resolved = resolved;\n note.resolved_by = resolved_by;\n },\n delete: function(discussionId, noteId) {\n const discussion = this.state[discussionId];\n discussion.deleteNote(noteId);\n\n if (discussion.notesCount() === 0) {\n Vue.delete(this.state, discussionId);\n }\n },\n unresolvedDiscussionIds: function() {\n const ids = [];\n\n for (const discussionId in this.state) {\n const discussion = this.state[discussionId];\n\n if (!discussion.isResolved()) {\n ids.push(discussion.id);\n }\n }\n\n return ids;\n },\n};\n","/* global CommentsStore */\n\nimport Vue from 'vue';\nimport Flash from '../../flash';\nimport '../../vue_shared/vue_resource_interceptor';\n\nwindow.gl = window.gl || {};\n\nclass ResolveServiceClass {\n constructor(root) {\n this.noteResource = Vue.resource(`${root}/notes{/noteId}/resolve?html=true`);\n this.discussionResource = Vue.resource(\n `${root}/merge_requests{/mergeRequestId}/discussions{/discussionId}/resolve?html=true`,\n );\n }\n\n resolve(noteId) {\n return this.noteResource.save({ noteId }, {});\n }\n\n unresolve(noteId) {\n return this.noteResource.delete({ noteId }, {});\n }\n\n toggleResolveForDiscussion(mergeRequestId, discussionId) {\n const discussion = CommentsStore.state[discussionId];\n const isResolved = discussion.isResolved();\n let promise;\n\n if (isResolved) {\n promise = this.unResolveAll(mergeRequestId, discussionId);\n } else {\n promise = this.resolveAll(mergeRequestId, discussionId);\n }\n\n promise\n .then(resp => resp.json())\n .then(data => {\n discussion.loading = false;\n const resolvedBy = data ? data.resolved_by : null;\n\n if (isResolved) {\n discussion.unResolveAllNotes();\n } else {\n discussion.resolveAllNotes(resolvedBy);\n }\n\n if (gl.mrWidget) gl.mrWidget.checkStatus();\n discussion.updateHeadline(data);\n })\n .catch(\n () => new Flash('An error occurred when trying to resolve a discussion. Please try again.'),\n );\n }\n\n resolveAll(mergeRequestId, discussionId) {\n const discussion = CommentsStore.state[discussionId];\n\n discussion.loading = true;\n\n return this.discussionResource.save(\n {\n mergeRequestId,\n discussionId,\n },\n {},\n );\n }\n\n unResolveAll(mergeRequestId, discussionId) {\n const discussion = CommentsStore.state[discussionId];\n\n discussion.loading = true;\n\n return this.discussionResource.delete(\n {\n mergeRequestId,\n discussionId,\n },\n {},\n );\n }\n}\n\ngl.DiffNotesResolveServiceClass = ResolveServiceClass;\n","/* eslint-disable object-shorthand, func-names, guard-for-in, no-restricted-syntax, */\n\nconst DiscussionMixins = {\n computed: {\n discussionCount: function() {\n return Object.keys(this.discussions).length;\n },\n resolvedDiscussionCount: function() {\n let resolvedCount = 0;\n\n for (const discussionId in this.discussions) {\n const discussion = this.discussions[discussionId];\n\n if (discussion.isResolved()) {\n resolvedCount += 1;\n }\n }\n\n return resolvedCount;\n },\n unresolvedDiscussionCount: function() {\n let unresolvedCount = 0;\n\n for (const discussionId in this.discussions) {\n const discussion = this.discussions[discussionId];\n\n if (!discussion.isResolved()) {\n unresolvedCount += 1;\n }\n }\n\n return unresolvedCount;\n },\n },\n};\n\nexport default DiscussionMixins;\n","/* eslint-disable object-shorthand, func-names, no-else-return, no-lonely-if */\n/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\n\nconst CommentAndResolveBtn = Vue.extend({\n props: {\n discussionId: {\n type: String,\n required: true,\n },\n },\n data() {\n return {\n textareaIsEmpty: true,\n discussion: {},\n };\n },\n computed: {\n showButton: function() {\n if (this.discussion) {\n return this.discussion.isResolvable();\n } else {\n return false;\n }\n },\n isDiscussionResolved: function() {\n return this.discussion.isResolved();\n },\n buttonText: function() {\n if (this.isDiscussionResolved) {\n if (this.textareaIsEmpty) {\n return 'Unresolve discussion';\n } else {\n return 'Comment & unresolve discussion';\n }\n } else {\n if (this.textareaIsEmpty) {\n return 'Resolve discussion';\n } else {\n return 'Comment & resolve discussion';\n }\n }\n },\n },\n created() {\n if (this.discussionId) {\n this.discussion = CommentsStore.state[this.discussionId];\n }\n },\n mounted: function() {\n if (!this.discussionId) return;\n\n const $textarea = $(\n `.js-discussion-note-form[data-discussion-id=${this.discussionId}] .note-textarea`,\n );\n this.textareaIsEmpty = $textarea.val() === '';\n\n $textarea.on('input.comment-and-resolve-btn', () => {\n this.textareaIsEmpty = $textarea.val() === '';\n });\n },\n destroyed: function() {\n if (!this.discussionId) return;\n\n $(`.js-discussion-note-form[data-discussion-id=${this.discussionId}] .note-textarea`).off(\n 'input.comment-and-resolve-btn',\n );\n },\n});\n\nVue.component('comment-and-resolve-btn', CommentAndResolveBtn);\n","/* eslint-disable object-shorthand, func-names, no-else-return, guard-for-in, no-restricted-syntax, no-lonely-if, no-continue */\n/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\n\nimport DiscussionMixins from '../mixins/discussion';\n\nconst JumpToDiscussion = Vue.extend({\n mixins: [DiscussionMixins],\n props: {\n discussionId: {\n type: String,\n required: true,\n },\n },\n data: function() {\n return {\n discussions: CommentsStore.state,\n discussion: {},\n };\n },\n computed: {\n buttonText: function() {\n if (this.discussionId) {\n return 'Jump to next unresolved discussion';\n } else {\n return 'Jump to first unresolved discussion';\n }\n },\n allResolved: function() {\n return this.unresolvedDiscussionCount === 0;\n },\n showButton: function() {\n if (this.discussionId) {\n if (this.unresolvedDiscussionCount > 1) {\n return true;\n } else {\n return this.discussionId !== this.lastResolvedId;\n }\n } else {\n return this.unresolvedDiscussionCount >= 1;\n }\n },\n lastResolvedId: function() {\n let lastId;\n for (const discussionId in this.discussions) {\n const discussion = this.discussions[discussionId];\n\n if (!discussion.isResolved()) {\n lastId = discussion.id;\n }\n }\n return lastId;\n },\n },\n created() {\n this.discussion = this.discussions[this.discussionId];\n },\n methods: {\n jumpToNextUnresolvedDiscussion: function() {\n let discussionsSelector;\n let discussionIdsInScope;\n let firstUnresolvedDiscussionId;\n let nextUnresolvedDiscussionId;\n let activeTab = window.mrTabs.currentAction;\n let hasDiscussionsToJumpTo = true;\n let jumpToFirstDiscussion = !this.discussionId;\n\n const discussionIdsForElements = function(elements) {\n return elements\n .map(function() {\n return $(this).attr('data-discussion-id');\n })\n .toArray();\n };\n\n const { discussions } = this;\n\n if (activeTab === 'diffs') {\n discussionsSelector = '.diffs .notes[data-discussion-id]';\n discussionIdsInScope = discussionIdsForElements($(discussionsSelector));\n\n let unresolvedDiscussionCount = 0;\n\n for (let i = 0; i < discussionIdsInScope.length; i += 1) {\n const discussionId = discussionIdsInScope[i];\n const discussion = discussions[discussionId];\n if (discussion && !discussion.isResolved()) {\n unresolvedDiscussionCount += 1;\n }\n }\n\n if (this.discussionId && !this.discussion.isResolved()) {\n // If this is the last unresolved discussion on the diffs tab,\n // there are no discussions to jump to.\n if (unresolvedDiscussionCount === 1) {\n hasDiscussionsToJumpTo = false;\n }\n } else {\n // If there are no unresolved discussions on the diffs tab at all,\n // there are no discussions to jump to.\n if (unresolvedDiscussionCount === 0) {\n hasDiscussionsToJumpTo = false;\n }\n }\n } else if (activeTab !== 'show') {\n // If we are on the commits or builds tabs,\n // there are no discussions to jump to.\n hasDiscussionsToJumpTo = false;\n }\n\n if (!hasDiscussionsToJumpTo) {\n // If there are no discussions to jump to on the current page,\n // switch to the notes tab and jump to the first discussion there.\n window.mrTabs.activateTab('show');\n activeTab = 'show';\n jumpToFirstDiscussion = true;\n }\n\n if (activeTab === 'show') {\n discussionsSelector = '.discussion[data-discussion-id]';\n discussionIdsInScope = discussionIdsForElements($(discussionsSelector));\n }\n\n let currentDiscussionFound = false;\n for (let i = 0; i < discussionIdsInScope.length; i += 1) {\n const discussionId = discussionIdsInScope[i];\n const discussion = discussions[discussionId];\n\n if (!discussion) {\n // Discussions for comments on commits in this MR don't have a resolved status.\n continue;\n }\n\n if (!firstUnresolvedDiscussionId && !discussion.isResolved()) {\n firstUnresolvedDiscussionId = discussionId;\n\n if (jumpToFirstDiscussion) {\n break;\n }\n }\n\n if (!jumpToFirstDiscussion) {\n if (currentDiscussionFound) {\n if (!discussion.isResolved()) {\n nextUnresolvedDiscussionId = discussionId;\n break;\n } else {\n continue;\n }\n }\n\n if (discussionId === this.discussionId) {\n currentDiscussionFound = true;\n }\n }\n }\n\n nextUnresolvedDiscussionId = nextUnresolvedDiscussionId || firstUnresolvedDiscussionId;\n\n if (!nextUnresolvedDiscussionId) {\n return;\n }\n\n let $target = $(`${discussionsSelector}[data-discussion-id=\"${nextUnresolvedDiscussionId}\"]`);\n\n if (activeTab === 'show') {\n $target = $target.closest('.note-discussion');\n\n // If the next discussion is closed, toggle it open.\n if ($target.find('.js-toggle-content').is(':hidden')) {\n $target.find('.js-toggle-button i').trigger('click');\n }\n } else if (activeTab === 'diffs') {\n // Resolved discussions are hidden in the diffs tab by default.\n // If they are marked unresolved on the notes tab, they will still be hidden on the diffs tab.\n // When jumping between unresolved discussions on the diffs tab, we show them.\n $target.closest('.content').show();\n\n const $notesHolder = $target.closest('tr.notes_holder');\n\n // Image diff discussions does not use notes_holder\n // so we should keep original $target value in those cases\n if ($notesHolder.length > 0) {\n $target = $notesHolder;\n }\n\n $target.show();\n\n // If we are on the diffs tab, we don't scroll to the discussion itself, but to\n // 4 diff lines above it: the line the discussion was in response to + 3 context\n let prevEl;\n for (let i = 0; i < 4; i += 1) {\n prevEl = $target.prev();\n\n // If the discussion doesn't have 4 lines above it, we'll have to do with fewer.\n if (!prevEl.hasClass('line_holder')) {\n break;\n }\n\n $target = prevEl;\n }\n }\n\n $.scrollTo($target, {\n offset: -150,\n });\n },\n },\n});\n\nVue.component('jump-to-discussion', JumpToDiscussion);\n","/* global CommentsStore */\n/* global ResolveService */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport Flash from '../../flash';\n\nconst ResolveBtn = Vue.extend({\n props: {\n noteId: {\n type: Number,\n required: true,\n },\n discussionId: {\n type: String,\n required: true,\n },\n resolved: {\n type: Boolean,\n required: true,\n },\n canResolve: {\n type: Boolean,\n required: true,\n },\n resolvedBy: {\n type: String,\n required: true,\n },\n authorName: {\n type: String,\n required: true,\n },\n authorAvatar: {\n type: String,\n required: true,\n },\n noteTruncated: {\n type: String,\n required: true,\n },\n },\n data() {\n return {\n discussions: CommentsStore.state,\n loading: false,\n };\n },\n computed: {\n discussion() {\n return this.discussions[this.discussionId];\n },\n note() {\n return this.discussion ? this.discussion.getNote(this.noteId) : {};\n },\n buttonText() {\n if (this.isResolved) {\n return `Resolved by ${this.resolvedByName}`;\n } else if (this.canResolve) {\n return 'Mark as resolved';\n }\n\n return 'Unable to resolve';\n },\n isResolved() {\n if (this.note) {\n return this.note.resolved;\n }\n\n return false;\n },\n resolvedByName() {\n return this.note.resolved_by;\n },\n },\n watch: {\n discussions: {\n handler: 'updateTooltip',\n deep: true,\n },\n },\n mounted() {\n $(this.$refs.button).tooltip({\n container: 'body',\n });\n },\n beforeDestroy() {\n CommentsStore.delete(this.discussionId, this.noteId);\n },\n created() {\n CommentsStore.create({\n discussionId: this.discussionId,\n noteId: this.noteId,\n canResolve: this.canResolve,\n resolved: this.resolved,\n resolvedBy: this.resolvedBy,\n authorName: this.authorName,\n authorAvatar: this.authorAvatar,\n noteTruncated: this.noteTruncated,\n });\n },\n methods: {\n updateTooltip() {\n this.$nextTick(() => {\n $(this.$refs.button)\n .tooltip('hide')\n .tooltip('_fixTitle');\n });\n },\n resolve() {\n if (!this.canResolve) return;\n\n let promise;\n this.loading = true;\n\n if (this.isResolved) {\n promise = ResolveService.unresolve(this.noteId);\n } else {\n promise = ResolveService.resolve(this.noteId);\n }\n\n promise\n .then(resp => resp.json())\n .then(data => {\n this.loading = false;\n\n const resolvedBy = data ? data.resolved_by : null;\n\n CommentsStore.update(this.discussionId, this.noteId, !this.isResolved, resolvedBy);\n this.discussion.updateHeadline(data);\n gl.mrWidget.checkStatus();\n this.updateTooltip();\n })\n .catch(\n () => new Flash('An error occurred when trying to resolve a comment. Please try again.'),\n );\n },\n },\n});\n\nVue.component('resolve-btn', ResolveBtn);\n","/* eslint-disable object-shorthand, func-names */\n/* global CommentsStore */\n\nimport Vue from 'vue';\n\nimport DiscussionMixins from '../mixins/discussion';\n\nwindow.ResolveCount = Vue.extend({\n mixins: [DiscussionMixins],\n props: {\n loggedOut: {\n type: Boolean,\n required: true,\n },\n },\n data: function() {\n return {\n discussions: CommentsStore.state,\n };\n },\n computed: {\n allResolved: function() {\n return this.resolvedDiscussionCount === this.discussionCount;\n },\n resolvedCountText() {\n return this.discussionCount === 1 ? 'discussion' : 'discussions';\n },\n },\n});\n","/* eslint-disable object-shorthand, func-names, no-else-return */\n/* global CommentsStore */\n/* global ResolveService */\n\nimport Vue from 'vue';\n\nconst ResolveDiscussionBtn = Vue.extend({\n props: {\n discussionId: {\n type: String,\n required: true,\n },\n mergeRequestId: {\n type: Number,\n required: true,\n },\n canResolve: {\n type: Boolean,\n required: true,\n },\n },\n data: function() {\n return {\n discussion: {},\n };\n },\n computed: {\n showButton: function() {\n if (this.discussion) {\n return this.discussion.isResolvable();\n } else {\n return false;\n }\n },\n isDiscussionResolved: function() {\n if (this.discussion) {\n return this.discussion.isResolved();\n } else {\n return false;\n }\n },\n buttonText: function() {\n if (this.isDiscussionResolved) {\n return 'Unresolve discussion';\n } else {\n return 'Resolve discussion';\n }\n },\n loading: function() {\n if (this.discussion) {\n return this.discussion.loading;\n } else {\n return false;\n }\n },\n },\n created: function() {\n CommentsStore.createDiscussion(this.discussionId, this.canResolve);\n\n this.discussion = CommentsStore.state[this.discussionId];\n },\n methods: {\n resolve: function() {\n ResolveService.toggleResolveForDiscussion(this.mergeRequestId, this.discussionId);\n },\n },\n});\n\nVue.component('resolve-discussion-btn', ResolveDiscussionBtn);\n","/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport collapseIcon from '../icons/collapse_icon.svg';\nimport Notes from '../../notes';\nimport userAvatarImage from '../../vue_shared/components/user_avatar/user_avatar_image.vue';\n\nconst DiffNoteAvatars = Vue.extend({\n components: {\n userAvatarImage,\n },\n props: {\n discussionId: {\n type: String,\n required: true,\n },\n },\n data() {\n return {\n isVisible: false,\n lineType: '',\n storeState: CommentsStore.state,\n shownAvatars: 3,\n collapseIcon,\n };\n },\n computed: {\n discussionClassName() {\n return `js-diff-avatars-${this.discussionId}`;\n },\n notesSubset() {\n let notes = [];\n\n if (this.discussion) {\n notes = Object.keys(this.discussion.notes)\n .slice(0, this.shownAvatars)\n .map(noteId => this.discussion.notes[noteId]);\n }\n\n return notes;\n },\n extraNotesTitle() {\n if (this.discussion) {\n const extra = this.discussion.notesCount() - this.shownAvatars;\n\n return `${extra} more comment${extra > 1 ? 's' : ''}`;\n }\n\n return '';\n },\n discussion() {\n return this.storeState[this.discussionId];\n },\n notesCount() {\n if (this.discussion) {\n return this.discussion.notesCount();\n }\n\n return 0;\n },\n moreText() {\n const plusSign = this.notesCount < 100 ? '+' : '';\n\n return `${plusSign}${this.notesCount - this.shownAvatars}`;\n },\n },\n watch: {\n storeState: {\n handler() {\n this.$nextTick(() => {\n $('.has-tooltip', this.$el).tooltip('_fixTitle');\n\n // We need to add/remove a class to an element that is outside the Vue instance\n this.addNoCommentClass();\n });\n },\n deep: true,\n },\n },\n mounted() {\n this.$nextTick(() => {\n this.addNoCommentClass();\n this.setDiscussionVisible();\n\n this.lineType = $(this.$el)\n .closest('.diff-line-num')\n .hasClass('old_line')\n ? 'old'\n : 'new';\n });\n\n $(document).on('toggle.comments', () => {\n this.$nextTick(() => {\n this.setDiscussionVisible();\n });\n });\n },\n beforeDestroy() {\n this.addNoCommentClass();\n $(document).off('toggle.comments');\n },\n methods: {\n clickedAvatar(e) {\n Notes.instance.onAddDiffNote(e);\n\n // Toggle the active state of the toggle all button\n this.toggleDiscussionsToggleState();\n\n this.$nextTick(() => {\n this.setDiscussionVisible();\n\n $('.has-tooltip', this.$el).tooltip('_fixTitle');\n $('.has-tooltip', this.$el).tooltip('hide');\n });\n },\n addNoCommentClass() {\n const { notesCount } = this;\n\n $(this.$el)\n .closest('.js-avatar-container')\n .toggleClass('no-comment-btn', notesCount > 0)\n .nextUntil('.js-avatar-container')\n .toggleClass('no-comment-btn', notesCount > 0);\n },\n toggleDiscussionsToggleState() {\n const $notesHolders = $(this.$el)\n .closest('.code')\n .find('.notes_holder');\n const $visibleNotesHolders = $notesHolders.filter(':visible');\n const $toggleDiffCommentsBtn = $(this.$el)\n .closest('.diff-file')\n .find('.js-toggle-diff-comments');\n\n $toggleDiffCommentsBtn.toggleClass(\n 'active',\n $notesHolders.length === $visibleNotesHolders.length,\n );\n },\n setDiscussionVisible() {\n this.isVisible = $(`.diffs .notes[data-discussion-id=\"${this.discussion.id}\"]`).is(\n ':visible',\n );\n },\n getTooltipText(note) {\n return `${note.authorName}: ${note.noteTruncated}`;\n },\n },\n template: `\n
\n
\n \n \n shownAvatars\"\n class=\"diff-comments-more-count has-tooltip js-diff-comment-avatar\"\n data-container=\"body\"\n data-placement=\"top\"\n ref=\"extraComments\"\n role=\"button\"\n :data-line-type=\"lineType\"\n :title=\"extraNotesTitle\"\n @click=\"clickedAvatar($event)\">{{ moreText }}\n
\n \n
\n `,\n});\n\nVue.component('diff-note-avatars', DiffNoteAvatars);\n","/* global CommentsStore */\n\nimport Vue from 'vue';\n\nconst NewIssueForDiscussion = Vue.extend({\n props: {\n discussionId: {\n type: String,\n required: true,\n },\n },\n data() {\n return {\n discussions: CommentsStore.state,\n };\n },\n computed: {\n discussion() {\n return this.discussions[this.discussionId];\n },\n showButton() {\n if (this.discussion) return !this.discussion.isResolved();\n return false;\n },\n },\n});\n\nVue.component('new-issue-for-discussion-btn', NewIssueForDiscussion);\n","/* eslint-disable func-names, new-cap */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport './models/discussion';\nimport './models/note';\nimport './stores/comments';\nimport './services/resolve';\nimport './mixins/discussion';\nimport './components/comment_resolve_btn';\nimport './components/jump_to_discussion';\nimport './components/resolve_btn';\nimport './components/resolve_count';\nimport './components/resolve_discussion_btn';\nimport './components/diff_note_avatars';\nimport './components/new_issue_for_discussion';\n\nexport default () => {\n const projectPathHolder =\n document.querySelector('.merge-request') || document.querySelector('.commit-box');\n const { projectPath } = projectPathHolder.dataset;\n const COMPONENT_SELECTOR =\n 'resolve-btn, resolve-discussion-btn, jump-to-discussion, comment-and-resolve-btn, new-issue-for-discussion-btn';\n\n window.gl = window.gl || {};\n window.gl.diffNoteApps = {};\n\n window.ResolveService = new gl.DiffNotesResolveServiceClass(projectPath);\n\n gl.diffNotesCompileComponents = () => {\n $('diff-note-avatars').each(function() {\n const tmp = Vue.extend({\n template: $(this).get(0).outerHTML,\n });\n const tmpApp = new tmp().$mount();\n\n $(this).replaceWith(tmpApp.$el);\n $(tmpApp.$el).one('remove.vue', () => {\n tmpApp.$destroy();\n tmpApp.$el.remove();\n });\n });\n\n const $components = $(COMPONENT_SELECTOR).filter(function() {\n return $(this).closest('resolve-count').length !== 1;\n });\n\n if ($components) {\n $components.each(function() {\n const $this = $(this);\n const noteId = $this.attr(':note-id');\n const discussionId = $this.attr(':discussion-id');\n\n if ($this.is('comment-and-resolve-btn') && !discussionId) return;\n\n const tmp = Vue.extend({\n template: $this.get(0).outerHTML,\n });\n const tmpApp = new tmp().$mount();\n\n if (noteId) {\n gl.diffNoteApps[`note_${noteId}`] = tmpApp;\n }\n\n $this.replaceWith(tmpApp.$el);\n });\n }\n };\n\n gl.diffNotesCompileComponents();\n\n $(window).trigger('resize.nav');\n};\n","/* global Flash */\n\nimport $ from 'jquery';\nimport axios from './lib/utils/axios_utils';\nimport { n__, s__ } from './locale';\n\nexport function getHeaderText(childElementCount, mergeRequestCount) {\n if (childElementCount === 0) {\n return `${mergeRequestCount} ${n__('merge request', 'merge requests', mergeRequestCount)}`;\n }\n return ',';\n}\n\nexport function createHeader(childElementCount, mergeRequestCount) {\n const headerText = getHeaderText(childElementCount, mergeRequestCount);\n\n return $('', {\n class: 'append-right-5',\n text: headerText,\n });\n}\n\nexport function createLink(mergeRequest) {\n return $('', {\n class: 'append-right-5',\n href: mergeRequest.path,\n text: `!${mergeRequest.iid}`,\n });\n}\n\nexport function createTitle(mergeRequest) {\n return $('', {\n text: mergeRequest.title,\n });\n}\n\nexport function createItem(mergeRequest) {\n const $item = $('');\n const $link = createLink(mergeRequest);\n const $title = createTitle(mergeRequest);\n $item.append($link);\n $item.append($title);\n\n return $item;\n}\n\nexport function createContent(mergeRequests) {\n const $content = $('');\n\n if (mergeRequests.length === 0) {\n $content.text(s__('Commits|No related merge requests found'));\n } else {\n mergeRequests.forEach(mergeRequest => {\n const $header = createHeader($content.children().length, mergeRequests.length);\n const $item = createItem(mergeRequest);\n $content.append($header);\n $content.append($item);\n });\n }\n\n return $content;\n}\n\nexport function fetchCommitMergeRequests() {\n const $container = $('.merge-requests');\n\n axios\n .get($container.data('projectCommitPath'))\n .then(response => {\n const $content = createContent(response.data);\n\n $container.html($content);\n })\n .catch(() => Flash(s__('Commits|An error occurred while fetching merge requests data.')));\n}\n","/* eslint-disable no-new */\n\nimport $ from 'jquery';\nimport Diff from '~/diff';\nimport ZenMode from '~/zen_mode';\nimport ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';\nimport MiniPipelineGraph from '~/mini_pipeline_graph_dropdown';\nimport initNotes from '~/init_notes';\nimport initChangesDropdown from '~/init_changes_dropdown';\nimport initDiffNotes from '~/diff_notes/diff_notes_bundle';\nimport { fetchCommitMergeRequests } from '~/commit_merge_requests';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const hasPerfBar = document.querySelector('.with-performance-bar');\n const performanceHeight = hasPerfBar ? 35 : 0;\n new Diff();\n new ZenMode();\n new ShortcutsNavigation();\n new MiniPipelineGraph({\n container: '.js-commit-pipeline-graph',\n }).bindEvents();\n initNotes();\n initChangesDropdown(document.querySelector('.navbar-gitlab').offsetHeight + performanceHeight);\n $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath);\n fetchCommitMergeRequests();\n initDiffNotes();\n});\n","/*!\r\n * Stickyfill – `position: sticky` polyfill\r\n * v. 2.0.5 | https://github.com/wilddeer/stickyfill\r\n * MIT License\r\n */\r\n\r\n;(function(window, document) {\r\n 'use strict';\r\n \r\n /*\r\n * 1. Check if the browser supports `position: sticky` natively or is too old to run the polyfill.\r\n * If either of these is the case set `seppuku` flag. It will be checked later to disable key features\r\n * of the polyfill, but the API will remain functional to avoid breaking things.\r\n */\r\n \r\n var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n \r\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n \r\n var seppuku = false;\r\n \r\n // The polyfill cant’t function properly without `getComputedStyle`.\r\n if (!window.getComputedStyle) seppuku = true;\r\n // Dont’t get in a way if the browser supports `position: sticky` natively.\r\n else {\r\n var testNode = document.createElement('div');\r\n \r\n if (['', '-webkit-', '-moz-', '-ms-'].some(function (prefix) {\r\n try {\r\n testNode.style.position = prefix + 'sticky';\r\n } catch (e) {}\r\n \r\n return testNode.style.position != '';\r\n })) seppuku = true;\r\n }\r\n \r\n /*\r\n * 2. “Global” vars used across the polyfill\r\n */\r\n \r\n // Check if Shadow Root constructor exists to make further checks simpler\r\n var shadowRootExists = typeof ShadowRoot !== 'undefined';\r\n \r\n // Last saved scroll position\r\n var scroll = {\r\n top: null,\r\n left: null\r\n };\r\n \r\n // Array of created Sticky instances\r\n var stickies = [];\r\n \r\n /*\r\n * 3. Utility functions\r\n */\r\n function extend(targetObj, sourceObject) {\r\n for (var key in sourceObject) {\r\n if (sourceObject.hasOwnProperty(key)) {\r\n targetObj[key] = sourceObject[key];\r\n }\r\n }\r\n }\r\n \r\n function parseNumeric(val) {\r\n return parseFloat(val) || 0;\r\n }\r\n \r\n function getDocOffsetTop(node) {\r\n var docOffsetTop = 0;\r\n \r\n while (node) {\r\n docOffsetTop += node.offsetTop;\r\n node = node.offsetParent;\r\n }\r\n \r\n return docOffsetTop;\r\n }\r\n \r\n /*\r\n * 4. Sticky class\r\n */\r\n \r\n var Sticky = function () {\r\n function Sticky(node) {\r\n _classCallCheck(this, Sticky);\r\n \r\n if (!(node instanceof HTMLElement)) throw new Error('First argument must be HTMLElement');\r\n if (stickies.some(function (sticky) {\r\n return sticky._node === node;\r\n })) throw new Error('Stickyfill is already applied to this node');\r\n \r\n this._node = node;\r\n this._stickyMode = null;\r\n this._active = false;\r\n \r\n stickies.push(this);\r\n \r\n this.refresh();\r\n }\r\n \r\n _createClass(Sticky, [{\r\n key: 'refresh',\r\n value: function refresh() {\r\n if (seppuku || this._removed) return;\r\n if (this._active) this._deactivate();\r\n \r\n var node = this._node;\r\n \r\n /*\r\n * 1. Save node computed props\r\n */\r\n var nodeComputedStyle = getComputedStyle(node);\r\n var nodeComputedProps = {\r\n top: nodeComputedStyle.top,\r\n display: nodeComputedStyle.display,\r\n marginTop: nodeComputedStyle.marginTop,\r\n marginBottom: nodeComputedStyle.marginBottom,\r\n marginLeft: nodeComputedStyle.marginLeft,\r\n marginRight: nodeComputedStyle.marginRight,\r\n cssFloat: nodeComputedStyle.cssFloat\r\n };\r\n \r\n /*\r\n * 2. Check if the node can be activated\r\n */\r\n if (isNaN(parseFloat(nodeComputedProps.top)) || nodeComputedProps.display == 'table-cell' || nodeComputedProps.display == 'none') return;\r\n \r\n this._active = true;\r\n \r\n /*\r\n * 3. Get necessary node parameters\r\n */\r\n var referenceNode = node.parentNode;\r\n var parentNode = shadowRootExists && referenceNode instanceof ShadowRoot ? referenceNode.host : referenceNode;\r\n var nodeWinOffset = node.getBoundingClientRect();\r\n var parentWinOffset = parentNode.getBoundingClientRect();\r\n var parentComputedStyle = getComputedStyle(parentNode);\r\n \r\n this._parent = {\r\n node: parentNode,\r\n styles: {\r\n position: parentNode.style.position\r\n },\r\n offsetHeight: parentNode.offsetHeight\r\n };\r\n this._offsetToWindow = {\r\n left: nodeWinOffset.left,\r\n right: document.documentElement.clientWidth - nodeWinOffset.right\r\n };\r\n this._offsetToParent = {\r\n top: nodeWinOffset.top - parentWinOffset.top - parseNumeric(parentComputedStyle.borderTopWidth),\r\n left: nodeWinOffset.left - parentWinOffset.left - parseNumeric(parentComputedStyle.borderLeftWidth),\r\n right: -nodeWinOffset.right + parentWinOffset.right - parseNumeric(parentComputedStyle.borderRightWidth)\r\n };\r\n this._styles = {\r\n position: node.style.position,\r\n top: node.style.top,\r\n bottom: node.style.bottom,\r\n left: node.style.left,\r\n right: node.style.right,\r\n width: node.style.width,\r\n marginTop: node.style.marginTop,\r\n marginLeft: node.style.marginLeft,\r\n marginRight: node.style.marginRight\r\n };\r\n \r\n var nodeTopValue = parseNumeric(nodeComputedProps.top);\r\n this._limits = {\r\n start: nodeWinOffset.top + window.pageYOffset - nodeTopValue,\r\n end: parentWinOffset.top + window.pageYOffset + parentNode.offsetHeight - parseNumeric(parentComputedStyle.borderBottomWidth) - node.offsetHeight - nodeTopValue - parseNumeric(nodeComputedProps.marginBottom)\r\n };\r\n \r\n /*\r\n * 4. Ensure that the node will be positioned relatively to the parent node\r\n */\r\n var parentPosition = parentComputedStyle.position;\r\n \r\n if (parentPosition != 'absolute' && parentPosition != 'relative') {\r\n parentNode.style.position = 'relative';\r\n }\r\n \r\n /*\r\n * 5. Recalc node position.\r\n * It’s important to do this before clone injection to avoid scrolling bug in Chrome.\r\n */\r\n this._recalcPosition();\r\n \r\n /*\r\n * 6. Create a clone\r\n */\r\n var clone = this._clone = {};\r\n clone.node = document.createElement('div');\r\n \r\n // Apply styles to the clone\r\n extend(clone.node.style, {\r\n width: nodeWinOffset.right - nodeWinOffset.left + 'px',\r\n height: nodeWinOffset.bottom - nodeWinOffset.top + 'px',\r\n marginTop: nodeComputedProps.marginTop,\r\n marginBottom: nodeComputedProps.marginBottom,\r\n marginLeft: nodeComputedProps.marginLeft,\r\n marginRight: nodeComputedProps.marginRight,\r\n cssFloat: nodeComputedProps.cssFloat,\r\n padding: 0,\r\n border: 0,\r\n borderSpacing: 0,\r\n fontSize: '1em',\r\n position: 'static'\r\n });\r\n \r\n referenceNode.insertBefore(clone.node, node);\r\n clone.docOffsetTop = getDocOffsetTop(clone.node);\r\n }\r\n }, {\r\n key: '_recalcPosition',\r\n value: function _recalcPosition() {\r\n if (!this._active || this._removed) return;\r\n \r\n var stickyMode = scroll.top <= this._limits.start ? 'start' : scroll.top >= this._limits.end ? 'end' : 'middle';\r\n \r\n if (this._stickyMode == stickyMode) return;\r\n \r\n switch (stickyMode) {\r\n case 'start':\r\n extend(this._node.style, {\r\n position: 'absolute',\r\n left: this._offsetToParent.left + 'px',\r\n right: this._offsetToParent.right + 'px',\r\n top: this._offsetToParent.top + 'px',\r\n bottom: 'auto',\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 0\r\n });\r\n break;\r\n \r\n case 'middle':\r\n extend(this._node.style, {\r\n position: 'fixed',\r\n left: this._offsetToWindow.left + 'px',\r\n right: this._offsetToWindow.right + 'px',\r\n top: this._styles.top,\r\n bottom: 'auto',\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 0\r\n });\r\n break;\r\n \r\n case 'end':\r\n extend(this._node.style, {\r\n position: 'absolute',\r\n left: this._offsetToParent.left + 'px',\r\n right: this._offsetToParent.right + 'px',\r\n top: 'auto',\r\n bottom: 0,\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0\r\n });\r\n break;\r\n }\r\n \r\n this._stickyMode = stickyMode;\r\n }\r\n }, {\r\n key: '_fastCheck',\r\n value: function _fastCheck() {\r\n if (!this._active || this._removed) return;\r\n \r\n if (Math.abs(getDocOffsetTop(this._clone.node) - this._clone.docOffsetTop) > 1 || Math.abs(this._parent.node.offsetHeight - this._parent.offsetHeight) > 1) this.refresh();\r\n }\r\n }, {\r\n key: '_deactivate',\r\n value: function _deactivate() {\r\n var _this = this;\r\n \r\n if (!this._active || this._removed) return;\r\n \r\n this._clone.node.parentNode.removeChild(this._clone.node);\r\n delete this._clone;\r\n \r\n extend(this._node.style, this._styles);\r\n delete this._styles;\r\n \r\n // Check whether element’s parent node is used by other stickies.\r\n // If not, restore parent node’s styles.\r\n if (!stickies.some(function (sticky) {\r\n return sticky !== _this && sticky._parent && sticky._parent.node === _this._parent.node;\r\n })) {\r\n extend(this._parent.node.style, this._parent.styles);\r\n }\r\n delete this._parent;\r\n \r\n this._stickyMode = null;\r\n this._active = false;\r\n \r\n delete this._offsetToWindow;\r\n delete this._offsetToParent;\r\n delete this._limits;\r\n }\r\n }, {\r\n key: 'remove',\r\n value: function remove() {\r\n var _this2 = this;\r\n \r\n this._deactivate();\r\n \r\n stickies.some(function (sticky, index) {\r\n if (sticky._node === _this2._node) {\r\n stickies.splice(index, 1);\r\n return true;\r\n }\r\n });\r\n \r\n this._removed = true;\r\n }\r\n }]);\r\n \r\n return Sticky;\r\n }();\r\n \r\n /*\r\n * 5. Stickyfill API\r\n */\r\n \r\n \r\n var Stickyfill = {\r\n stickies: stickies,\r\n Sticky: Sticky,\r\n \r\n addOne: function addOne(node) {\r\n // Check whether it’s a node\r\n if (!(node instanceof HTMLElement)) {\r\n // Maybe it’s a node list of some sort?\r\n // Take first node from the list then\r\n if (node.length && node[0]) node = node[0];else return;\r\n }\r\n \r\n // Check if Stickyfill is already applied to the node\r\n // and return existing sticky\r\n for (var i = 0; i < stickies.length; i++) {\r\n if (stickies[i]._node === node) return stickies[i];\r\n }\r\n \r\n // Create and return new sticky\r\n return new Sticky(node);\r\n },\r\n add: function add(nodeList) {\r\n // If it’s a node make an array of one node\r\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n // Check if the argument is an iterable of some sort\r\n if (!nodeList.length) return;\r\n \r\n // Add every element as a sticky and return an array of created Sticky instances\r\n var addedStickies = [];\r\n \r\n var _loop = function _loop(i) {\r\n var node = nodeList[i];\r\n \r\n // If it’s not an HTMLElement – create an empty element to preserve 1-to-1\r\n // correlation with input list\r\n if (!(node instanceof HTMLElement)) {\r\n addedStickies.push(void 0);\r\n return 'continue';\r\n }\r\n \r\n // If Stickyfill is already applied to the node\r\n // add existing sticky\r\n if (stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n addedStickies.push(sticky);\r\n return true;\r\n }\r\n })) return 'continue';\r\n \r\n // Create and add new sticky\r\n addedStickies.push(new Sticky(node));\r\n };\r\n \r\n for (var i = 0; i < nodeList.length; i++) {\r\n var _ret = _loop(i);\r\n \r\n if (_ret === 'continue') continue;\r\n }\r\n \r\n return addedStickies;\r\n },\r\n refreshAll: function refreshAll() {\r\n stickies.forEach(function (sticky) {\r\n return sticky.refresh();\r\n });\r\n },\r\n removeOne: function removeOne(node) {\r\n // Check whether it’s a node\r\n if (!(node instanceof HTMLElement)) {\r\n // Maybe it’s a node list of some sort?\r\n // Take first node from the list then\r\n if (node.length && node[0]) node = node[0];else return;\r\n }\r\n \r\n // Remove the stickies bound to the nodes in the list\r\n stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n sticky.remove();\r\n return true;\r\n }\r\n });\r\n },\r\n remove: function remove(nodeList) {\r\n // If it’s a node make an array of one node\r\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n // Check if the argument is an iterable of some sort\r\n if (!nodeList.length) return;\r\n \r\n // Remove the stickies bound to the nodes in the list\r\n \r\n var _loop2 = function _loop2(i) {\r\n var node = nodeList[i];\r\n \r\n stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n sticky.remove();\r\n return true;\r\n }\r\n });\r\n };\r\n \r\n for (var i = 0; i < nodeList.length; i++) {\r\n _loop2(i);\r\n }\r\n },\r\n removeAll: function removeAll() {\r\n while (stickies.length) {\r\n stickies[0].remove();\r\n }\r\n }\r\n };\r\n \r\n /*\r\n * 6. Setup events (unless the polyfill was disabled)\r\n */\r\n function init() {\r\n // Watch for scroll position changes and trigger recalc/refresh if needed\r\n function checkScroll() {\r\n if (window.pageXOffset != scroll.left) {\r\n scroll.top = window.pageYOffset;\r\n scroll.left = window.pageXOffset;\r\n \r\n Stickyfill.refreshAll();\r\n } else if (window.pageYOffset != scroll.top) {\r\n scroll.top = window.pageYOffset;\r\n scroll.left = window.pageXOffset;\r\n \r\n // recalc position for all stickies\r\n stickies.forEach(function (sticky) {\r\n return sticky._recalcPosition();\r\n });\r\n }\r\n }\r\n \r\n checkScroll();\r\n window.addEventListener('scroll', checkScroll);\r\n \r\n // Watch for window resizes and device orientation changes and trigger refresh\r\n window.addEventListener('resize', Stickyfill.refreshAll);\r\n window.addEventListener('orientationchange', Stickyfill.refreshAll);\r\n \r\n //Fast dirty check for layout changes every 500ms\r\n var fastCheckTimer = void 0;\r\n \r\n function startFastCheckTimer() {\r\n fastCheckTimer = setInterval(function () {\r\n stickies.forEach(function (sticky) {\r\n return sticky._fastCheck();\r\n });\r\n }, 500);\r\n }\r\n \r\n function stopFastCheckTimer() {\r\n clearInterval(fastCheckTimer);\r\n }\r\n \r\n var docHiddenKey = void 0;\r\n var visibilityChangeEventName = void 0;\r\n \r\n if ('hidden' in document) {\r\n docHiddenKey = 'hidden';\r\n visibilityChangeEventName = 'visibilitychange';\r\n } else if ('webkitHidden' in document) {\r\n docHiddenKey = 'webkitHidden';\r\n visibilityChangeEventName = 'webkitvisibilitychange';\r\n }\r\n \r\n if (visibilityChangeEventName) {\r\n if (!document[docHiddenKey]) startFastCheckTimer();\r\n \r\n document.addEventListener(visibilityChangeEventName, function () {\r\n if (document[docHiddenKey]) {\r\n stopFastCheckTimer();\r\n } else {\r\n startFastCheckTimer();\r\n }\r\n });\r\n } else startFastCheckTimer();\r\n }\r\n \r\n if (!seppuku) init();\r\n \r\n /*\r\n * 7. Expose Stickyfill\r\n */\r\n if (typeof module != 'undefined' && module.exports) {\r\n module.exports = Stickyfill;\r\n } else {\r\n window.Stickyfill = Stickyfill;\r\n }\r\n \r\n})(window, document);","import DropLab from './droplab/drop_lab';\nimport ISetter from './droplab/plugins/input_setter';\n\n// Todo: Remove this when fixing issue in input_setter plugin\nconst InputSetter = Object.assign({}, ISetter);\n\nclass CommentTypeToggle {\n constructor(opts = {}) {\n this.dropdownTrigger = opts.dropdownTrigger;\n this.dropdownList = opts.dropdownList;\n this.noteTypeInput = opts.noteTypeInput;\n this.submitButton = opts.submitButton;\n this.closeButton = opts.closeButton;\n this.reopenButton = opts.reopenButton;\n }\n\n initDroplab() {\n this.droplab = new DropLab();\n\n const config = this.setConfig();\n\n this.droplab.init(this.dropdownTrigger, this.dropdownList, [InputSetter], config);\n }\n\n setConfig() {\n const config = {\n InputSetter: [\n {\n input: this.noteTypeInput,\n valueAttribute: 'data-value',\n },\n {\n input: this.submitButton,\n valueAttribute: 'data-submit-text',\n },\n ],\n };\n\n if (this.closeButton) {\n config.InputSetter.push(\n {\n input: this.closeButton,\n valueAttribute: 'data-close-text',\n },\n {\n input: this.closeButton,\n valueAttribute: 'data-close-text',\n inputAttribute: 'data-alternative-text',\n },\n );\n }\n\n if (this.reopenButton) {\n config.InputSetter.push(\n {\n input: this.reopenButton,\n valueAttribute: 'data-reopen-text',\n },\n {\n input: this.reopenButton,\n valueAttribute: 'data-reopen-text',\n inputAttribute: 'data-alternative-text',\n },\n );\n }\n\n return config;\n }\n}\n\nexport default CommentTypeToggle;\n","/* eslint-disable no-restricted-properties, func-names, no-var, camelcase,\nno-unused-expressions, one-var, default-case,\nprefer-template, consistent-return, no-alert, no-return-assign,\nno-param-reassign, prefer-arrow-callback, no-else-return, vars-on-top,\nno-unused-vars, no-shadow, no-useless-escape, class-methods-use-this */\n\n/* global ResolveService */\n/* global mrRefreshWidgetUrl */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport Cookies from 'js-cookie';\nimport Autosize from 'autosize';\nimport 'vendor/jquery.caret'; // required by jquery.atwho\nimport 'vendor/jquery.atwho';\nimport AjaxCache from '~/lib/utils/ajax_cache';\nimport Vue from 'vue';\nimport syntaxHighlight from '~/syntax_highlight';\nimport { GlSkeletonLoading } from '@gitlab/ui';\nimport axios from './lib/utils/axios_utils';\nimport { getLocationHash } from './lib/utils/url_utility';\nimport Flash from './flash';\nimport { defaultAutocompleteConfig } from './gfm_auto_complete';\nimport CommentTypeToggle from './comment_type_toggle';\nimport GLForm from './gl_form';\nimport loadAwardsHandler from './awards_handler';\nimport Autosave from './autosave';\nimport TaskList from './task_list';\nimport {\n isInViewport,\n getPagePath,\n scrollToElement,\n isMetaKey,\n isInMRPage,\n} from './lib/utils/common_utils';\nimport imageDiffHelper from './image_diff/helpers/index';\nimport { localTimeAgo } from './lib/utils/datetime_utility';\n\nwindow.autosize = Autosize;\n\nfunction normalizeNewlines(str) {\n return str.replace(/\\r\\n/g, '\\n');\n}\n\nconst MAX_VISIBLE_COMMIT_LIST_COUNT = 3;\nconst REGEX_QUICK_ACTIONS = /^\\/\\w+.*$/gm;\n\nexport default class Notes {\n static initialize(notes_url, note_ids, last_fetched_at, view, enableGFM) {\n if (!this.instance) {\n this.instance = new Notes(notes_url, note_ids, last_fetched_at, view, enableGFM);\n }\n }\n\n static getInstance() {\n return this.instance;\n }\n\n constructor(notes_url, note_ids, last_fetched_at, view, enableGFM = defaultAutocompleteConfig) {\n this.updateTargetButtons = this.updateTargetButtons.bind(this);\n this.updateComment = this.updateComment.bind(this);\n this.visibilityChange = this.visibilityChange.bind(this);\n this.cancelDiscussionForm = this.cancelDiscussionForm.bind(this);\n this.onAddDiffNote = this.onAddDiffNote.bind(this);\n this.onAddImageDiffNote = this.onAddImageDiffNote.bind(this);\n this.setupDiscussionNoteForm = this.setupDiscussionNoteForm.bind(this);\n this.onReplyToDiscussionNote = this.onReplyToDiscussionNote.bind(this);\n this.removeNote = this.removeNote.bind(this);\n this.cancelEdit = this.cancelEdit.bind(this);\n this.updateNote = this.updateNote.bind(this);\n this.addDiscussionNote = this.addDiscussionNote.bind(this);\n this.addNoteError = this.addNoteError.bind(this);\n this.addNote = this.addNote.bind(this);\n this.resetMainTargetForm = this.resetMainTargetForm.bind(this);\n this.refresh = this.refresh.bind(this);\n this.keydownNoteText = this.keydownNoteText.bind(this);\n this.toggleCommitList = this.toggleCommitList.bind(this);\n this.postComment = this.postComment.bind(this);\n this.clearFlashWrapper = this.clearFlash.bind(this);\n this.onHashChange = this.onHashChange.bind(this);\n\n this.notes_url = notes_url;\n this.note_ids = note_ids;\n this.enableGFM = enableGFM;\n // Used to keep track of updated notes while people are editing things\n this.updatedNotesTrackingMap = {};\n this.last_fetched_at = last_fetched_at;\n this.noteable_url = document.URL;\n this.notesCountBadge ||\n (this.notesCountBadge = $('.issuable-details').find('.notes-tab .badge'));\n this.basePollingInterval = 15000;\n this.maxPollingSteps = 4;\n\n this.$wrapperEl = isInMRPage() ? $(document).find('.diffs') : $(document);\n this.cleanBinding();\n this.addBinding();\n this.setPollingInterval();\n this.setupMainTargetNoteForm(enableGFM);\n this.taskList = new TaskList({\n dataType: 'note',\n fieldName: 'note',\n selector: '.notes',\n });\n this.collapseLongCommitList();\n this.setViewType(view);\n\n // We are in the Merge Requests page so we need another edit form for Changes tab\n if (getPagePath(1) === 'merge_requests') {\n $('.note-edit-form')\n .clone()\n .addClass('mr-note-edit-form')\n .insertAfter('.note-edit-form');\n }\n\n const hash = getLocationHash();\n const $anchor = hash && document.getElementById(hash);\n\n if ($anchor) {\n this.loadLazyDiff({ currentTarget: $anchor });\n }\n }\n\n setViewType(view) {\n this.view = Cookies.get('diff_view') || view;\n }\n\n addBinding() {\n // Edit note link\n this.$wrapperEl.on('click', '.js-note-edit', this.showEditForm.bind(this));\n this.$wrapperEl.on('click', '.note-edit-cancel', this.cancelEdit);\n // Reopen and close actions for Issue/MR combined with note form submit\n this.$wrapperEl.on('click', '.js-comment-submit-button', this.postComment);\n this.$wrapperEl.on('click', '.js-comment-save-button', this.updateComment);\n this.$wrapperEl.on('keyup input', '.js-note-text', this.updateTargetButtons);\n // resolve a discussion\n this.$wrapperEl.on('click', '.js-comment-resolve-button', this.postComment);\n // remove a note (in general)\n this.$wrapperEl.on('click', '.js-note-delete', this.removeNote);\n // delete note attachment\n this.$wrapperEl.on('click', '.js-note-attachment-delete', this.removeAttachment);\n // update the file name when an attachment is selected\n this.$wrapperEl.on('change', '.js-note-attachment-input', this.updateFormAttachment);\n // reply to diff/discussion notes\n this.$wrapperEl.on('click', '.js-discussion-reply-button', this.onReplyToDiscussionNote);\n // add diff note\n this.$wrapperEl.on('click', '.js-add-diff-note-button', this.onAddDiffNote);\n // add diff note for images\n this.$wrapperEl.on('click', '.js-add-image-diff-note-button', this.onAddImageDiffNote);\n // hide diff note form\n this.$wrapperEl.on('click', '.js-close-discussion-note-form', this.cancelDiscussionForm);\n // toggle commit list\n this.$wrapperEl.on('click', '.system-note-commit-list-toggler', this.toggleCommitList);\n\n this.$wrapperEl.on('click', '.js-toggle-lazy-diff', this.loadLazyDiff);\n this.$wrapperEl.on(\n 'click',\n '.js-toggle-lazy-diff-retry-button',\n this.onClickRetryLazyLoad.bind(this),\n );\n\n // fetch notes when tab becomes visible\n this.$wrapperEl.on('visibilitychange', this.visibilityChange);\n // when issue status changes, we need to refresh data\n this.$wrapperEl.on('issuable:change', this.refresh);\n // ajax:events that happen on Form when actions like Reopen, Close are performed on Issues and MRs.\n this.$wrapperEl.on('ajax:success', '.js-main-target-form', this.addNote);\n this.$wrapperEl.on('ajax:success', '.js-discussion-note-form', this.addDiscussionNote);\n this.$wrapperEl.on('ajax:success', '.js-main-target-form', this.resetMainTargetForm);\n this.$wrapperEl.on(\n 'ajax:complete',\n '.js-main-target-form',\n this.reenableTargetFormSubmitButton,\n );\n // when a key is clicked on the notes\n this.$wrapperEl.on('keydown', '.js-note-text', this.keydownNoteText);\n // When the URL fragment/hash has changed, `#note_xxx`\n $(window).on('hashchange', this.onHashChange);\n }\n\n cleanBinding() {\n this.$wrapperEl.off('click', '.js-note-edit');\n this.$wrapperEl.off('click', '.note-edit-cancel');\n this.$wrapperEl.off('click', '.js-note-delete');\n this.$wrapperEl.off('click', '.js-note-attachment-delete');\n this.$wrapperEl.off('click', '.js-discussion-reply-button');\n this.$wrapperEl.off('click', '.js-add-diff-note-button');\n this.$wrapperEl.off('click', '.js-add-image-diff-note-button');\n this.$wrapperEl.off('visibilitychange');\n this.$wrapperEl.off('keyup input', '.js-note-text');\n this.$wrapperEl.off('click', '.js-note-target-reopen');\n this.$wrapperEl.off('click', '.js-note-target-close');\n this.$wrapperEl.off('keydown', '.js-note-text');\n this.$wrapperEl.off('click', '.js-comment-resolve-button');\n this.$wrapperEl.off('click', '.system-note-commit-list-toggler');\n this.$wrapperEl.off('click', '.js-toggle-lazy-diff');\n this.$wrapperEl.off('click', '.js-toggle-lazy-diff-retry-button');\n this.$wrapperEl.off('ajax:success', '.js-main-target-form');\n this.$wrapperEl.off('ajax:success', '.js-discussion-note-form');\n this.$wrapperEl.off('ajax:complete', '.js-main-target-form');\n $(window).off('hashchange', this.onHashChange);\n }\n\n static initCommentTypeToggle(form) {\n const dropdownTrigger = form.querySelector('.js-comment-type-dropdown .dropdown-toggle');\n const dropdownList = form.querySelector('.js-comment-type-dropdown .dropdown-menu');\n const noteTypeInput = form.querySelector('#note_type');\n const submitButton = form.querySelector('.js-comment-type-dropdown .js-comment-submit-button');\n const closeButton = form.querySelector('.js-note-target-close');\n const reopenButton = form.querySelector('.js-note-target-reopen');\n\n const commentTypeToggle = new CommentTypeToggle({\n dropdownTrigger,\n dropdownList,\n noteTypeInput,\n submitButton,\n closeButton,\n reopenButton,\n });\n\n commentTypeToggle.initDroplab();\n }\n\n keydownNoteText(e) {\n var $textarea,\n discussionNoteForm,\n editNote,\n myLastNote,\n myLastNoteEditBtn,\n newText,\n originalText;\n if (isMetaKey(e)) {\n return;\n }\n\n $textarea = $(e.target);\n // Edit previous note when UP arrow is hit\n switch (e.which) {\n case 38:\n if ($textarea.val() !== '') {\n return;\n }\n myLastNote = $(\n `li.note[data-author-id='${gon.current_user_id}'][data-editable]:last`,\n $textarea.closest('.note, .notes_holder, #notes'),\n );\n if (myLastNote.length) {\n myLastNoteEditBtn = myLastNote.find('.js-note-edit');\n return myLastNoteEditBtn.trigger('click', [true, myLastNote]);\n }\n break;\n // Cancel creating diff note or editing any note when ESCAPE is hit\n case 27:\n discussionNoteForm = $textarea.closest('.js-discussion-note-form');\n if (discussionNoteForm.length) {\n if ($textarea.val() !== '') {\n if (!window.confirm('Are you sure you want to cancel creating this comment?')) {\n return;\n }\n }\n this.removeDiscussionNoteForm(discussionNoteForm);\n return;\n }\n editNote = $textarea.closest('.note');\n if (editNote.length) {\n originalText = $textarea.closest('form').data('originalNote');\n newText = $textarea.val();\n if (originalText !== newText) {\n if (!window.confirm('Are you sure you want to cancel editing this comment?')) {\n return;\n }\n }\n return this.removeNoteEditForm(editNote);\n }\n }\n }\n\n initRefresh() {\n if (Notes.interval) {\n clearInterval(Notes.interval);\n }\n return (Notes.interval = setInterval(\n (function(_this) {\n return function() {\n return _this.refresh();\n };\n })(this),\n this.pollingInterval,\n ));\n }\n\n refresh() {\n if (!document.hidden) {\n return this.getContent();\n }\n }\n\n getContent() {\n if (this.refreshing) {\n return;\n }\n\n this.refreshing = true;\n\n axios\n .get(`${this.notes_url}?html=true`, {\n headers: {\n 'X-Last-Fetched-At': this.last_fetched_at,\n },\n })\n .then(({ data }) => {\n const { notes } = data;\n this.last_fetched_at = data.last_fetched_at;\n this.setPollingInterval(data.notes.length);\n $.each(notes, (i, note) => this.renderNote(note));\n\n this.refreshing = false;\n })\n .catch(() => {\n this.refreshing = false;\n });\n }\n\n /**\n * Increase @pollingInterval up to 120 seconds on every function call,\n * if `shouldReset` has a truthy value, 'null' or 'undefined' the variable\n * will reset to @basePollingInterval.\n *\n * Note: this function is used to gradually increase the polling interval\n * if there aren't new notes coming from the server\n */\n setPollingInterval(shouldReset) {\n var nthInterval;\n if (shouldReset == null) {\n shouldReset = true;\n }\n nthInterval = this.basePollingInterval * Math.pow(2, this.maxPollingSteps - 1);\n if (shouldReset) {\n this.pollingInterval = this.basePollingInterval;\n } else if (this.pollingInterval < nthInterval) {\n this.pollingInterval *= 2;\n }\n return this.initRefresh();\n }\n\n handleQuickActions(noteEntity) {\n var votesBlock;\n if (noteEntity.commands_changes) {\n if ('merge' in noteEntity.commands_changes) {\n Notes.checkMergeRequestStatus();\n }\n\n if ('emoji_award' in noteEntity.commands_changes) {\n votesBlock = $('.js-awards-block').eq(0);\n\n loadAwardsHandler()\n .then(awardsHandler => {\n awardsHandler.addAwardToEmojiBar(votesBlock, noteEntity.commands_changes.emoji_award);\n awardsHandler.scrollToAwards();\n })\n .catch(() => {\n // ignore\n });\n }\n }\n }\n\n setupNewNote($note) {\n // Update datetime format on the recent note\n localTimeAgo($note.find('.js-timeago'), false);\n\n this.collapseLongCommitList();\n this.taskList.init();\n\n // This stops the note highlight, #note_xxx`, from being removed after real time update\n // The `:target` selector does not re-evaluate after we replace element in the DOM\n Notes.updateNoteTargetSelector($note);\n this.$noteToCleanHighlight = $note;\n }\n\n onHashChange() {\n if (this.$noteToCleanHighlight) {\n Notes.updateNoteTargetSelector(this.$noteToCleanHighlight);\n }\n\n this.$noteToCleanHighlight = null;\n }\n\n static updateNoteTargetSelector($note) {\n const hash = getLocationHash();\n // Needs to be an explicit true/false for the jQuery `toggleClass(force)`\n const addTargetClass = Boolean(hash && $note.filter(`#${hash}`).length > 0);\n $note.toggleClass('target', addTargetClass);\n }\n\n /**\n * Render note in main comments area.\n *\n * Note: for rendering inline notes use renderDiscussionNote\n */\n renderNote(noteEntity, $form, $notesList = $('.main-notes-list')) {\n if (noteEntity.discussion_html) {\n return this.renderDiscussionNote(noteEntity, $form);\n }\n\n if (!noteEntity.valid) {\n if (noteEntity.errors && noteEntity.errors.commands_only) {\n if (noteEntity.commands_changes && Object.keys(noteEntity.commands_changes).length > 0) {\n $notesList.find('.system-note.being-posted').remove();\n }\n this.addFlash(noteEntity.errors.commands_only, 'notice', this.parentTimeline.get(0));\n this.refresh();\n }\n return;\n }\n\n const $note = $notesList.find(`#note_${noteEntity.id}`);\n if (Notes.isNewNote(noteEntity, this.note_ids)) {\n if (isInMRPage()) {\n return;\n }\n\n this.note_ids.push(noteEntity.id);\n\n if ($notesList.length) {\n $notesList.find('.system-note.being-posted').remove();\n }\n const $newNote = Notes.animateAppendNote(noteEntity.html, $notesList);\n\n this.setupNewNote($newNote);\n this.refresh();\n return this.updateNotesCount(1);\n } else if (Notes.isUpdatedNote(noteEntity, $note)) {\n // The server can send the same update multiple times so we need to make sure to only update once per actual update.\n const isEditing = $note.hasClass('is-editing');\n const initialContent = normalizeNewlines(\n $note\n .find('.original-note-content')\n .text()\n .trim(),\n );\n const $textarea = $note.find('.js-note-text');\n const currentContent = $textarea.val();\n // There can be CRLF vs LF mismatches if we don't sanitize and compare the same way\n const sanitizedNoteNote = normalizeNewlines(noteEntity.note);\n const isTextareaUntouched =\n currentContent === initialContent || currentContent === sanitizedNoteNote;\n\n if (isEditing && isTextareaUntouched) {\n $textarea.val(noteEntity.note);\n this.updatedNotesTrackingMap[noteEntity.id] = noteEntity;\n } else if (isEditing && !isTextareaUntouched) {\n this.putConflictEditWarningInPlace(noteEntity, $note);\n this.updatedNotesTrackingMap[noteEntity.id] = noteEntity;\n } else {\n const $updatedNote = Notes.animateUpdateNote(noteEntity.html, $note);\n this.setupNewNote($updatedNote);\n }\n }\n }\n\n isParallelView() {\n return Cookies.get('diff_view') === 'parallel';\n }\n\n /**\n * Render note in discussion area. To render inline notes use renderDiscussionNote.\n */\n renderDiscussionNote(noteEntity, $form) {\n var discussionContainer, form, row, lineType, diffAvatarContainer;\n\n if (!Notes.isNewNote(noteEntity, this.note_ids)) {\n return;\n }\n this.note_ids.push(noteEntity.id);\n\n form = $form || $(`.js-discussion-note-form[data-discussion-id=\"${noteEntity.discussion_id}\"]`);\n row =\n form.length || !noteEntity.discussion_line_code\n ? form.closest('tr')\n : $(`#${noteEntity.discussion_line_code}`);\n\n if (noteEntity.on_image) {\n row = form;\n }\n\n lineType = this.isParallelView() ? form.find('#line_type').val() : 'old';\n diffAvatarContainer = row\n .prevAll('.line_holder')\n .first()\n .find('.js-avatar-container.' + lineType + '_line');\n // is this the first note of discussion?\n discussionContainer = $(`.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`);\n if (!discussionContainer.length) {\n discussionContainer = form.closest('.discussion').find('.notes');\n }\n if (discussionContainer.length === 0) {\n if (noteEntity.diff_discussion_html) {\n var $discussion = $(noteEntity.diff_discussion_html).renderGFM();\n\n if (!this.isParallelView() || row.hasClass('js-temp-notes-holder') || noteEntity.on_image) {\n // insert the note and the reply button after the temp row\n row.after($discussion);\n } else {\n // Merge new discussion HTML in\n var $notes = $discussion.find(`.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`);\n var contentContainerClass =\n '.' +\n $notes\n .closest('.notes_content')\n .attr('class')\n .split(' ')\n .join('.');\n\n row\n .find(contentContainerClass + ' .content')\n .append($notes.closest('.content').children());\n }\n } else {\n Notes.animateAppendNote(noteEntity.discussion_html, $('.main-notes-list'));\n }\n } else {\n // append new note to all matching discussions\n Notes.animateAppendNote(noteEntity.html, discussionContainer);\n }\n\n if (typeof gl.diffNotesCompileComponents !== 'undefined' && noteEntity.discussion_resolvable) {\n gl.diffNotesCompileComponents();\n\n this.renderDiscussionAvatar(diffAvatarContainer, noteEntity);\n }\n\n localTimeAgo($('.js-timeago'), false);\n Notes.checkMergeRequestStatus();\n return this.updateNotesCount(1);\n }\n\n getLineHolder(changesDiscussionContainer) {\n return $(changesDiscussionContainer)\n .closest('.notes_holder')\n .prevAll('.line_holder')\n .first()\n .get(0);\n }\n\n renderDiscussionAvatar(diffAvatarContainer, noteEntity) {\n var avatarHolder = diffAvatarContainer.find('.diff-comment-avatar-holders');\n\n if (!avatarHolder.length) {\n avatarHolder = document.createElement('diff-note-avatars');\n avatarHolder.setAttribute('discussion-id', noteEntity.discussion_id);\n\n diffAvatarContainer.append(avatarHolder);\n\n gl.diffNotesCompileComponents();\n }\n }\n\n /**\n * Called in response the main target form has been successfully submitted.\n *\n * Removes any errors.\n * Resets text and preview.\n * Resets buttons.\n */\n resetMainTargetForm(e) {\n var form;\n form = $('.js-main-target-form');\n // remove validation errors\n form.find('.js-errors').remove();\n // reset text and preview\n form.find('.js-md-write-button').click();\n form\n .find('.js-note-text')\n .val('')\n .trigger('input');\n form\n .find('.js-note-text')\n .data('autosave')\n .reset();\n\n var event = document.createEvent('Event');\n event.initEvent('autosize:update', true, false);\n form.find('.js-autosize')[0].dispatchEvent(event);\n\n this.updateTargetButtons(e);\n }\n\n reenableTargetFormSubmitButton() {\n var form;\n form = $('.js-main-target-form');\n return form.find('.js-note-text').trigger('input');\n }\n\n /**\n * Shows the main form and does some setup on it.\n *\n * Sets some hidden fields in the form.\n */\n setupMainTargetNoteForm(enableGFM) {\n var form;\n // find the form\n form = $('.js-new-note-form');\n // Set a global clone of the form for later cloning\n this.formClone = form.clone();\n // show the form\n this.setupNoteForm(form, enableGFM);\n // fix classes\n form.removeClass('js-new-note-form');\n form.addClass('js-main-target-form');\n form.find('#note_line_code').remove();\n form.find('#note_position').remove();\n form.find('#note_type').val('');\n form.find('#note_project_id').remove();\n form.find('#in_reply_to_discussion_id').remove();\n form\n .find('.js-comment-resolve-button')\n .closest('comment-and-resolve-btn')\n .remove();\n this.parentTimeline = form.parents('.timeline');\n\n if (form.length) {\n Notes.initCommentTypeToggle(form.get(0));\n }\n }\n\n /**\n * General note form setup.\n *\n * deactivates the submit button when text is empty\n * hides the preview button when text is empty\n * set up GFM auto complete\n * show the form\n */\n setupNoteForm(form, enableGFM = defaultAutocompleteConfig) {\n var textarea, key;\n this.glForm = new GLForm(form, enableGFM);\n textarea = form.find('.js-note-text');\n key = [\n 'Note',\n form.find('#note_noteable_type').val(),\n form.find('#note_noteable_id').val(),\n form.find('#note_commit_id').val(),\n form.find('#note_type').val(),\n form.find('#note_project_id').val(),\n form.find('#in_reply_to_discussion_id').val(),\n\n // LegacyDiffNote\n form.find('#note_line_code').val(),\n\n // DiffNote\n form.find('#note_position').val(),\n ];\n return new Autosave(textarea, key);\n }\n\n /**\n * Called in response to the new note form being submitted\n *\n * Adds new note to list.\n */\n addNote($form, note) {\n return this.renderNote(note);\n }\n\n addNoteError($form) {\n let formParentTimeline;\n if ($form.hasClass('js-main-target-form')) {\n formParentTimeline = $form.parents('.timeline');\n } else if ($form.hasClass('js-discussion-note-form')) {\n formParentTimeline = $form.closest('.discussion-notes').find('.notes');\n }\n return this.addFlash(\n 'Your comment could not be submitted! Please check your network connection and try again.',\n 'alert',\n formParentTimeline.get(0),\n );\n }\n\n updateNoteError($parentTimeline) {\n // eslint-disable-next-line no-new\n new Flash(\n 'Your comment could not be updated! Please check your network connection and try again.',\n );\n }\n\n /**\n * Called in response to the new note form being submitted\n *\n * Adds new note to list.\n */\n addDiscussionNote($form, note, isNewDiffComment) {\n if ($form.attr('data-resolve-all') != null) {\n var projectPath = $form.data('projectPath');\n var discussionId = $form.data('discussionId');\n var mergeRequestId = $form.data('noteableIid');\n\n if (ResolveService != null) {\n ResolveService.toggleResolveForDiscussion(mergeRequestId, discussionId);\n }\n }\n\n this.renderNote(note, $form);\n // cleanup after successfully creating a diff/discussion note\n if (isNewDiffComment) {\n this.removeDiscussionNoteForm($form);\n }\n }\n\n /**\n * Called in response to the edit note form being submitted\n *\n * Updates the current note field.\n */\n updateNote(noteEntity, $targetNote) {\n var $noteEntityEl, $note_li;\n // Convert returned HTML to a jQuery object so we can modify it further\n $noteEntityEl = $(noteEntity.html);\n this.revertNoteEditForm($targetNote);\n $noteEntityEl.renderGFM();\n // Find the note's `li` element by ID and replace it with the updated HTML\n $note_li = $('.note-row-' + noteEntity.id);\n\n $note_li.replaceWith($noteEntityEl);\n this.setupNewNote($noteEntityEl);\n\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n gl.diffNotesCompileComponents();\n }\n }\n\n checkContentToAllowEditing($el) {\n var initialContent = $el\n .find('.original-note-content')\n .text()\n .trim();\n var currentContent = $el.find('.js-note-text').val();\n var isAllowed = true;\n\n if (currentContent === initialContent) {\n this.removeNoteEditForm($el);\n } else {\n var $buttons = $el.find('.note-form-actions');\n var isWidgetVisible = isInViewport($el.get(0));\n\n if (!isWidgetVisible) {\n scrollToElement($el);\n }\n\n $el.find('.js-finish-edit-warning').show();\n isAllowed = false;\n }\n\n return isAllowed;\n }\n\n /**\n * Called in response to clicking the edit note link\n *\n * Replaces the note text with the note edit form\n * Adds a data attribute to the form with the original content of the note for cancellations\n */\n showEditForm(e, scrollTo, myLastNote) {\n e.preventDefault();\n\n var $target = $(e.target);\n var $editForm = $(this.getEditFormSelector($target));\n var $note = $target.closest('.note');\n var $currentlyEditing = $('.note.is-editing:visible');\n\n if ($currentlyEditing.length) {\n var isEditAllowed = this.checkContentToAllowEditing($currentlyEditing);\n\n if (!isEditAllowed) {\n return;\n }\n }\n\n $note.find('.js-note-attachment-delete').show();\n $editForm.addClass('current-note-edit-form');\n $note.addClass('is-editing');\n this.putEditFormInPlace($target);\n }\n\n /**\n * Called in response to clicking the edit note link\n *\n * Hides edit form and restores the original note text to the editor textarea.\n */\n cancelEdit(e) {\n e.preventDefault();\n const $target = $(e.target);\n const $note = $target.closest('.note');\n const noteId = $note.attr('data-note-id');\n\n this.revertNoteEditForm($target);\n\n if (this.updatedNotesTrackingMap[noteId]) {\n const $newNote = $(this.updatedNotesTrackingMap[noteId].html);\n $note.replaceWith($newNote);\n this.setupNewNote($newNote);\n // Now that we have taken care of the update, clear it out\n delete this.updatedNotesTrackingMap[noteId];\n } else {\n $note.find('.js-finish-edit-warning').hide();\n this.removeNoteEditForm($note);\n }\n }\n\n revertNoteEditForm($target) {\n $target = $target || $('.note.is-editing:visible');\n var selector = this.getEditFormSelector($target);\n var $editForm = $(selector);\n\n $editForm.insertBefore('.diffs');\n $editForm.find('.js-comment-save-button').enable();\n $editForm.find('.js-finish-edit-warning').hide();\n }\n\n getEditFormSelector($el) {\n var selector = '.note-edit-form:not(.mr-note-edit-form)';\n\n if ($el.parents('#diffs').length) {\n selector = '.note-edit-form.mr-note-edit-form';\n }\n\n return selector;\n }\n\n removeNoteEditForm($note) {\n var form = $note.find('.diffs .current-note-edit-form');\n\n $note.removeClass('is-editing');\n form.removeClass('current-note-edit-form');\n form.find('.js-finish-edit-warning').hide();\n // Replace markdown textarea text with original note text.\n return form.find('.js-note-text').val(form.find('form.edit-note').data('originalNote'));\n }\n\n /**\n * Called in response to deleting a note of any kind.\n *\n * Removes the actual note from view.\n * Removes the whole discussion if the last note is being removed.\n */\n removeNote(e) {\n var noteElId, noteId, dataNoteId, $note, lineHolder;\n $note = $(e.currentTarget).closest('.note');\n noteElId = $note.attr('id');\n noteId = $note.attr('data-note-id');\n lineHolder = $(e.currentTarget)\n .closest('.notes[data-discussion-id]')\n .closest('.notes_holder')\n .prev('.line_holder');\n $(`.note[id=\"${noteElId}\"]`).each(\n (function(_this) {\n // A same note appears in the \"Discussion\" and in the \"Changes\" tab, we have\n // to remove all. Using $('.note[id='noteId']') ensure we get all the notes,\n // where $('#noteId') would return only one.\n return function(i, el) {\n var $note, $notes;\n $note = $(el);\n $notes = $note.closest('.discussion-notes');\n const discussionId = $('.notes', $notes).data('discussionId');\n\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n if (gl.diffNoteApps[noteElId]) {\n gl.diffNoteApps[noteElId].$destroy();\n }\n }\n\n $note.remove();\n\n // check if this is the last note for this line\n if ($notes.find('.note').length === 0) {\n var notesTr = $notes.closest('tr');\n\n // \"Discussions\" tab\n $notes.closest('.timeline-entry').remove();\n\n $(`.js-diff-avatars-${discussionId}`).trigger('remove.vue');\n\n // The notes tr can contain multiple lists of notes, like on the parallel diff\n // notesTr does not exist for image diffs\n if (notesTr.find('.discussion-notes').length > 1 || notesTr.length === 0) {\n const $diffFile = $notes.closest('.diff-file');\n if ($diffFile.length > 0) {\n const removeBadgeEvent = new CustomEvent('removeBadge.imageDiff', {\n detail: {\n // badgeNumber's start with 1 and index starts with 0\n badgeNumber: $notes.index() + 1,\n },\n });\n\n $diffFile[0].dispatchEvent(removeBadgeEvent);\n }\n\n $notes.remove();\n } else if (notesTr.length > 0) {\n notesTr.remove();\n }\n }\n };\n })(this),\n );\n\n Notes.checkMergeRequestStatus();\n return this.updateNotesCount(-1);\n }\n\n /**\n * Called in response to clicking the delete attachment link\n *\n * Removes the attachment wrapper view, including image tag if it exists\n * Resets the note editing form\n */\n removeAttachment() {\n const $note = $(this).closest('.note');\n $note.find('.note-attachment').remove();\n $note.find('.note-body > .note-text').show();\n $note.find('.note-header').show();\n return $note.find('.diffs .current-note-edit-form').remove();\n }\n\n /**\n * Called when clicking on the \"reply\" button for a diff line.\n *\n * Shows the note form below the notes.\n */\n onReplyToDiscussionNote(e) {\n this.replyToDiscussionNote(e.target);\n }\n\n replyToDiscussionNote(target) {\n var form, replyLink;\n form = this.cleanForm(this.formClone.clone());\n replyLink = $(target).closest('.js-discussion-reply-button');\n // insert the form after the button\n replyLink\n .closest('.discussion-reply-holder')\n .hide()\n .after(form);\n // show the form\n return this.setupDiscussionNoteForm(replyLink, form);\n }\n\n /**\n * Shows the diff or discussion form and does some setup on it.\n *\n * Sets some hidden fields in the form.\n *\n * Note: dataHolder must have the \"discussionId\" and \"lineCode\" data attributes set.\n */\n setupDiscussionNoteForm(dataHolder, form) {\n // set up note target\n let diffFileData = dataHolder.closest('.text-file');\n\n if (diffFileData.length === 0) {\n diffFileData = dataHolder.closest('.image');\n }\n\n var discussionID = dataHolder.data('discussionId');\n\n if (discussionID) {\n form.attr('data-discussion-id', discussionID);\n form.find('#in_reply_to_discussion_id').val(discussionID);\n }\n\n form.find('#note_project_id').val(dataHolder.data('discussionProjectId'));\n\n form.attr('data-line-code', dataHolder.data('lineCode'));\n form.find('#line_type').val(dataHolder.data('lineType'));\n\n form.find('#note_noteable_type').val(diffFileData.data('noteableType'));\n form.find('#note_noteable_id').val(diffFileData.data('noteableId'));\n form.find('#note_commit_id').val(diffFileData.data('commitId'));\n\n form.find('#note_type').val(dataHolder.data('noteType'));\n\n // LegacyDiffNote\n form.find('#note_line_code').val(dataHolder.data('lineCode'));\n\n // DiffNote\n form.find('#note_position').val(dataHolder.attr('data-position'));\n\n form\n .find('.js-close-discussion-note-form')\n .show()\n .removeClass('hide');\n form.find('.js-note-target-close').remove();\n form.find('.js-note-new-discussion').remove();\n this.setupNoteForm(form);\n\n form.removeClass('js-main-target-form').addClass('discussion-form js-discussion-note-form');\n\n if (typeof gl.diffNotesCompileComponents !== 'undefined') {\n var $commentBtn = form.find('comment-and-resolve-btn');\n $commentBtn.attr(':discussion-id', `'${discussionID}'`);\n\n gl.diffNotesCompileComponents();\n }\n\n form.find('.js-note-text').focus();\n form.find('.js-comment-resolve-button').attr('data-discussion-id', discussionID);\n }\n\n /**\n * Called when clicking on the \"add a comment\" button on the side of a diff line.\n *\n * Inserts a temporary row for the form below the line.\n * Sets up the form and shows it.\n */\n onAddDiffNote(e) {\n e.preventDefault();\n const link = e.currentTarget || e.target;\n const $link = $(link);\n const showReplyInput = !$link.hasClass('js-diff-comment-avatar');\n this.toggleDiffNote({\n target: $link,\n lineType: link.dataset.lineType,\n showReplyInput,\n });\n }\n\n onAddImageDiffNote(e) {\n const $link = $(e.currentTarget || e.target);\n const $diffFile = $link.closest('.diff-file');\n\n const clickEvent = new CustomEvent('click.imageDiff', {\n detail: e,\n });\n\n $diffFile[0].dispatchEvent(clickEvent);\n\n // Set up comment form\n let newForm;\n const $noteContainer = $link.closest('.diff-viewer').find('.note-container');\n const $form = $noteContainer.find('> .discussion-form');\n\n if ($form.length === 0) {\n newForm = this.cleanForm(this.formClone.clone());\n newForm.appendTo($noteContainer);\n } else {\n newForm = $form;\n }\n\n this.setupDiscussionNoteForm($link, newForm);\n }\n\n toggleDiffNote({ target, lineType, forceShow, showReplyInput = false }) {\n var $link,\n addForm,\n hasNotes,\n newForm,\n noteForm,\n replyButton,\n row,\n rowCssToAdd,\n targetContent,\n isDiffCommentAvatar;\n $link = $(target);\n row = $link.closest('tr');\n const nextRow = row.next();\n let targetRow = row;\n if (nextRow.is('.notes_holder')) {\n targetRow = nextRow;\n }\n\n hasNotes = nextRow.is('.notes_holder');\n addForm = false;\n let lineTypeSelector = '';\n rowCssToAdd =\n '
';\n // In parallel view, look inside the correct left/right pane\n if (this.isParallelView()) {\n lineTypeSelector = `.${lineType}`;\n rowCssToAdd =\n '
';\n }\n const notesContentSelector = `.notes_content${lineTypeSelector} .content`;\n let notesContent = targetRow.find(notesContentSelector);\n\n if (hasNotes && showReplyInput) {\n targetRow.show();\n notesContent = targetRow.find(notesContentSelector);\n if (notesContent.length) {\n notesContent.show();\n replyButton = notesContent.find('.js-discussion-reply-button:visible');\n if (replyButton.length) {\n this.replyToDiscussionNote(replyButton[0]);\n } else {\n // In parallel view, the form may not be present in one of the panes\n noteForm = notesContent.find('.js-discussion-note-form');\n if (noteForm.length === 0) {\n addForm = true;\n }\n }\n }\n } else if (showReplyInput) {\n // add a notes row and insert the form\n row.after(rowCssToAdd);\n targetRow = row.next();\n notesContent = targetRow.find(notesContentSelector);\n addForm = true;\n } else {\n const isCurrentlyShown = targetRow.find('.content:not(:empty)').is(':visible');\n const isForced = forceShow === true || forceShow === false;\n const showNow = forceShow === true || (!isCurrentlyShown && !isForced);\n\n targetRow.toggleClass('hide', !showNow);\n notesContent.toggleClass('hide', !showNow);\n }\n\n if (addForm) {\n newForm = this.cleanForm(this.formClone.clone());\n newForm.appendTo(notesContent);\n // show the form\n return this.setupDiscussionNoteForm($link, newForm);\n }\n }\n\n /**\n * Called in response to \"cancel\" on a diff note form.\n *\n * Shows the reply button again.\n * Removes the form and if necessary it's temporary row.\n */\n removeDiscussionNoteForm(form) {\n var glForm, row;\n row = form.closest('tr');\n glForm = form.data('glForm');\n glForm.destroy();\n form\n .find('.js-note-text')\n .data('autosave')\n .reset();\n // show the reply button (will only work for replies)\n form.prev('.discussion-reply-holder').show();\n if (row.is('.js-temp-notes-holder')) {\n // remove temporary row for diff lines\n return row.remove();\n } else {\n // only remove the form\n return form.remove();\n }\n }\n\n cancelDiscussionForm(e) {\n e.preventDefault();\n const $form = $(e.target).closest('.js-discussion-note-form');\n const $discussionNote = $(e.target).closest('.discussion-notes');\n\n if ($discussionNote.length === 0) {\n // Only send blur event when the discussion form\n // is not part of a discussion note\n const $diffFile = $form.closest('.diff-file');\n\n if ($diffFile.length > 0) {\n const blurEvent = new CustomEvent('blur.imageDiff', {\n detail: e,\n });\n\n $diffFile[0].dispatchEvent(blurEvent);\n }\n }\n\n return this.removeDiscussionNoteForm($form);\n }\n\n /**\n * Called after an attachment file has been selected.\n *\n * Updates the file name for the selected attachment.\n */\n updateFormAttachment() {\n var filename, form;\n form = $(this).closest('form');\n // get only the basename\n filename = $(this)\n .val()\n .replace(/^.*[\\\\\\/]/, '');\n return form.find('.js-attachment-filename').text(filename);\n }\n\n /**\n * Called when the tab visibility changes\n */\n visibilityChange() {\n return this.refresh();\n }\n\n updateTargetButtons(e) {\n var closebtn, closetext, form, reopenbtn, reopentext, textarea;\n textarea = $(e.target);\n form = textarea.parents('form');\n reopenbtn = form.find('.js-note-target-reopen');\n closebtn = form.find('.js-note-target-close');\n\n if (textarea.val().trim().length > 0) {\n reopentext = reopenbtn.attr('data-alternative-text');\n closetext = closebtn.attr('data-alternative-text');\n if (reopenbtn.text() !== reopentext) {\n reopenbtn.text(reopentext);\n }\n if (closebtn.text() !== closetext) {\n closebtn.text(closetext);\n }\n if (reopenbtn.is(':not(.btn-comment-and-reopen)')) {\n reopenbtn.addClass('btn-comment-and-reopen');\n }\n if (closebtn.is(':not(.btn-comment-and-close)')) {\n closebtn.addClass('btn-comment-and-close');\n }\n } else {\n reopentext = reopenbtn.data('originalText');\n closetext = closebtn.data('originalText');\n if (reopenbtn.text() !== reopentext) {\n reopenbtn.text(reopentext);\n }\n if (closebtn.text() !== closetext) {\n closebtn.text(closetext);\n }\n if (reopenbtn.is('.btn-comment-and-reopen')) {\n reopenbtn.removeClass('btn-comment-and-reopen');\n }\n if (closebtn.is('.btn-comment-and-close')) {\n closebtn.removeClass('btn-comment-and-close');\n }\n }\n }\n\n putEditFormInPlace($el) {\n var $editForm = $(this.getEditFormSelector($el));\n var $note = $el.closest('.note');\n\n $editForm.insertAfter($note.find('.note-text'));\n\n var $originalContentEl = $note.find('.original-note-content');\n var originalContent = $originalContentEl.text().trim();\n var postUrl = $originalContentEl.data('postUrl');\n var targetId = $originalContentEl.data('targetId');\n var targetType = $originalContentEl.data('targetType');\n\n this.glForm = new GLForm($editForm.find('form'), this.enableGFM);\n\n $editForm\n .find('form')\n .attr('action', `${postUrl}?html=true`)\n .attr('data-remote', 'true');\n $editForm.find('.js-form-target-id').val(targetId);\n $editForm.find('.js-form-target-type').val(targetType);\n $editForm\n .find('.js-note-text')\n .focus()\n .val(originalContent);\n $editForm.find('.js-md-write-button').trigger('click');\n $editForm.find('.referenced-users').hide();\n }\n\n putConflictEditWarningInPlace(noteEntity, $note) {\n if ($note.find('.js-conflict-edit-warning').length === 0) {\n const $alert = $(`
\n This comment has changed since you started editing, please review the\n \n updated comment\n \n to ensure information is not lost\n
`);\n $alert.insertAfter($note.find('.note-text'));\n }\n }\n\n updateNotesCount(updateCount) {\n return this.notesCountBadge.text(parseInt(this.notesCountBadge.text(), 10) + updateCount);\n }\n\n static renderPlaceholderComponent($container) {\n const el = $container.find('.js-code-placeholder').get(0);\n // eslint-disable-next-line no-new\n new Vue({\n el,\n components: {\n GlSkeletonLoading,\n },\n render(createElement) {\n return createElement('gl-skeleton-loading');\n },\n });\n }\n\n static renderDiffContent($container, data) {\n const { discussion_html } = data;\n const lines = $(discussion_html).find('.line_holder');\n lines.addClass('fade-in');\n $container.find('.diff-content > table > tbody').prepend(lines);\n const fileHolder = $container.find('.file-holder');\n $container.find('.line-holder-placeholder').remove();\n syntaxHighlight(fileHolder);\n }\n\n onClickRetryLazyLoad(e) {\n const $retryButton = $(e.currentTarget);\n\n $retryButton.prop('disabled', true);\n\n return this.loadLazyDiff(e).then(() => {\n $retryButton.prop('disabled', false);\n });\n }\n\n loadLazyDiff(e) {\n const $container = $(e.currentTarget).closest('.js-toggle-container');\n Notes.renderPlaceholderComponent($container);\n\n $container.find('.js-toggle-lazy-diff').removeClass('js-toggle-lazy-diff');\n\n const $tableEl = $container.find('tbody');\n if ($tableEl.length === 0) return;\n\n const fileHolder = $container.find('.file-holder');\n const url = fileHolder.data('linesPath');\n\n const $errorContainer = $container.find('.js-error-lazy-load-diff');\n const $successContainer = $container.find('.js-success-lazy-load');\n\n /**\n * We only fetch resolved discussions.\n * Unresolved discussions don't have an endpoint being provided.\n */\n if (url) {\n return axios\n .get(url)\n .then(({ data }) => {\n // Reset state in case last request returned error\n $successContainer.removeClass('hidden');\n $errorContainer.addClass('hidden');\n\n Notes.renderDiffContent($container, data);\n })\n .catch(() => {\n $successContainer.addClass('hidden');\n $errorContainer.removeClass('hidden');\n });\n }\n return Promise.resolve();\n }\n\n toggleCommitList(e) {\n const $element = $(e.currentTarget);\n const $closestSystemCommitList = $element.siblings('.system-note-commit-list');\n\n $element\n .find('.fa')\n .toggleClass('fa-angle-down')\n .toggleClass('fa-angle-up');\n $closestSystemCommitList.toggleClass('hide-shade');\n }\n\n /**\n * Scans system notes with `ul` elements in system note body\n * then collapse long commit list pushed by user to make it less\n * intrusive.\n */\n collapseLongCommitList() {\n const systemNotes = $('#notes-list')\n .find('li.system-note')\n .has('ul');\n\n $.each(systemNotes, function(index, systemNote) {\n const $systemNote = $(systemNote);\n const headerMessage = $systemNote\n .find('.note-text')\n .find('p:first')\n .text()\n .replace(':', '');\n\n $systemNote.find('.note-header .system-note-message').html(headerMessage);\n\n if ($systemNote.find('li').length > MAX_VISIBLE_COMMIT_LIST_COUNT) {\n $systemNote.find('.note-text').addClass('system-note-commit-list');\n $systemNote.find('.system-note-commit-list-toggler').show();\n } else {\n $systemNote.find('.note-text').addClass('system-note-commit-list hide-shade');\n }\n });\n }\n\n addFlash(...flashParams) {\n this.flashContainer = new Flash(...flashParams);\n }\n\n clearFlash() {\n if (this.flashContainer) {\n this.flashContainer.style.display = 'none';\n this.flashContainer = null;\n }\n }\n\n cleanForm($form) {\n // Remove JS classes that are not needed here\n $form.find('.js-comment-type-dropdown').removeClass('btn-group');\n\n // Remove dropdown\n $form.find('.dropdown-menu').remove();\n\n return $form;\n }\n\n /**\n * Check if note does not exists on page\n */\n static isNewNote(noteEntity, noteIds) {\n return $.inArray(noteEntity.id, noteIds) === -1;\n }\n\n /**\n * Check if $note already contains the `noteEntity` content\n */\n static isUpdatedNote(noteEntity, $note) {\n // There can be CRLF vs LF mismatches if we don't sanitize and compare the same way\n const sanitizedNoteEntityText = normalizeNewlines(noteEntity.note.trim());\n const currentNoteText = normalizeNewlines(\n $note\n .find('.original-note-content')\n .first()\n .text()\n .trim(),\n );\n return sanitizedNoteEntityText !== currentNoteText;\n }\n\n static checkMergeRequestStatus() {\n if (getPagePath(1) === 'merge_requests' && gl.mrWidget) {\n gl.mrWidget.checkStatus();\n }\n }\n\n static animateAppendNote(noteHtml, $notesList) {\n const $note = $(noteHtml);\n\n $note.addClass('fade-in-full').renderGFM();\n $notesList.append($note);\n return $note;\n }\n\n static animateUpdateNote(noteHtml, $note) {\n const $updatedNote = $(noteHtml);\n\n $updatedNote.addClass('fade-in').renderGFM();\n $note.replaceWith($updatedNote);\n return $updatedNote;\n }\n\n /**\n * Get data from Form attributes to use for saving/submitting comment.\n */\n getFormData($form) {\n const content = $form.find('.js-note-text').val();\n return {\n formData: $form.serialize(),\n formContent: _.escape(content),\n formAction: $form.attr('action'),\n formContentOriginal: content,\n };\n }\n\n /**\n * Identify if comment has any quick actions\n */\n hasQuickActions(formContent) {\n return REGEX_QUICK_ACTIONS.test(formContent);\n }\n\n /**\n * Remove quick actions and leave comment with pure message\n */\n stripQuickActions(formContent) {\n return formContent.replace(REGEX_QUICK_ACTIONS, '').trim();\n }\n\n /**\n * Gets appropriate description from quick actions found in provided `formContent`\n */\n getQuickActionDescription(formContent, availableQuickActions = []) {\n let tempFormContent;\n\n // Identify executed quick actions from `formContent`\n const executedCommands = availableQuickActions.filter((command, index) => {\n const commandRegex = new RegExp(`/${command.name}`);\n return commandRegex.test(formContent);\n });\n\n if (executedCommands && executedCommands.length) {\n if (executedCommands.length > 1) {\n tempFormContent = 'Applying multiple commands';\n } else {\n const commandDescription = executedCommands[0].description.toLowerCase();\n tempFormContent = `Applying command to ${commandDescription}`;\n }\n } else {\n tempFormContent = 'Applying command';\n }\n\n return tempFormContent;\n }\n\n /**\n * Create placeholder note DOM element populated with comment body\n * that we will show while comment is being posted.\n * Once comment is _actually_ posted on server, we will have final element\n * in response that we will show in place of this temporary element.\n */\n createPlaceholderNote({\n formContent,\n uniqueId,\n isDiscussionNote,\n currentUsername,\n currentUserFullname,\n currentUserAvatar,\n }) {\n const discussionClass = isDiscussionNote ? 'discussion' : '';\n const $tempNote = $(\n `
  • \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n

    ${formContent}

    \n
    \n
    \n
    \n
    \n
  • `,\n );\n\n $tempNote.find('.d-none.d-sm-inline-block').text(_.escape(currentUserFullname));\n $tempNote.find('.note-headline-light').text(`@${_.escape(currentUsername)}`);\n\n return $tempNote;\n }\n\n /**\n * Create Placeholder System Note DOM element populated with quick action description\n */\n createPlaceholderSystemNote({ formContent, uniqueId }) {\n const $tempNote = $(\n `
  • \n
    \n
    \n ${formContent}\n
    \n
    \n
  • `,\n );\n\n return $tempNote;\n }\n\n /**\n * This method does following tasks step-by-step whenever a new comment\n * is submitted by user (both main thread comments as well as discussion comments).\n *\n * 1) Get Form metadata\n * 2) Identify comment type; a) Main thread b) Discussion thread c) Discussion resolve\n * 3) Build temporary placeholder element (using `createPlaceholderNote`)\n * 4) Show placeholder note on UI\n * 5) Perform network request to submit the note using `axios.post`\n * a) If request is successfully completed\n * 1. Remove placeholder element\n * 2. Show submitted Note element\n * 3. Perform post-submit errands\n * a. Mark discussion as resolved if comment submission was for resolve.\n * b. Reset comment form to original state.\n * b) If request failed\n * 1. Remove placeholder element\n * 2. Show error Flash message about failure\n */\n postComment(e) {\n e.preventDefault();\n\n // Get Form metadata\n const $submitBtn = $(e.target);\n $submitBtn.prop('disabled', true);\n let $form = $submitBtn.parents('form');\n const $closeBtn = $form.find('.js-note-target-close');\n const isDiscussionNote =\n $submitBtn\n .parent()\n .find('li.droplab-item-selected')\n .attr('id') === 'discussion';\n const isMainForm = $form.hasClass('js-main-target-form');\n const isDiscussionForm = $form.hasClass('js-discussion-note-form');\n const isDiscussionResolve = $submitBtn.hasClass('js-comment-resolve-button');\n const { formData, formContent, formAction, formContentOriginal } = this.getFormData($form);\n let noteUniqueId;\n let systemNoteUniqueId;\n let hasQuickActions = false;\n let $notesContainer;\n let tempFormContent;\n\n // Get reference to notes container based on type of comment\n if (isDiscussionForm) {\n $notesContainer = $form.parent('.discussion-notes').find('.notes');\n } else if (isMainForm) {\n $notesContainer = $('ul.main-notes-list');\n }\n\n // If comment is to resolve discussion, disable submit buttons while\n // comment posting is finished.\n if (isDiscussionResolve) {\n $form.find('.js-comment-submit-button').disable();\n }\n\n tempFormContent = formContent;\n if (this.hasQuickActions(formContent)) {\n tempFormContent = this.stripQuickActions(formContent);\n hasQuickActions = true;\n }\n\n // Show placeholder note\n if (tempFormContent) {\n noteUniqueId = _.uniqueId('tempNote_');\n $notesContainer.append(\n this.createPlaceholderNote({\n formContent: tempFormContent,\n uniqueId: noteUniqueId,\n isDiscussionNote,\n currentUsername: gon.current_username,\n currentUserFullname: gon.current_user_fullname,\n currentUserAvatar: gon.current_user_avatar_url,\n }),\n );\n }\n\n // Show placeholder system note\n if (hasQuickActions) {\n systemNoteUniqueId = _.uniqueId('tempSystemNote_');\n $notesContainer.append(\n this.createPlaceholderSystemNote({\n formContent: this.getQuickActionDescription(\n formContent,\n AjaxCache.get(gl.GfmAutoComplete.dataSources.commands),\n ),\n uniqueId: systemNoteUniqueId,\n }),\n );\n }\n\n // Clear the form textarea\n if ($notesContainer.length) {\n if (isMainForm) {\n this.resetMainTargetForm(e);\n } else if (isDiscussionForm) {\n this.removeDiscussionNoteForm($form);\n }\n }\n\n $closeBtn.text($closeBtn.data('originalText'));\n\n // Make request to submit comment on server\n return axios\n .post(`${formAction}?html=true`, formData)\n .then(res => {\n const note = res.data;\n\n $submitBtn.prop('disabled', false);\n // Submission successful! remove placeholder\n $notesContainer.find(`#${noteUniqueId}`).remove();\n\n const $diffFile = $form.closest('.diff-file');\n if ($diffFile.length > 0) {\n const blurEvent = new CustomEvent('blur.imageDiff', {\n detail: e,\n });\n\n $diffFile[0].dispatchEvent(blurEvent);\n }\n\n // Reset cached commands list when command is applied\n if (hasQuickActions) {\n $form.find('textarea.js-note-text').trigger('clear-commands-cache.atwho');\n }\n\n // Clear previous form errors\n this.clearFlashWrapper();\n\n // Check if this was discussion comment\n if (isDiscussionForm) {\n // Remove flash-container\n $notesContainer.find('.flash-container').remove();\n\n // If comment intends to resolve discussion, do the same.\n if (isDiscussionResolve) {\n $form\n .attr('data-discussion-id', $submitBtn.data('discussionId'))\n .attr('data-resolve-all', 'true')\n .attr('data-project-path', $submitBtn.data('projectPath'));\n }\n\n // Show final note element on UI\n const isNewDiffComment = $notesContainer.length === 0;\n this.addDiscussionNote($form, note, isNewDiffComment);\n\n if (isNewDiffComment) {\n // Add image badge, avatar badge and toggle discussion badge for new image diffs\n const notePosition = $form.find('#note_position').val();\n if ($diffFile.length > 0 && notePosition.length > 0) {\n const { x, y, width, height } = JSON.parse(notePosition);\n const addBadgeEvent = new CustomEvent('addBadge.imageDiff', {\n detail: {\n x,\n y,\n width,\n height,\n noteId: `note_${note.id}`,\n discussionId: note.discussion_id,\n },\n });\n\n $diffFile[0].dispatchEvent(addBadgeEvent);\n }\n }\n\n // append flash-container to the Notes list\n if ($notesContainer.length) {\n $notesContainer.append('
    ');\n }\n } else if (isMainForm) {\n // Check if this was main thread comment\n // Show final note element on UI and perform form and action buttons cleanup\n this.addNote($form, note);\n this.reenableTargetFormSubmitButton(e);\n }\n\n if (note.commands_changes) {\n this.handleQuickActions(note);\n }\n\n $form.trigger('ajax:success', [note]);\n })\n .catch(() => {\n // Submission failed, remove placeholder note and show Flash error message\n $notesContainer.find(`#${noteUniqueId}`).remove();\n $submitBtn.prop('disabled', false);\n const blurEvent = new CustomEvent('blur.imageDiff', {\n detail: e,\n });\n\n const closestDiffFile = $form.closest('.diff-file');\n\n if (closestDiffFile.length) {\n closestDiffFile[0].dispatchEvent(blurEvent);\n }\n\n if (hasQuickActions) {\n $notesContainer.find(`#${systemNoteUniqueId}`).remove();\n }\n\n // Show form again on UI on failure\n if (isDiscussionForm && $notesContainer.length) {\n const replyButton = $notesContainer.parent().find('.js-discussion-reply-button');\n this.replyToDiscussionNote(replyButton[0]);\n $form = $notesContainer.parent().find('form');\n }\n\n $form.find('.js-note-text').val(formContentOriginal);\n this.reenableTargetFormSubmitButton(e);\n this.addNoteError($form);\n });\n }\n\n /**\n * This method does following tasks step-by-step whenever an existing comment\n * is updated by user (both main thread comments as well as discussion comments).\n *\n * 1) Get Form metadata\n * 2) Update note element with new content\n * 3) Perform network request to submit the updated note using `axios.post`\n * a) If request is successfully completed\n * 1. Show submitted Note element\n * b) If request failed\n * 1. Revert Note element to original content\n * 2. Show error Flash message about failure\n */\n updateComment(e) {\n e.preventDefault();\n\n // Get Form metadata\n const $submitBtn = $(e.target);\n const $form = $submitBtn.parents('form');\n const $closeBtn = $form.find('.js-note-target-close');\n const $editingNote = $form.parents('.note.is-editing');\n const $noteBody = $editingNote.find('.js-task-list-container');\n const $noteBodyText = $noteBody.find('.note-text');\n const { formData, formContent, formAction } = this.getFormData($form);\n const $diffFile = $form.closest('.diff-file');\n const $notesContainer = $form.closest('.notes');\n\n // Cache original comment content\n const cachedNoteBodyText = $noteBodyText.html();\n\n // Show updated comment content temporarily\n $noteBodyText.html(formContent);\n $editingNote.removeClass('is-editing fade-in-full').addClass('being-posted fade-in-half');\n $editingNote\n .find('.note-headline-meta a')\n .html(\n '',\n );\n\n // Make request to update comment on server\n axios\n .post(`${formAction}?html=true`, formData)\n .then(({ data }) => {\n // Submission successful! render final note element\n this.updateNote(data, $editingNote);\n })\n .catch(() => {\n // Submission failed, revert back to original note\n $noteBodyText.html(_.escape(cachedNoteBodyText));\n $editingNote.removeClass('being-posted fade-in');\n $editingNote.find('.fa.fa-spinner').remove();\n\n // Show Flash message about failure\n this.updateNoteError();\n });\n\n return $closeBtn.text($closeBtn.data('originalText'));\n }\n}\n\nwindow.Notes = Notes;\n","import Mousetrap from 'mousetrap';\nimport findAndFollowLink from '../../lib/utils/navigation_utility';\nimport Shortcuts from './shortcuts';\n\nexport default class ShortcutsNavigation extends Shortcuts {\n constructor() {\n super();\n\n Mousetrap.bind('g p', () => findAndFollowLink('.shortcuts-project'));\n Mousetrap.bind('g v', () => findAndFollowLink('.shortcuts-project-activity'));\n Mousetrap.bind('g r', () => findAndFollowLink('.shortcuts-project-releases'));\n Mousetrap.bind('g f', () => findAndFollowLink('.shortcuts-tree'));\n Mousetrap.bind('g c', () => findAndFollowLink('.shortcuts-commits'));\n Mousetrap.bind('g j', () => findAndFollowLink('.shortcuts-builds'));\n Mousetrap.bind('g n', () => findAndFollowLink('.shortcuts-network'));\n Mousetrap.bind('g d', () => findAndFollowLink('.shortcuts-repository-charts'));\n Mousetrap.bind('g i', () => findAndFollowLink('.shortcuts-issues'));\n Mousetrap.bind('g b', () => findAndFollowLink('.shortcuts-issue-boards'));\n Mousetrap.bind('g m', () => findAndFollowLink('.shortcuts-merge_requests'));\n Mousetrap.bind('g w', () => findAndFollowLink('.shortcuts-wiki'));\n Mousetrap.bind('g s', () => findAndFollowLink('.shortcuts-snippets'));\n Mousetrap.bind('g k', () => findAndFollowLink('.shortcuts-kubernetes'));\n Mousetrap.bind('g e', () => findAndFollowLink('.shortcuts-environments'));\n Mousetrap.bind('g l', () => findAndFollowLink('.shortcuts-metrics'));\n Mousetrap.bind('i', () => findAndFollowLink('.shortcuts-new-issue'));\n\n this.enabledHelp.push('.hidden-shortcut.project');\n }\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TaskList\"] = factory();\n\telse\n\t\troot[\"TaskList\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nvar NodeArray, TaskList, closest, createEvent,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\nNodeArray = function(nodeList) {\n return Array.prototype.slice.apply(nodeList);\n};\n\nclosest = function(el, className) {\n while (el && !el.classList.contains(className)) {\n el = el.parentNode;\n }\n return el;\n};\n\ncreateEvent = function(eventName, detail) {\n var event;\n if (typeof Event === 'function') {\n event = new Event(eventName, {\n bubbles: true,\n cancelable: true\n });\n event.detail = detail;\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(eventName, true, true, detail);\n }\n return event;\n};\n\nTaskList = (function() {\n function TaskList(el1) {\n this.el = el1;\n this.container = closest(this.el, 'js-task-list-container');\n this.field = this.container.querySelector('.js-task-list-field');\n this.container.addEventListener('change', (function(_this) {\n return function(event) {\n if (event.target.classList.contains('task-list-item-checkbox')) {\n return _this.updateTaskList(event.target);\n }\n };\n })(this));\n this.enable();\n }\n\n TaskList.prototype.enable = function() {\n var event;\n if (this.container.querySelectorAll('.js-task-list-field').length > 0) {\n NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n return item.classList.add('enabled');\n });\n NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n return checkbox.disabled = false;\n });\n this.container.classList.add('is-task-list-enabled');\n event = createEvent('tasklist:enabled');\n return this.container.dispatchEvent(event);\n }\n };\n\n TaskList.prototype.disable = function() {\n var event;\n NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n return item.classList.remove('enabled');\n });\n NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n return checkbox.disabled = true;\n });\n this.container.classList.remove('is-task-list-enabled');\n event = createEvent('tasklist:disabled');\n return this.container.dispatchEvent(event);\n };\n\n TaskList.prototype.updateTaskList = function(item) {\n var changeEvent, changedEvent, checkboxes, index, lineNumber, lineSource, ref, result;\n checkboxes = this.container.querySelectorAll('.task-list-item-checkbox');\n index = 1 + NodeArray(checkboxes).indexOf(item);\n changeEvent = createEvent('tasklist:change', {\n index: index,\n checked: item.checked\n });\n this.field.dispatchEvent(changeEvent);\n if (!changeEvent.defaultPrevented) {\n ref = TaskList.updateSource(this.field.value, index, item.checked), result = ref.result, lineNumber = ref.lineNumber, lineSource = ref.lineSource;\n this.field.value = result;\n changeEvent = createEvent('change');\n this.field.dispatchEvent(changeEvent);\n changedEvent = createEvent('tasklist:changed', {\n index: index,\n checked: item.checked,\n lineNumber: lineNumber,\n lineSource: lineSource\n });\n return this.field.dispatchEvent(changedEvent);\n }\n };\n\n TaskList.incomplete = \"[ ]\";\n\n TaskList.complete = \"[x]\";\n\n TaskList.escapePattern = function(str) {\n return str.replace(/([\\[\\]])/g, \"\\\\$1\").replace(/\\s/, \"\\\\s\").replace(\"x\", \"[xX]\");\n };\n\n TaskList.incompletePattern = RegExp(\"\" + (TaskList.escapePattern(TaskList.incomplete)));\n\n TaskList.completePattern = RegExp(\"\" + (TaskList.escapePattern(TaskList.complete)));\n\n TaskList.itemPattern = RegExp(\"^(?:\\\\s*(?:>\\\\s*)*(?:[-+*]|(?:\\\\d+\\\\.)))\\\\s*(\" + (TaskList.escapePattern(TaskList.complete)) + \"|\" + (TaskList.escapePattern(TaskList.incomplete)) + \")\\\\s\");\n\n TaskList.startFencesPattern = /^`{3}.*$/;\n\n TaskList.endFencesPattern = /^`{3}$/;\n\n TaskList.itemsInParasPattern = RegExp(\"^(\" + (TaskList.escapePattern(TaskList.complete)) + \"|\" + (TaskList.escapePattern(TaskList.incomplete)) + \").+$\", \"g\");\n\n TaskList.updateSource = function(source, itemIndex, checked) {\n var clean, i, inCodeBlock, index, line, lineNumber, lineSource, result;\n clean = source.replace(/\\r/g, '').replace(this.itemsInParasPattern, '').split(\"\\n\");\n index = 0;\n inCodeBlock = false;\n lineNumber;\n lineSource;\n result = (function() {\n var j, len, ref, results;\n ref = source.split(\"\\n\");\n results = [];\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n line = ref[i];\n if (inCodeBlock) {\n if (line.match(this.endFencesPattern)) {\n inCodeBlock = false;\n }\n } else if (line.match(this.startFencesPattern)) {\n inCodeBlock = true;\n } else if (indexOf.call(clean, line) >= 0 && line.match(this.itemPattern)) {\n index += 1;\n if (index === itemIndex) {\n lineNumber = i + 1;\n lineSource = line;\n line = checked ? line.replace(this.incompletePattern, this.complete) : line.replace(this.completePattern, this.incomplete);\n }\n }\n results.push(line);\n }\n return results;\n }).call(this);\n return {\n result: result.join(\"\\n\"),\n lineNumber: lineNumber,\n lineSource: lineSource\n };\n };\n\n return TaskList;\n\n})();\n\nif (typeof jQuery !== 'undefined') {\n jQuery.fn.taskList = function(method) {\n return this.each(function(index, el) {\n var taskList;\n taskList = jQuery(el).data('task-list');\n if (!taskList) {\n taskList = new TaskList(el);\n jQuery(el).data('task-list', taskList);\n if (!method || method === 'enable') {\n return;\n }\n }\n return taskList[method || 'enable']();\n });\n };\n}\n\nmodule.exports = TaskList;\n\n\n/***/ })\n/******/ ]);\n});","import $ from 'jquery';\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class ProjectSelectComboButton {\n constructor(select) {\n this.projectSelectInput = $(select);\n this.newItemBtn = $('.new-project-item-link');\n this.resourceType = this.newItemBtn.data('type');\n this.resourceLabel = this.newItemBtn.data('label');\n this.formattedText = this.deriveTextVariants();\n this.groupId = this.projectSelectInput.data('groupId');\n this.bindEvents();\n this.initLocalStorage();\n }\n\n bindEvents() {\n this.projectSelectInput\n .siblings('.new-project-item-select-button')\n .on('click', e => this.openDropdown(e));\n\n this.newItemBtn.on('click', e => {\n if (!this.getProjectFromLocalStorage()) {\n e.preventDefault();\n this.openDropdown(e);\n }\n });\n\n this.projectSelectInput.on('change', () => this.selectProject());\n }\n\n initLocalStorage() {\n const localStorageIsSafe = AccessorUtilities.isLocalStorageAccessSafe();\n\n if (localStorageIsSafe) {\n this.localStorageKey = [\n 'group',\n this.groupId,\n this.formattedText.localStorageItemType,\n 'recent-project',\n ].join('-');\n this.setBtnTextFromLocalStorage();\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n openDropdown(event) {\n import(/* webpackChunkName: 'select2' */ 'select2/select2')\n .then(() => {\n $(event.currentTarget)\n .siblings('.project-item-select')\n .select2('open');\n })\n .catch(() => {});\n }\n\n selectProject() {\n const selectedProjectData = JSON.parse(this.projectSelectInput.val());\n const projectUrl = `${selectedProjectData.url}/${this.projectSelectInput.data('relativePath')}`;\n const projectName = selectedProjectData.name;\n\n const projectMeta = {\n url: projectUrl,\n name: projectName,\n };\n\n this.setNewItemBtnAttributes(projectMeta);\n this.setProjectInLocalStorage(projectMeta);\n }\n\n setBtnTextFromLocalStorage() {\n const cachedProjectData = this.getProjectFromLocalStorage();\n\n this.setNewItemBtnAttributes(cachedProjectData);\n }\n\n setNewItemBtnAttributes(project) {\n if (project) {\n this.newItemBtn.attr('href', project.url);\n this.newItemBtn.text(`${this.formattedText.defaultTextPrefix} in ${project.name}`);\n } else {\n this.newItemBtn.text(`Select project to create ${this.formattedText.presetTextSuffix}`);\n }\n }\n\n getProjectFromLocalStorage() {\n const projectString = localStorage.getItem(this.localStorageKey);\n\n return JSON.parse(projectString);\n }\n\n setProjectInLocalStorage(projectMeta) {\n const projectString = JSON.stringify(projectMeta);\n\n localStorage.setItem(this.localStorageKey, projectString);\n }\n\n deriveTextVariants() {\n const defaultTextPrefix = this.resourceLabel;\n\n // the trailing slice call depluralizes each of these strings (e.g. new-issues -> new-issue)\n const localStorageItemType = `new-${this.resourceType\n .split('_')\n .join('-')\n .slice(0, -1)}`;\n const presetTextSuffix = this.resourceType\n .split('_')\n .join(' ')\n .slice(0, -1);\n\n return {\n localStorageItemType, // new-issue / new-merge-request\n defaultTextPrefix, // New issue / New merge request\n presetTextSuffix, // issue / merge request\n };\n }\n}\n","/* eslint-disable func-names, no-var, object-shorthand, one-var, no-else-return */\n\nimport $ from 'jquery';\nimport Api from './api';\nimport ProjectSelectComboButton from './project_select_combo_button';\n\nexport default function projectSelect() {\n import(/* webpackChunkName: 'select2' */ 'select2/select2')\n .then(() => {\n $('.ajax-project-select').each(function(i, select) {\n var placeholder;\n const simpleFilter = $(select).data('simpleFilter') || false;\n this.groupId = $(select).data('groupId');\n this.includeGroups = $(select).data('includeGroups');\n this.allProjects = $(select).data('allProjects') || false;\n this.orderBy = $(select).data('orderBy') || 'id';\n this.withIssuesEnabled = $(select).data('withIssuesEnabled');\n this.withMergeRequestsEnabled = $(select).data('withMergeRequestsEnabled');\n this.withShared =\n $(select).data('withShared') === undefined ? true : $(select).data('withShared');\n this.includeProjectsInSubgroups = $(select).data('includeProjectsInSubgroups') || false;\n this.allowClear = $(select).data('allowClear') || false;\n\n placeholder = 'Search for project';\n if (this.includeGroups) {\n placeholder += ' or group';\n }\n\n $(select).select2({\n placeholder: placeholder,\n minimumInputLength: 0,\n query: (function(_this) {\n return function(query) {\n var finalCallback, projectsCallback;\n finalCallback = function(projects) {\n var data;\n data = {\n results: projects,\n };\n return query.callback(data);\n };\n if (_this.includeGroups) {\n projectsCallback = function(projects) {\n var groupsCallback;\n groupsCallback = function(groups) {\n var data;\n data = groups.concat(projects);\n return finalCallback(data);\n };\n return Api.groups(query.term, {}, groupsCallback);\n };\n } else {\n projectsCallback = finalCallback;\n }\n if (_this.groupId) {\n return Api.groupProjects(\n _this.groupId,\n query.term,\n {\n with_issues_enabled: _this.withIssuesEnabled,\n with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n with_shared: _this.withShared,\n include_subgroups: _this.includeProjectsInSubgroups,\n },\n projectsCallback,\n );\n } else {\n return Api.projects(\n query.term,\n {\n order_by: _this.orderBy,\n with_issues_enabled: _this.withIssuesEnabled,\n with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n membership: !_this.allProjects,\n },\n projectsCallback,\n );\n }\n };\n })(this),\n id: function(project) {\n if (simpleFilter) return project.id;\n return JSON.stringify({\n name: project.name,\n url: project.web_url,\n });\n },\n text: function(project) {\n return project.name_with_namespace || project.name;\n },\n\n initSelection: function(el, callback) {\n return Api.project(el.val()).then(({ data }) => callback(data));\n },\n\n allowClear: this.allowClear,\n\n dropdownCssClass: 'ajax-project-dropdown',\n });\n if (simpleFilter) return select;\n return new ProjectSelectComboButton(select);\n });\n })\n .catch(() => {});\n}\n","/* eslint-disable func-names, no-var, no-return-assign, one-var, object-shorthand, vars-on-top */\n\nimport $ from 'jquery';\nimport Cookies from 'js-cookie';\nimport { __ } from '~/locale';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport projectSelect from '../../project_select';\n\nexport default class Project {\n constructor() {\n const $cloneOptions = $('ul.clone-options-dropdown');\n const $projectCloneField = $('#project_clone');\n const $cloneBtnLabel = $('.js-git-clone-holder .js-clone-dropdown-label');\n const mobileCloneField = document.querySelector(\n '.js-mobile-git-clone .js-clone-dropdown-label',\n );\n\n const selectedCloneOption = $cloneBtnLabel.text().trim();\n if (selectedCloneOption.length > 0) {\n $(`a:contains('${selectedCloneOption}')`, $cloneOptions).addClass('is-active');\n }\n\n $('a', $cloneOptions).on('click', e => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const url = $this.attr('href');\n const cloneType = $this.data('cloneType');\n\n $('.is-active', $cloneOptions).removeClass('is-active');\n $(`a[data-clone-type=\"${cloneType}\"]`).each(function() {\n const $el = $(this);\n const activeText = $el.find('.dropdown-menu-inner-title').text();\n const $container = $el.closest('.project-clone-holder');\n const $label = $container.find('.js-clone-dropdown-label');\n\n $el.toggleClass('is-active');\n $label.text(activeText);\n });\n\n if (mobileCloneField) {\n mobileCloneField.dataset.clipboardText = url;\n } else {\n $projectCloneField.val(url);\n }\n $('.js-git-empty .js-clone').text(url);\n });\n // Ref switcher\n Project.initRefSwitcher();\n $('.project-refs-select').on('change', function() {\n return $(this)\n .parents('form')\n .submit();\n });\n $('.hide-no-ssh-message').on('click', function(e) {\n Cookies.set('hide_no_ssh_message', 'false');\n $(this)\n .parents('.no-ssh-key-message')\n .remove();\n return e.preventDefault();\n });\n $('.hide-no-password-message').on('click', function(e) {\n Cookies.set('hide_no_password_message', 'false');\n $(this)\n .parents('.no-password-message')\n .remove();\n return e.preventDefault();\n });\n $('.hide-auto-devops-implicitly-enabled-banner').on('click', function(e) {\n const projectId = $(this).data('project-id');\n const cookieKey = `hide_auto_devops_implicitly_enabled_banner_${projectId}`;\n Cookies.set(cookieKey, 'false');\n $(this)\n .parents('.auto-devops-implicitly-enabled-banner')\n .remove();\n return e.preventDefault();\n });\n Project.projectSelectDropdown();\n }\n\n static projectSelectDropdown() {\n projectSelect();\n $('.project-item-select').on('click', e => Project.changeProject($(e.currentTarget).val()));\n }\n\n static changeProject(url) {\n return (window.location = url);\n }\n\n static initRefSwitcher() {\n var refListItem = document.createElement('li');\n var refLink = document.createElement('a');\n\n refLink.href = '#';\n\n return $('.js-project-refs-dropdown').each(function() {\n var $dropdown, selected;\n $dropdown = $(this);\n selected = $dropdown.data('selected');\n return $dropdown.glDropdown({\n data(term, callback) {\n axios\n .get($dropdown.data('refsUrl'), {\n params: {\n ref: $dropdown.data('ref'),\n search: term,\n },\n })\n .then(({ data }) => callback(data))\n .catch(() => flash(__('An error occurred while getting projects')));\n },\n selectable: true,\n filterable: true,\n filterRemote: true,\n filterByText: true,\n inputFieldName: $dropdown.data('inputFieldName'),\n fieldName: $dropdown.data('fieldName'),\n renderRow: function(ref) {\n var li = refListItem.cloneNode(false);\n\n if (ref.header != null) {\n li.className = 'dropdown-header';\n li.textContent = ref.header;\n } else {\n var link = refLink.cloneNode(false);\n\n if (ref === selected) {\n link.className = 'is-active';\n }\n\n link.textContent = ref;\n link.dataset.ref = ref;\n\n li.appendChild(link);\n }\n\n return li;\n },\n id: function(obj, $el) {\n return $el.attr('data-ref');\n },\n toggleLabel: function(obj, $el) {\n return $el.text().trim();\n },\n clicked: function(options) {\n const { e } = options;\n e.preventDefault();\n if ($('input[name=\"ref\"]').length) {\n var $form = $dropdown.closest('form');\n\n var $visit = $dropdown.data('visit');\n var shouldVisit = $visit ? true : $visit;\n var action = $form.attr('action');\n var divider = action.indexOf('?') === -1 ? '?' : '&';\n if (shouldVisit) {\n visitUrl(`${action}${divider}${$form.serialize()}`);\n }\n }\n },\n });\n });\n }\n}\n","import $ from 'jquery';\nimport { stickyMonitor } from './lib/utils/sticky';\n\nexport default stickyTop => {\n stickyMonitor(document.querySelector('.js-diff-files-changed'), stickyTop);\n\n $('.js-diff-stats-dropdown').glDropdown({\n filterable: true,\n remoteFilter: false,\n });\n};\n","import Notes from './notes';\n\nexport default () => {\n const dataEl = document.querySelector('.js-notes-data');\n const { notesUrl, notesIds, now, diffView, enableGFM } = JSON.parse(dataEl.innerHTML);\n\n // Create a singleton so that we don't need to assign\n // into the window object, we can just access the current isntance with Notes.instance\n Notes.initialize(notesUrl, notesIds, now, diffView, enableGFM);\n};\n","import initGkeDropdowns from '~/projects/gke_cluster_dropdowns';\nimport PersistentUserCallout from '../../persistent_user_callout';\nimport Project from './project';\nimport ShortcutsNavigation from '../../behaviors/shortcuts/shortcuts_navigation';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const { page } = document.body.dataset;\n const newClusterViews = [\n 'projects:clusters:new',\n 'projects:clusters:create_gcp',\n 'projects:clusters:create_user',\n ];\n\n if (newClusterViews.indexOf(page) > -1) {\n const callout = document.querySelector('.gcp-signup-offer');\n PersistentUserCallout.factory(callout);\n\n initGkeDropdowns();\n }\n\n new Project(); // eslint-disable-line no-new\n new ShortcutsNavigation(); // eslint-disable-line no-new\n});\n","import $ from 'jquery';\nimport flash from './flash';\nimport axios from './lib/utils/axios_utils';\n\n/**\n * In each pipelines table we have a mini pipeline graph for each pipeline.\n *\n * When we click in a pipeline stage, we need to make an API call to get the\n * builds list to render in a dropdown.\n *\n * The container should be the table element.\n *\n * The stage icon clicked needs to have the following HTML structure:\n *
    \n * \n *
    \n *
    \n */\n\nexport default class MiniPipelineGraph {\n constructor(opts = {}) {\n this.container = opts.container || '';\n this.dropdownListSelector = '.js-builds-dropdown-container';\n this.getBuildsList = this.getBuildsList.bind(this);\n }\n\n /**\n * Adds the event listener when the dropdown is opened.\n * All dropdown events are fired at the .dropdown-menu's parent element.\n */\n bindEvents() {\n $(document)\n .off('shown.bs.dropdown', this.container)\n .on('shown.bs.dropdown', this.container, this.getBuildsList);\n }\n\n /**\n * When the user right clicks or cmd/ctrl + click in the job name\n * the dropdown should not be closed and the link should open in another tab,\n * so we stop propagation of the click event inside the dropdown.\n *\n * Since this component is rendered multiple times per page we need to guarantee we only\n * target the click event of this component.\n */\n stopDropdownClickPropagation() {\n $(document).on(\n 'click',\n `${this.container} .js-builds-dropdown-list a.mini-pipeline-graph-dropdown-item`,\n e => {\n e.stopPropagation();\n },\n );\n }\n\n /**\n * For the clicked stage, renders the given data in the dropdown list.\n *\n * @param {HTMLElement} stageContainer\n * @param {Object} data\n */\n renderBuildsList(stageContainer, data) {\n const dropdownContainer = stageContainer.parentElement.querySelector(\n `${this.dropdownListSelector} .js-builds-dropdown-list ul`,\n );\n\n dropdownContainer.innerHTML = data;\n }\n\n /**\n * For the clicked stage, gets the list of builds.\n *\n * All dropdown events have a relatedTarget property,\n * whose value is the toggling anchor element.\n *\n * @param {Object} e bootstrap dropdown event\n * @return {Promise}\n */\n getBuildsList(e) {\n const button = e.relatedTarget;\n const endpoint = button.dataset.stageEndpoint;\n\n this.renderBuildsList(button, '');\n this.toggleLoading(button);\n\n axios\n .get(endpoint)\n .then(({ data }) => {\n this.toggleLoading(button);\n this.renderBuildsList(button, data.html);\n this.stopDropdownClickPropagation();\n })\n .catch(() => {\n this.toggleLoading(button);\n if (\n $(button)\n .parent()\n .hasClass('open')\n ) {\n $(button).dropdown('toggle');\n }\n flash('An error occurred while fetching the builds.', 'alert');\n });\n }\n\n /**\n * Toggles the visibility of the loading icon.\n *\n * @param {HTMLElement} stageContainer\n * @return {type}\n */\n toggleLoading(stageContainer) {\n stageContainer.parentElement\n .querySelector(`${this.dropdownListSelector} .js-builds-dropdown-loading`)\n .classList.toggle('hidden');\n }\n}\n","import $ from 'jquery';\nimport Dropzone from 'dropzone';\nimport _ from 'underscore';\nimport './behaviors/preview_markdown';\nimport csrf from './lib/utils/csrf';\nimport axios from './lib/utils/axios_utils';\n\nDropzone.autoDiscover = false;\n\n/**\n * Return the error message string from the given response.\n *\n * @param {String|Object} res\n */\nfunction getErrorMessage(res) {\n if (!res || _.isString(res)) {\n return res;\n }\n\n return res.message;\n}\n\nexport default function dropzoneInput(form) {\n const divHover = '
    ';\n const iconPaperclip = '';\n const $attachButton = form.find('.button-attach-file');\n const $attachingFileMessage = form.find('.attaching-file-message');\n const $cancelButton = form.find('.button-cancel-uploading-files');\n const $retryLink = form.find('.retry-uploading-link');\n const $uploadProgress = form.find('.uploading-progress');\n const $uploadingErrorContainer = form.find('.uploading-error-container');\n const $uploadingErrorMessage = form.find('.uploading-error-message');\n const $uploadingProgressContainer = form.find('.uploading-progress-container');\n const uploadsPath = form.data('uploads-path') || window.uploads_path || null;\n const maxFileSize = gon.max_file_size || 10;\n const formTextarea = form.find('.js-gfm-input');\n let handlePaste;\n let pasteText;\n let addFileToForm;\n let updateAttachingMessage;\n let isImage;\n let getFilename;\n let uploadFile;\n\n formTextarea.wrap('
    ');\n formTextarea.on('paste', event => handlePaste(event));\n\n // Add dropzone area to the form.\n const $mdArea = formTextarea.closest('.md-area');\n form.setupMarkdownPreview();\n const $formDropzone = form.find('.div-dropzone');\n $formDropzone.parent().addClass('div-dropzone-wrapper');\n $formDropzone.append(divHover);\n $formDropzone.find('.div-dropzone-hover').append(iconPaperclip);\n\n if (!uploadsPath) {\n $formDropzone.addClass('js-invalid-dropzone');\n return null;\n }\n\n const dropzone = $formDropzone.dropzone({\n url: uploadsPath,\n dictDefaultMessage: '',\n clickable: true,\n paramName: 'file',\n maxFilesize: maxFileSize,\n uploadMultiple: false,\n headers: csrf.headers,\n previewContainer: false,\n processing: () => $('.div-dropzone-alert').alert('close'),\n dragover: () => {\n $mdArea.addClass('is-dropzone-hover');\n form.find('.div-dropzone-hover').css('opacity', 0.7);\n },\n dragleave: () => {\n $mdArea.removeClass('is-dropzone-hover');\n form.find('.div-dropzone-hover').css('opacity', 0);\n },\n drop: () => {\n $mdArea.removeClass('is-dropzone-hover');\n form.find('.div-dropzone-hover').css('opacity', 0);\n formTextarea.focus();\n },\n success(header, response) {\n const processingFileCount = this.getQueuedFiles().length + this.getUploadingFiles().length;\n const shouldPad = processingFileCount >= 1;\n\n pasteText(response.link.markdown, shouldPad);\n // Show 'Attach a file' link only when all files have been uploaded.\n if (!processingFileCount) $attachButton.removeClass('hide');\n addFileToForm(response.link.url);\n },\n error: (file, errorMessage = 'Attaching the file failed.', xhr) => {\n // If 'error' event is fired by dropzone, the second parameter is error message.\n // If the 'errorMessage' parameter is empty, the default error message is set.\n // If the 'error' event is fired by backend (xhr) error response, the third parameter is\n // xhr object (xhr.responseText is error message).\n // On error we hide the 'Attach' and 'Cancel' buttons\n // and show an error.\n const message = getErrorMessage(errorMessage || xhr.responseText);\n\n $uploadingErrorContainer.removeClass('hide');\n $uploadingErrorMessage.html(message);\n $attachButton.addClass('hide');\n $cancelButton.addClass('hide');\n },\n totaluploadprogress(totalUploadProgress) {\n updateAttachingMessage(this.files, $attachingFileMessage);\n $uploadProgress.text(`${Math.round(totalUploadProgress)}%`);\n },\n sending: () => {\n // DOM elements already exist.\n // Instead of dynamically generating them,\n // we just either hide or show them.\n $attachButton.addClass('hide');\n $uploadingErrorContainer.addClass('hide');\n $uploadingProgressContainer.removeClass('hide');\n $cancelButton.removeClass('hide');\n },\n removedfile: () => {\n $attachButton.removeClass('hide');\n $cancelButton.addClass('hide');\n $uploadingProgressContainer.addClass('hide');\n $uploadingErrorContainer.addClass('hide');\n },\n queuecomplete: () => {\n $('.dz-preview').remove();\n $('.markdown-area').trigger('input');\n\n $uploadingProgressContainer.addClass('hide');\n $cancelButton.addClass('hide');\n },\n });\n\n const child = $(dropzone[0]).children('textarea');\n\n // removeAllFiles(true) stops uploading files (if any)\n // and remove them from dropzone files queue.\n $cancelButton.on('click', e => {\n e.preventDefault();\n e.stopPropagation();\n Dropzone.forElement($formDropzone.get(0)).removeAllFiles(true);\n });\n\n // If 'error' event is fired, we store a failed files,\n // clear dropzone files queue, change status of failed files to undefined,\n // and add that files to the dropzone files queue again.\n // addFile() adds file to dropzone files queue and upload it.\n $retryLink.on('click', e => {\n const dropzoneInstance = Dropzone.forElement(\n e.target.closest('.js-main-target-form').querySelector('.div-dropzone'),\n );\n const failedFiles = dropzoneInstance.files;\n\n e.preventDefault();\n\n // 'true' parameter of removeAllFiles() cancels\n // uploading of files that are being uploaded at the moment.\n dropzoneInstance.removeAllFiles(true);\n\n failedFiles.map(failedFile => {\n const file = failedFile;\n\n if (file.status === Dropzone.ERROR) {\n file.status = undefined;\n file.accepted = undefined;\n }\n\n return dropzoneInstance.addFile(file);\n });\n });\n // eslint-disable-next-line consistent-return\n handlePaste = event => {\n const pasteEvent = event.originalEvent;\n if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {\n const image = isImage(pasteEvent);\n if (image) {\n event.preventDefault();\n const filename = getFilename(pasteEvent) || 'image.png';\n const text = `{{${filename}}}`;\n pasteText(text);\n return uploadFile(image.getAsFile(), filename);\n }\n }\n };\n\n isImage = data => {\n let i = 0;\n while (i < data.clipboardData.items.length) {\n const item = data.clipboardData.items[i];\n if (item.type.indexOf('image') !== -1) {\n return item;\n }\n i += 1;\n }\n return false;\n };\n\n pasteText = (text, shouldPad) => {\n let formattedText = text;\n if (shouldPad) {\n formattedText += '\\n\\n';\n }\n const textarea = child.get(0);\n const caretStart = textarea.selectionStart;\n const caretEnd = textarea.selectionEnd;\n const textEnd = $(child).val().length;\n const beforeSelection = $(child)\n .val()\n .substring(0, caretStart);\n const afterSelection = $(child)\n .val()\n .substring(caretEnd, textEnd);\n $(child).val(beforeSelection + formattedText + afterSelection);\n textarea.setSelectionRange(caretStart + formattedText.length, caretEnd + formattedText.length);\n textarea.style.height = `${textarea.scrollHeight}px`;\n formTextarea.get(0).dispatchEvent(new Event('input'));\n return formTextarea.trigger('input');\n };\n\n addFileToForm = path => {\n $(form).append(``);\n };\n\n getFilename = e => {\n let value;\n if (window.clipboardData && window.clipboardData.getData) {\n value = window.clipboardData.getData('Text');\n } else if (e.clipboardData && e.clipboardData.getData) {\n value = e.clipboardData.getData('text/plain');\n }\n value = value.split('\\r');\n return value[0];\n };\n\n const showSpinner = () => $uploadingProgressContainer.removeClass('hide');\n\n const closeSpinner = () => $uploadingProgressContainer.addClass('hide');\n\n const showError = message => {\n $uploadingErrorContainer.removeClass('hide');\n $uploadingErrorMessage.html(message);\n };\n\n const closeAlertMessage = () => form.find('.div-dropzone-alert').alert('close');\n\n const insertToTextArea = (filename, url) => {\n const $child = $(child);\n $child.val((index, val) => val.replace(`{{${filename}}}`, url));\n\n $child.trigger('change');\n };\n\n uploadFile = (item, filename) => {\n const formData = new FormData();\n formData.append('file', item, filename);\n\n showSpinner();\n closeAlertMessage();\n\n axios\n .post(uploadsPath, formData)\n .then(({ data }) => {\n const md = data.link.markdown;\n\n insertToTextArea(filename, md);\n closeSpinner();\n })\n .catch(e => {\n showError(e.response.data.message);\n closeSpinner();\n });\n };\n\n updateAttachingMessage = (files, messageContainer) => {\n let attachingMessage;\n const filesCount = files.filter(file => file.status === 'uploading' || file.status === 'queued')\n .length;\n\n // Dinamycally change uploading files text depending on files number in\n // dropzone files queue.\n if (filesCount > 1) {\n attachingMessage = `Attaching ${filesCount} files -`;\n } else {\n attachingMessage = 'Attaching a file -';\n }\n\n messageContainer.text(attachingMessage);\n };\n\n form.find('.markdown-selector').click(function onMarkdownClick(e) {\n e.preventDefault();\n $(this)\n .closest('.gfm-form')\n .find('.div-dropzone')\n .click();\n formTextarea.focus();\n });\n\n return Dropzone.forElement($formDropzone.get(0));\n}\n","import $ from 'jquery';\nimport autosize from 'autosize';\nimport GfmAutoComplete, * as GFMConfig from './gfm_auto_complete';\nimport dropzoneInput from './dropzone_input';\nimport { addMarkdownListeners, removeMarkdownListeners } from './lib/utils/text_markdown';\n\nexport default class GLForm {\n constructor(form, enableGFM = {}) {\n this.form = form;\n this.textarea = this.form.find('textarea.js-gfm-input');\n this.enableGFM = Object.assign({}, GFMConfig.defaultAutocompleteConfig, enableGFM);\n // Disable autocomplete for keywords which do not have dataSources available\n const dataSources = (gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources) || {};\n Object.keys(this.enableGFM).forEach(item => {\n if (item !== 'emojis') {\n this.enableGFM[item] = !!dataSources[item];\n }\n });\n // Before we start, we should clean up any previous data for this form\n this.destroy();\n // Set up the form\n this.setupForm();\n this.form.data('glForm', this);\n }\n\n destroy() {\n // Clean form listeners\n this.clearEventListeners();\n if (this.autoComplete) {\n this.autoComplete.destroy();\n }\n this.form.data('glForm', null);\n }\n\n setupForm() {\n const isNewForm = this.form.is(':not(.gfm-form)');\n this.form.removeClass('js-new-note-form');\n if (isNewForm) {\n this.form.find('.div-dropzone').remove();\n this.form.addClass('gfm-form');\n // remove notify commit author checkbox for non-commit notes\n gl.utils.disableButtonIfEmptyField(\n this.form.find('.js-note-text'),\n this.form.find('.js-comment-button, .js-note-new-discussion'),\n );\n this.autoComplete = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources);\n this.autoComplete.setup(this.form.find('.js-gfm-input'), this.enableGFM);\n dropzoneInput(this.form);\n autosize(this.textarea);\n }\n // form and textarea event listeners\n this.addEventListeners();\n addMarkdownListeners(this.form);\n this.form.show();\n if (this.isAutosizeable) this.setupAutosize();\n }\n\n setupAutosize() {\n this.textarea.off('autosize:resized').on('autosize:resized', this.setHeightData.bind(this));\n\n this.textarea.off('mouseup.autosize').on('mouseup.autosize', this.destroyAutosize.bind(this));\n\n setTimeout(() => {\n autosize(this.textarea);\n this.textarea.css('resize', 'vertical');\n }, 0);\n }\n\n setHeightData() {\n this.textarea.data('height', this.textarea.outerHeight());\n }\n\n destroyAutosize() {\n const outerHeight = this.textarea.outerHeight();\n\n if (this.textarea.data('height') === outerHeight) return;\n\n autosize.destroy(this.textarea);\n\n this.textarea.data('height', outerHeight);\n this.textarea.outerHeight(outerHeight);\n this.textarea.css('max-height', window.outerHeight);\n }\n\n clearEventListeners() {\n this.textarea.off('focus');\n this.textarea.off('blur');\n removeMarkdownListeners(this.form);\n }\n\n addEventListeners() {\n this.textarea.on('focus', function focusTextArea() {\n $(this)\n .closest('.md-area')\n .addClass('is-focused');\n });\n this.textarea.on('blur', function blurTextArea() {\n $(this)\n .closest('.md-area')\n .removeClass('is-focused');\n });\n }\n}\n","/* eslint-disable func-names, prefer-arrow-callback, no-unused-vars, consistent-return, camelcase, class-methods-use-this */\n\n// Zen Mode (full screen) textarea\n//\n/*= provides zen_mode:enter */\n/*= provides zen_mode:leave */\n\nimport $ from 'jquery';\nimport 'vendor/jquery.scrollTo';\nimport Dropzone from 'dropzone';\nimport Mousetrap from 'mousetrap';\nimport 'mousetrap/plugins/pause/mousetrap-pause';\n\nDropzone.autoDiscover = false;\n\n//\n// ### Events\n//\n// `zen_mode:enter`\n//\n// Fired when the \"Edit in fullscreen\" link is clicked.\n//\n// **Synchronicity** Sync\n// **Bubbles** Yes\n// **Cancelable** No\n// **Target** a.js-zen-enter\n//\n// `zen_mode:leave`\n//\n// Fired when the \"Leave Fullscreen\" link is clicked.\n//\n// **Synchronicity** Sync\n// **Bubbles** Yes\n// **Cancelable** No\n// **Target** a.js-zen-leave\n//\n\nexport default class ZenMode {\n constructor() {\n this.active_backdrop = null;\n this.active_textarea = null;\n $(document).on('click', '.js-zen-enter', function(e) {\n e.preventDefault();\n return $(e.currentTarget).trigger('zen_mode:enter');\n });\n $(document).on('click', '.js-zen-leave', function(e) {\n e.preventDefault();\n return $(e.currentTarget).trigger('zen_mode:leave');\n });\n $(document).on(\n 'zen_mode:enter',\n (function(_this) {\n return function(e) {\n return _this.enter(\n $(e.target)\n .closest('.md-area')\n .find('.zen-backdrop'),\n );\n };\n })(this),\n );\n $(document).on(\n 'zen_mode:leave',\n (function(_this) {\n return function(e) {\n return _this.exit();\n };\n })(this),\n );\n $(document).on('keydown', function(e) {\n // Esc\n if (e.keyCode === 27) {\n e.preventDefault();\n return $(document).trigger('zen_mode:leave');\n }\n });\n }\n\n enter(backdrop) {\n Mousetrap.pause();\n this.active_backdrop = $(backdrop);\n this.active_backdrop.addClass('fullscreen');\n this.active_textarea = this.active_backdrop.find('textarea');\n // Prevent a user-resized textarea from persisting to fullscreen\n this.active_textarea.removeAttr('style');\n this.active_textarea.focus();\n }\n\n exit() {\n if (this.active_textarea) {\n Mousetrap.unpause();\n this.active_textarea.closest('.zen-backdrop').removeClass('fullscreen');\n this.scrollTo(this.active_textarea);\n this.active_textarea = null;\n this.active_backdrop = null;\n\n const $dropzone = $('.div-dropzone');\n if ($dropzone && !$dropzone.hasClass('js-invalid-dropzone')) {\n Dropzone.forElement('.div-dropzone').enable();\n }\n }\n }\n\n scrollTo(zen_area) {\n return $.scrollTo(zen_area, 0, {\n offset: -150,\n });\n }\n}\n"],"sourceRoot":""}