{"version":3,"sources":["webpack:///./autosave.js","webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/mousetrap/plugins/pause/mousetrap-pause.js","webpack:///./diff_notes/models/note.js","webpack:///./task_list.js","webpack:///./vue_shared/components/skeleton_loading_container.vue?3411","webpack:///./vue_shared/components/skeleton_loading_container.vue?e519","webpack:///vue_shared/components/skeleton_loading_container.vue","webpack:///./vue_shared/components/skeleton_loading_container.vue","webpack:///./vue_shared/directives/tooltip.js","webpack:///./droplab/plugins/input_setter.js","webpack:///./files_comment_button.js","webpack:///./single_file_diff.js","webpack:///./diff.js","webpack:///./lib/utils/sticky.js","webpack:///./comment_type_toggle.js","webpack:///./notes.js","webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/stickyfilljs/dist/stickyfill.js","webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/deckar01-task_list/dist/task_list.js","webpack:///./init_changes_dropdown.js","webpack:///./init_notes.js","webpack:///./mini_pipeline_graph_dropdown.js","webpack:///./dropzone_input.js","webpack:///./lib/utils/text_markdown.js","webpack:///./gl_form.js","webpack:///./zen_mode.js","webpack:///./diff_notes/icons/collapse_icon.svg","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?954a","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?c209","webpack:///vue_shared/components/user_avatar/user_avatar_image.vue","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue","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:///../images/no_avatar.png","webpack:///./image_diff/helpers/badge_helper.js","webpack:///./image_diff/helpers/comment_indicator_helper.js","webpack:///./image_diff/image_badge.js","webpack:///./image_diff/image_diff.js","webpack:///./lib/utils/image_utility.js","webpack:///./image_diff/view_types.js","webpack:///./image_diff/replaced_image_diff.js","webpack:///./commit/image_file.js","webpack:///./image_diff/helpers/index.js","webpack:///./image_diff/helpers/dom_helper.js","webpack:///./image_diff/helpers/utils_helper.js"],"names":["Autosave","field","key","_this","this","_classCallCheck","isLocalStorageAvailable","_lib_utils_accessor__WEBPACK_IMPORTED_MODULE_0__","isLocalStorageAccessSafe","join","data","restore","on","save","length","text","window","localStorage","getItem","val","trigger","event","Event","bubbles","cancelable","get","dispatchEvent","setItem","reset","removeItem","off","Mousetrap","self","_originalStopCallback","stopCallback","enabled","e","element","combo","pause","unpause","NoteModel","discussionId","noteObj","id","noteId","canResolve","resolved","resolved_by","resolvedBy","authorName","authorAvatar","noteTruncated","TaskList","options","arguments","undefined","selector","dataType","fieldName","onSuccess","onError","errorMessages","response","_typeof","errors","_flash__WEBPACK_IMPORTED_MODULE_3__","init","disable","jquery__WEBPACK_IMPORTED_MODULE_0___default","taskList","document","update","bind","$target","target","patchData","_lib_utils_axios_utils__WEBPACK_IMPORTED_MODULE_2__","patch","attr","then","_ref","catch","err","components_skeleton_loading_containervue_type_script_lang_js","props","small","type","Boolean","required","default","lines","Number","computed","lineClasses","Array","fill","map","_","i","component","Object","componentNormalizer","_h","$createElement","_c","_self","staticClass","class","animation-container-small","_l","css","index","__webpack_exports__","el","tooltip","componentUpdated","unbind","InputSetter","hook","destroyed","config","eventWrapper","addEvents","setInputs","list","addEventListener","removeEvents","removeEventListener","selectedItem","detail","selected","isArray","forEach","setInput","input","newValue","getAttribute","valueAttribute","inputAttribute","hasAttribute","setAttribute","tagName","value","textContent","destroy","files_comment_button","$diffFile","userCanCreateNote","closest","isParallelView","js_cookie_default","a","LINE_COLUMN_CLASSES","showButton","hideButton","buttonParentElement","getButtonParent","currentTarget","validateButtonParent","classList","add","nextElementSibling","remove","hoveredElement","contains","previousElementSibling","parentNode","querySelector","WRAPPER","LOADING_HTML","COLLAPSED_HTML","SingleFileDiff","file","toggleDiff","content","jquery_default","$toggleIcon","diffForPath","find","isOpen","collapsedContent","loadingContent","addClass","html","hide","after","cb","hasClass","hasError","removeClass","getContentHTML","show","gl","diffNotesCompileComponents","axios_utils","syntax_highlight","$file","canCreateNote","is","helpers","initImageDiff","flash","locale","isBound","diff_Diff","Diff","diff_classCallCheck","each","single_file_diff","tab","getElementById","dataset","isLocked","firstFile","first","handleClickUnfold","handleClickLineNum","handleParallelLineDown","url_utility","highlightSelectedLine","openAnchoredDiff","_lineNumbers","lineNumbers","parent","_lineNumbers2","_slicedToArray","oldLineNumber","newLineNumber","offset","bottom","since","to","unfold","lineNumber","prevNewLine","prev","parents","link","params","view","replaceWith","locationHash","anchoredDiff","split","diffFile","$","clickTarget","hash","preventDefault","history","pushState","location","line","table","lineClass","filter","name","children","toArray","elm","parseInt","$diffFiles","isSticky","scrollY","stickyTop","insertPlaceholder","top","Math","floor","offsetTop","placeholder","createElement","createPlaceholder","heightBefore","offsetHeight","insertBefore","style","height","stickyMonitor","CSS","supports","passive","polyfillSticky","stickyfilljs__WEBPACK_IMPORTED_MODULE_0___default","assign","input_setter","comment_type_toggle","CommentTypeToggle","opts","dropdownTrigger","dropdownList","noteTypeInput","submitButton","closeButton","reopenButton","droplab","drop_lab","setConfig","push","normalizeNewlines","str","replace","autosize","autosize_default","REGEX_QUICK_ACTIONS","notes_Notes","Notes","notes_url","note_ids","last_fetched_at","enableGFM","gfm_auto_complete","notes_classCallCheck","updateTargetButtons","updateComment","visibilityChange","cancelDiscussionForm","onAddDiffNote","onAddImageDiffNote","setupDiscussionNoteForm","onReplyToDiscussionNote","removeNote","cancelEdit","updateNote","addDiscussionNote","addNoteError","addNote","resetMainTargetForm","refresh","keydownNoteText","toggleCommitList","postComment","clearFlashWrapper","clearFlash","onHashChange","updatedNotesTrackingMap","noteable_url","URL","notesCountBadge","basePollingInterval","maxPollingSteps","$wrapperEl","common_utils","cleanBinding","addBinding","setPollingInterval","setupMainTargetNoteForm","task_list","collapseLongCommitList","setViewType","clone","insertAfter","$anchor","loadLazyDiff","instance","showEditForm","removeAttachment","updateFormAttachment","onClickRetryLazyLoad","reenableTargetFormSubmitButton","$textarea","discussionNoteForm","editNote","myLastNote","which","gon","current_user_id","confirm","removeDiscussionNoteForm","removeNoteEditForm","interval","clearInterval","setInterval","pollingInterval","hidden","getContent","_this2","refreshing","headers","X-Last-Fetched-At","notes","note","renderNote","shouldReset","nthInterval","pow","initRefresh","noteEntity","votesBlock","commands_changes","checkMergeRequestStatus","eq","awards_handler","awardsHandler","addAwardToEmojiBar","emoji_award","scrollToAwards","$note","datetime_utility","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","keys","addFlash","parentTimeline","discussionContainer","form","row","lineType","diffAvatarContainer","discussion_id","discussion_line_code","on_image","prevAll","diff_discussion_html","$discussion","renderGFM","$notes","contentContainerClass","append","discussion_resolvable","renderDiscussionAvatar","changesDiscussionContainer","avatarHolder","click","createEvent","initEvent","formClone","setupNoteForm","initCommentTypeToggle","textarea","glForm","gl_form","autosave","formParentTimeline","$parentTimeline","isNewDiffComment","mergeRequestId","ResolveService","toggleResolveForDiscussion","$targetNote","$noteEntityEl","revertNoteEditForm","$el","isAllowed","scrollTo","$editForm","getEditFormSelector","$currentlyEditing","checkContentToAllowEditing","putEditFormInPlace","enable","noteElId","diffNoteApps","$destroy","notesTr","removeBadgeEvent","CustomEvent","badgeNumber","replyToDiscussionNote","replyLink","cleanForm","dataHolder","diffFileData","discussionID","focus","$link","showReplyInput","toggleDiffNote","clickEvent","newForm","$noteContainer","appendTo","addForm","hasNotes","replyButton","rowCssToAdd","_ref2","forceShow","_ref2$showReplyInput","nextRow","next","targetRow","lineTypeSelector","notesContentSelector","notesContent","isCurrentlyShown","showNow","toggleClass","blurEvent","filename","closebtn","closetext","discardbtn","reopenbtn","reopentext","$originalContentEl","originalContent","postUrl","targetId","targetType","markdownVersion","updateCount","$retryButton","prop","$container","renderPlaceholderComponent","url","$errorContainer","$successContainer","_ref3","renderDiffContent","Promise","resolve","$element","$closestSystemCommitList","siblings","systemNotes","has","systemNote","$systemNote","headerMessage","_len","flashParams","_key","flashContainer","Function","prototype","apply","concat","display","formData","serialize","formContent","underscore_default","escape","formAction","formContentOriginal","test","tempFormContent","executedCommands","command","RegExp","description","toLowerCase","_ref4","uniqueId","isDiscussionNote","currentUsername","currentUserFullname","currentUserAvatar","discussionClass","$tempNote","_ref5","_this3","$submitBtn","$closeBtn","isMainForm","isDiscussionForm","isDiscussionResolve","_getFormData","getFormData","noteUniqueId","systemNoteUniqueId","hasQuickActions","$notesContainer","stripQuickActions","createPlaceholderNote","current_username","current_user_fullname","current_user_avatar_url","createPlaceholderSystemNote","getQuickActionDescription","ajax_cache","GfmAutoComplete","dataSources","commands","post","res","notePosition","_JSON$parse","JSON","parse","x","y","width","addBadgeEvent","handleQuickActions","closestDiffFile","_this4","$editingNote","$noteBodyText","_getFormData2","cachedNoteBodyText","_ref6","updateNoteError","initDroplab","addTargetClass","vue_esm","components","SkeletonLoadingContainer","skeleton_loading_container","render","prepend","fileHolder","noteIds","inArray","mrWidget","checkStatus","noteHtml","_createClass","defineProperties","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","seppuku","getComputedStyle","testNode","some","prefix","position","shadowRootExists","ShadowRoot","scroll","left","stickies","extend","targetObj","sourceObject","hasOwnProperty","parseNumeric","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetParent","Sticky","TypeError","HTMLElement","Error","sticky","_node","_stickyMode","_active","_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","padding","border","borderSpacing","fontSize","stickyMode","abs","removeChild","splice","Stickyfill","addOne","nodeList","addedStickies","_loop","refreshAll","removeOne","_loop2","removeAll","checkScroll","pageXOffset","fastCheckTimer","startFastCheckTimer","_fastCheck","docHiddenKey","visibilityChangeEventName","module","exports","jQuery","factory","modules","installedModules","__webpack_require__","moduleId","l","call","m","c","d","getter","o","n","__esModule","object","property","p","s","NodeArray","indexOf","item","slice","className","eventName","initCustomEvent","el1","container","updateTaskList","querySelectorAll","checkbox","disabled","changeEvent","changedEvent","checkboxes","checked","defaultPrevented","updateSource","incomplete","complete","escapePattern","incompletePattern","completePattern","itemPattern","startFencesPattern","endFencesPattern","itemsInParasPattern","source","itemIndex","clean","inCodeBlock","len","ref","results","match","fn","method","_lib_utils_sticky__WEBPACK_IMPORTED_MODULE_1__","glDropdown","filterable","remoteFilter","dataEl","innerHTML","notesUrl","notesIds","now","diffView","_notes__WEBPACK_IMPORTED_MODULE_0__","initialize","MiniPipelineGraph","dropdownListSelector","getBuildsList","stopPropagation","stageContainer","parentElement","button","relatedTarget","endpoint","stageEndpoint","renderBuildsList","toggleLoading","stopDropdownClickPropagation","dropdown","_flash__WEBPACK_IMPORTED_MODULE_1__","toggle","dropzoneInput","$attachButton","$attachingFileMessage","$cancelButton","$retryLink","$uploadProgress","$uploadingErrorContainer","$uploadingErrorMessage","$uploadingProgressContainer","uploadsPath","uploads_path","maxFileSize","max_file_size","formTextarea","handlePaste","pasteText","addFileToForm","updateAttachingMessage","isImage","getFilename","uploadFile","wrap","$mdArea","setupMarkdownPreview","$formDropzone","dropzone","dictDefaultMessage","clickable","paramName","maxFilesize","uploadMultiple","csrf","previewContainer","processing","alert","dragover","dragleave","drop","success","header","processingFileCount","getQueuedFiles","getUploadingFiles","shouldPad","markdown","error","errorMessage","xhr","message","responseText","isString","totaluploadprogress","totalUploadProgress","files","round","sending","removedfile","queuecomplete","child","dropzone_default","forElement","removeAllFiles","dropzoneInstance","failedFiles","failedFile","status","ERROR","accepted","addFile","pasteEvent","originalEvent","clipboardData","items","image","getAsFile","formattedText","caretStart","selectionStart","caretEnd","selectionEnd","textEnd","beforeSelection","substring","afterSelection","setSelectionRange","scrollHeight","path","getData","closeSpinner","FormData","md","$child","insertToTextArea","messageContainer","attachingMessage","filesCount","autoDiscover","updateText","textArea","tag","blockTag","$textArea","selectedText","textToInsert","selectedSplit","startChar","removedLastNewLine","removedFirstNewLine","currentLineEmpty","lastNewLine","substr","lastIndexOf","before","lineBefore","lineAfter","blockTagText","wrapped","pos","moveCursor","insertMarkdownText","gl_form_GLForm","GLForm","setupForm","clearEventListeners","autoComplete","isNewForm","utils","disableButtonIfEmptyField","setup","addEventListeners","$this","isAutosizeable","setupAutosize","setHeightData","destroyAutosize","setTimeout","outerHeight","dropzone__WEBPACK_IMPORTED_MODULE_2___default","ZenMode","active_backdrop","active_textarea","enter","exit","keyCode","backdrop","mousetrap__WEBPACK_IMPORTED_MODULE_3___default","removeAttr","$dropzone","zen_area","user_avatar_user_avatar_imagevue_type_script_lang_js","directives","lazy","imgSrc","String","no_avatar_default","cssClasses","imgAlt","size","tooltipText","tooltipPlacement","sanitizedSource","baseSrc","resultantSrcAttribute","lazy_loader","tooltipContainer","avatarSizeClass","_obj","_vm","rawName","attrs","src","alt","data-src","data-container","data-placement","title","data-boundary","discussion_DiscussionModel","DiscussionModel","loading","set","delete","discussionSelector","$discussionHeadline","discussion_headline_html","CommentsStore","state","getNote","createDiscussion","discussion","create","createNote","deleteNote","notesCount","unresolvedDiscussionIds","ids","isResolved","resolve_ResolveServiceClass","ResolveServiceClass","root","resolve_classCallCheck","noteResource","resource","discussionResource","unResolveAll","resolveAll","resp","json","unResolveAllNotes","resolveAllNotes","updateHeadline","DiffNotesResolveServiceClass","mixins_discussion","discussionCount","discussions","resolvedDiscussionCount","resolvedCount","unresolvedDiscussionCount","unresolvedCount","CommentAndResolveBtn","textareaIsEmpty","isResolvable","isDiscussionResolved","buttonText","created","mounted","JumpToDiscussion","mixins","allResolved","lastResolvedId","lastId","methods","jumpToNextUnresolvedDiscussion","discussionsSelector","discussionIdsInScope","firstUnresolvedDiscussionId","nextUnresolvedDiscussionId","activeTab","mrTabs","currentAction","hasDiscussionsToJumpTo","jumpToFirstDiscussion","discussionIdsForElements","elements","activateTab","currentDiscussionFound","$notesHolder","prevEl","ResolveBtn","resolvedByName","watch","handler","deep","$refs","beforeDestroy","updateTooltip","$nextTick","unresolve","ResolveCount","loggedOut","resolvedCountText","ResolveDiscussionBtn","DiffNoteAvatars","userAvatarImage","user_avatar_image","isVisible","storeState","shownAvatars","collapseIcon","collapse_icon_default","discussionClassName","notesSubset","extraNotesTitle","extra","moreText","addNoCommentClass","setDiscussionVisible","clickedAvatar","toggleDiscussionsToggleState","nextUntil","$notesHolders","$visibleNotesHolders","getTooltipText","template","NewIssueForDiscussion","createHeader","childElementCount","mergeRequestCount","headerText","getHeaderText","createItem","mergeRequest","$item","href","iid","createLink","$title","createTitle","fetchCommitMergeRequests","$content","mergeRequests","$header","createContent","Flash","diff","zen_mode","shortcuts_navigation","mini_pipeline_graph_dropdown","bindEvents","init_notes","projectPath","init_changes_dropdown","load","commitPath","tmpApp","outerHTML","$mount","one","$components","createImageBadge","classNames","buttonEl","addCommentIndicator","containerEl","spriteIcon","appendChild","defaultMeta","ImageBadge","actual","browser","imageEl","resizeCoordinatesToImageElement","ImageDiff","image_diff_classCallCheck","renderCommentBadge","imageBadges","imageFrameEl","imageClickedWrapper","imageClicked","imageBlurredWrapper","removeCommentIndicator","addBadgeWrapper","addBadge","removeBadgeWrapper","removeBadge","renderBadgesWrapper","renderBadges","naturalHeight","toggleCollapsed","commentIndicatorOnClick","customEvent","selection","getTargetSelection","setPositionDataAttribute","showCommentIndicator","discussionsEls","_toConsumableArray","renderBadge","discussionEl","imageBadge","generateBadgeFromDiscussionDOM","coordinate","addImageCommentBadge","numberBadgeOptions","badgeText","addImageBadge","_event$detail","image_badge","addAvatarBadge","updateDiscussionBadgeNumber","indexToRemove","imageBadgeEls","badge","updatedBadgeNumber","innerText","updateDiscussionAvatarBadgeNumber","viewTypes","TWO_UP","SWIPE","ONION_SKIN","image_diff","_imageFrameEls","_viewModesEls","defaultViewType","imageFrameEls","_defineProperty","viewModesEl","viewModesEls","currentView","generateImageEls","imageEls","getOwnPropertyNames","viewType","_get","ReplacedImageDiff","__proto__","getPrototypeOf","changeToViewTwoUp","changeView","changeToViewSwipe","changeToViewOnionSkin","newView","validate","indicator","existingBadges","replaced_image_diff_toConsumableArray","renderNewView","removed","normalizedIndicator","availWidth","viewModes","ImageFile","image_file_classCallCheck","views","two-up","requestImageInfo","swipe","maxHeight","maxWidth","$swipeWrap","$swipeBar","$swipeFrame","wrapPadding","prepareFrames","initDraggable","onion-skin","dragTrackWidth","$frame","$track","$dragger","$frameAdded","framePadding","opacity","deletedWidth","deletedHeight","initViewModes","waitForImages","initView","viewMode","activateViewMode","fadeOut","fadeIn","callback","dragging","$body","$offsetEl","pageX","frame","img","domImg","naturalWidth","commentIndicatorEl","willRemove","meta","avatarBadgeEl","positionObject","stringify","newBadgeNumber","discussionNotesEl","formEl","isCollapsed","imageWidth","imageHeight","widthRatio","heightRatio","firstNoteEl","offsetX","offsetY","actualWidth","actualHeight","normalizedX","max","min","normalizedY","fileEl","image_file","replaced_image_diff"],"mappings":"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","file":"pages.projects.commit.show.bdf1485d.chunk.js","sourcesContent":["/* 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","/**\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","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 $ from 'jquery';\nimport 'deckar01-task_list';\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.onSuccess = options.onSuccess || (() => {});\n this.onError = 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 // Prevent duplicate event bindings\n this.disable();\n $(`${this.selector} .js-task-list-container`).taskList('enable');\n $(document).on('tasklist:changed', `${this.selector} .js-task-list-container`, this.update.bind(this));\n }\n\n disable() {\n $(`${this.selector} .js-task-list-container`).taskList('disable');\n $(document).off('tasklist:changed', `${this.selector} .js-task-list-container`);\n }\n\n update(e) {\n const $target = $(e.target);\n const patchData = {};\n patchData[this.dataType] = {\n [this.fieldName]: $target.val(),\n };\n\n return axios.patch($target.data('updateUrl') || $('form.js-issuable-update').attr('action'), patchData)\n .then(({ data }) => this.onSuccess(data))\n .catch(err => this.onError(err));\n }\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"animation-container\",class:{\n 'animation-container-small': _vm.small,\n }},_vm._l((_vm.lineClasses),function(css,index){return _c('div',{key:index,class:css})}))}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./skeleton_loading_container.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./skeleton_loading_container.vue?vue&type=script&lang=js\"","\n\n\n","import { render, staticRenderFns } from \"./skeleton_loading_container.vue?vue&type=template&id=9cc0ad7e\"\nimport script from \"./skeleton_loading_container.vue?vue&type=script&lang=js\"\nexport * from \"./skeleton_loading_container.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import $ from 'jquery';\n\nexport default {\n bind(el) {\n $(el).tooltip({\n trigger: 'hover',\n });\n },\n\n componentUpdated(el) {\n $(el).tooltip('_fixTitle');\n },\n\n unbind(el) {\n $(el).tooltip('dispose');\n },\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 signficant 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 = $diffFile.closest(DIFF_CONTAINER_SELECTOR).data('canCreateNote') === '';\n }\n\n this.isParallelView = Cookies.get('diff_view') === 'parallel';\n\n if (this.userCanCreateNote) {\n $diffFile.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 !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","/* 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 = '
Could not load diff
';\nconst COLLAPSED_HTML = '
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).addClass('loading').html(LOADING_HTML).hide();\n this.content = null;\n this.collapsedContent.after(this.loadingContent);\n this.$toggleIcon.addClass('fa-caret-right');\n } else {\n this.collapsedContent = $(WRAPPER).html(COLLAPSED_HTML).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('click', (function (e) {\n this.toggleDiff($(e.target));\n }).bind(this));\n }\n\n toggleDiff($target, cb) {\n if (!$target.hasClass('js-file-title') && !$target.hasClass('click-to-expand') && !$target.hasClass('diff-toggle-caret')) 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.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 !== '')) FilesCommentButton.init($diffFile);\n\n const firstFile = $('.files').first().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.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","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 (insertPlaceholder && el.nextElementSibling && el.nextElementSibling.classList.contains('sticky-placeholder')) {\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 (typeof CSS === 'undefined' || !(CSS.supports('(position: -webkit-sticky) or (position: sticky)'))) return;\n\n document.addEventListener('scroll', () => isSticky(el, window.scrollY, stickyTop, insertPlaceholder), {\n passive: true,\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","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 input: this.noteTypeInput,\n valueAttribute: 'data-value',\n },\n {\n input: this.submitButton,\n valueAttribute: 'data-submit-text',\n }],\n };\n\n if (this.closeButton) {\n config.InputSetter.push({\n input: this.closeButton,\n valueAttribute: 'data-close-text',\n }, {\n input: this.closeButton,\n valueAttribute: 'data-close-text',\n inputAttribute: 'data-alternative-text',\n });\n }\n\n if (this.reopenButton) {\n config.InputSetter.push({\n input: this.reopenButton,\n valueAttribute: 'data-reopen-text',\n }, {\n input: this.reopenButton,\n valueAttribute: 'data-reopen-text',\n inputAttribute: 'data-alternative-text',\n });\n }\n\n return config;\n }\n}\n\nexport default CommentTypeToggle;\n","/* eslint-disable no-restricted-properties, func-names, no-var, wrap-iife, camelcase,\nno-unused-expressions, max-len, one-var, one-var-declaration-per-line, 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 SkeletonLoadingContainer from '~/vue_shared/components/skeleton_loading_container.vue';\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 // reset main target form when clicking discard\n this.$wrapperEl.on('click', '.js-note-discard', this.resetMainTargetForm);\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('click', '.js-note-discard');\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 * setup 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 // setup 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-note-discard')\n .show()\n .removeClass('js-note-discard')\n .addClass('js-close-discussion-note-form')\n .text(form.find('.js-close-discussion-note-form').data('cancelText'));\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 // Setup 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, discardbtn, 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 discardbtn = form.find('.js-note-discard');\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 if (discardbtn.is(':hidden')) {\n return discardbtn.show();\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 if (discardbtn.is(':visible')) {\n return discardbtn.hide();\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 var markdownVersion = $originalContentEl.data('markdownVersion');\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 .attr('data-markdown-version', markdownVersion);\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 SkeletonLoadingContainer,\n },\n render(createElement) {\n return createElement('skeleton-loading-container');\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","/*!\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);","(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;\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 this.field.value = TaskList.updateSource(this.field.value, index, item.checked);\n changeEvent = createEvent('change');\n this.field.dispatchEvent(changeEvent);\n changedEvent = createEvent('tasklist:changed', {\n index: index,\n checked: item.checked\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+(?!\\\\(.*?\\\\))(?=(?:\\\\[.*?\\\\]\\\\s*(?:\\\\[.*?\\\\]|\\\\(.*?\\\\))\\\\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, inCodeBlock, index, line, result;\n clean = source.replace(/\\r/g, '').replace(this.itemsInParasPattern, '').split(\"\\n\");\n index = 0;\n inCodeBlock = false;\n result = (function() {\n var i, len, ref, results;\n ref = source.split(\"\\n\");\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\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 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 result.join(\"\\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 { 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 {\n notesUrl,\n notesIds,\n now,\n diffView,\n enableGFM,\n } = 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 $ 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.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 ($(button).parent().hasClass('open')) {\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.querySelector(\n `${this.dropdownListSelector} .js-builds-dropdown-loading`,\n ).classList.toggle('hidden');\n }\n}\n","import $ from 'jquery';\nimport Dropzone from 'dropzone';\nimport _ from 'underscore';\nimport './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(e.target.closest('.js-main-target-form').querySelector('.div-dropzone'));\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).val().substring(0, caretStart);\n const afterSelection = $(child).val().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.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').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).closest('.gfm-form').find('.div-dropzone').click();\n formTextarea.focus();\n });\n\n return Dropzone.forElement($formDropzone.get(0));\n}\n","/* eslint-disable func-names, no-var, no-param-reassign, quotes, one-var, one-var-declaration-per-line, operator-assignment, no-else-return, prefer-template, prefer-arrow-callback, max-len, consistent-return, no-unused-vars, max-len */\nimport $ from 'jquery';\nimport { insertText } from '~/lib/utils/common_utils';\n\nfunction selectedText(text, textarea) {\n return text.substring(textarea.selectionStart, textarea.selectionEnd);\n}\n\nfunction lineBefore(text, textarea) {\n var split;\n split = text.substring(0, textarea.selectionStart).trim().split('\\n');\n return split[split.length - 1];\n}\n\nfunction lineAfter(text, textarea) {\n return text.substring(textarea.selectionEnd).trim().split('\\n')[0];\n}\n\nfunction blockTagText(text, textArea, blockTag, selected) {\n const before = lineBefore(text, textArea);\n const after = lineAfter(text, textArea);\n if (before === blockTag && after === blockTag) {\n // To remove the block tag we have to select the line before & after\n if (blockTag != null) {\n textArea.selectionStart = textArea.selectionStart - (blockTag.length + 1);\n textArea.selectionEnd = textArea.selectionEnd + (blockTag.length + 1);\n }\n return selected;\n } else {\n return blockTag + \"\\n\" + selected + \"\\n\" + blockTag;\n }\n}\n\nfunction moveCursor(textArea, tag, wrapped, removedLastNewLine) {\n var pos;\n if (!textArea.setSelectionRange) {\n return;\n }\n if (textArea.selectionStart === textArea.selectionEnd) {\n if (wrapped) {\n pos = textArea.selectionStart - tag.length;\n } else {\n pos = textArea.selectionStart;\n }\n\n if (removedLastNewLine) {\n pos -= 1;\n }\n\n return textArea.setSelectionRange(pos, pos);\n }\n}\n\nexport function insertMarkdownText(textArea, text, tag, blockTag, selected, wrap) {\n var textToInsert, inserted, selectedSplit, startChar, removedLastNewLine, removedFirstNewLine, currentLineEmpty, lastNewLine;\n removedLastNewLine = false;\n removedFirstNewLine = false;\n currentLineEmpty = false;\n\n // Remove the first newline\n if (selected.indexOf('\\n') === 0) {\n removedFirstNewLine = true;\n selected = selected.replace(/\\n+/, '');\n }\n\n // Remove the last newline\n if (textArea.selectionEnd - textArea.selectionStart > selected.replace(/\\n$/, '').length) {\n removedLastNewLine = true;\n selected = selected.replace(/\\n$/, '');\n }\n\n selectedSplit = selected.split('\\n');\n\n if (!wrap) {\n lastNewLine = textArea.value.substr(0, textArea.selectionStart).lastIndexOf('\\n');\n\n // Check whether the current line is empty or consists only of spaces(=handle as empty)\n if (/^\\s*$/.test(textArea.value.substring(lastNewLine, textArea.selectionStart))) {\n currentLineEmpty = true;\n }\n }\n\n startChar = !wrap && !currentLineEmpty && textArea.selectionStart > 0 ? '\\n' : '';\n\n if (selectedSplit.length > 1 && (!wrap || (blockTag != null && blockTag !== ''))) {\n if (blockTag != null && blockTag !== '') {\n textToInsert = blockTagText(text, textArea, blockTag, selected);\n } else {\n textToInsert = selectedSplit.map(function(val) {\n if (val.indexOf(tag) === 0) {\n return \"\" + (val.replace(tag, ''));\n } else {\n return \"\" + tag + val;\n }\n }).join('\\n');\n }\n } else {\n textToInsert = \"\" + startChar + tag + selected + (wrap ? tag : ' ');\n }\n\n if (removedFirstNewLine) {\n textToInsert = '\\n' + textToInsert;\n }\n\n if (removedLastNewLine) {\n textToInsert += '\\n';\n }\n\n insertText(textArea, textToInsert);\n return moveCursor(textArea, tag, wrap, removedLastNewLine);\n}\n\nfunction updateText(textArea, tag, blockTag, wrap) {\n var $textArea, selected, text;\n $textArea = $(textArea);\n textArea = $textArea.get(0);\n text = $textArea.val();\n selected = selectedText(text, textArea);\n $textArea.focus();\n return insertMarkdownText(textArea, text, tag, blockTag, selected, wrap);\n}\n\nfunction replaceRange(s, start, end, substitute) {\n return s.substring(0, start) + substitute + s.substring(end);\n}\n\nexport function addMarkdownListeners(form) {\n return $('.js-md', form).off('click').on('click', function() {\n const $this = $(this);\n return updateText($this.closest('.md-area').find('textarea'), $this.data('mdTag'), $this.data('mdBlock'), !$this.data('mdPrepend'));\n });\n}\n\nexport function removeMarkdownListeners(form) {\n return $('.js-md', form).off('click');\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 // Setup 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(this.form.find('.js-note-text'), this.form.find('.js-comment-button, .js-note-new-discussion'));\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 // hide discard button\n this.form.find('.js-note-discard').hide();\n this.form.show();\n if (this.isAutosizeable) this.setupAutosize();\n }\n\n setupAutosize() {\n this.textarea.off('autosize:resized')\n .on('autosize:resized', this.setHeightData.bind(this));\n\n this.textarea.off('mouseup.autosize')\n .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).closest('.md-area').addClass('is-focused');\n });\n this.textarea.on('blur', function blurTextArea() {\n $(this).closest('.md-area').removeClass('is-focused');\n });\n }\n}\n","/* eslint-disable func-names, wrap-iife, prefer-arrow-callback, no-unused-vars, consistent-return, camelcase, comma-dangle, max-len, 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('zen_mode:enter', (function(_this) {\n return function(e) {\n return _this.enter($(e.target).closest('.md-area').find('.zen-backdrop'));\n };\n })(this));\n $(document).on('zen_mode:leave', (function(_this) {\n return function(e) {\n return _this.exit();\n };\n })(this));\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","module.exports = \"\\n\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('img',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\"}],staticClass:\"avatar\",class:( _obj = {\n lazy: _vm.lazy\n }, _obj[_vm.avatarSizeClass] = true, _obj[_vm.cssClasses] = true, _obj ),attrs:{\"src\":_vm.resultantSrcAttribute,\"width\":_vm.size,\"height\":_vm.size,\"alt\":_vm.imgAlt,\"data-src\":_vm.sanitizedSource,\"data-container\":_vm.tooltipContainer,\"data-placement\":_vm.tooltipPlacement,\"title\":_vm.tooltipText,\"data-boundary\":\"window\"}})\nvar _obj;}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./user_avatar_image.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../../node_modules/babel-loader/lib/index.js??ref--0!../../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./user_avatar_image.vue?vue&type=script&lang=js\"","\n\n\n","import { render, staticRenderFns } from \"./user_avatar_image.vue?vue&type=template&id=19ebb077\"\nimport script from \"./user_avatar_image.vue?vue&type=script&lang=js\"\nexport * from \"./user_avatar_image.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/* 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, comma-dangle, max-len */\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, comma-dangle, */\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 comma-dangle, object-shorthand, func-names, no-else-return, quotes, no-lonely-if, max-len */\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 \"未解决讨论\";\n } else {\n return \"评论 & 未解决讨论\";\n }\n } else {\n if (this.textareaIsEmpty) {\n return \"解决讨论\";\n } else {\n return \"评论 & 解决讨论\";\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 = $(`.js-discussion-note-form[data-discussion-id=${this.discussionId}] .note-textarea`);\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('input.comment-and-resolve-btn');\n }\n});\n\nVue.component('comment-and-resolve-btn', CommentAndResolveBtn);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, no-else-return, guard-for-in, no-restricted-syntax, no-lonely-if, no-continue, brace-style, max-len, quotes */\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.map(function() {\n return $(this).attr('data-discussion-id');\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 disucssion 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 }\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 '标记为已解决';\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 comma-dangle, 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 ? '讨论' : '讨论';\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).closest('.diff-line-num').hasClass('old_line') ? 'old' : '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).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).closest('.code').find('.notes_holder');\n const $visibleNotesHolders = $notesHolders.filter(':visible');\n const $toggleDiffCommentsBtn = $(this.$el).closest('.diff-file').find('.js-toggle-diff-comments');\n\n $toggleDiffCommentsBtn.toggleClass('active', $notesHolders.length === $visibleNotesHolders.length);\n },\n setDiscussionVisible() {\n this.isVisible = $(`.diffs .notes[data-discussion-id=\"${this.discussion.id}\"]`).is(':visible');\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.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 '~/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 new Diff();\n new ZenMode();\n new ShortcutsNavigation();\n new MiniPipelineGraph({\n container: '.js-commit-pipeline-graph',\n }).bindEvents();\n initNotes();\n const stickyBarPaddingTop = 16;\n initChangesDropdown(document.querySelector('.navbar-gitlab').offsetHeight - stickyBarPaddingTop);\n $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath);\n fetchCommitMergeRequests();\n initDiffNotes();\n});\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAAAAAAdJSU2AAACNElEQVR4AdXYBa7jMBCA4b3/JZahzIkjp2qt+BWUWnG5ln2XxaJJb2b5F2ukL4wvzK/rP7bUcbf92u6oftLSe1ldk8efsfaVeEjusZZeC6e1RllaCk/yG6ag1lZ4WwPX69uyD6tAe/g2ipAlNMRS37awDLaFrpcMWxXQOi0jnWCWjFkSZomYJWDWKmatYNZyEWkJsvQimoZYah5NgdaLxagCtF6GRy0DshZPkeYwS/KIJWGWYjwYUzDLxCwDtJ54OKglimBLqHWahii2g1pmHLLGBmwVoRjcKlmgOdw65H5qKuGWCVi5Qlhs6m1sENZi4q3AWNvca5UYy2RjT/SAsiZey6CsIvc0wVlV5lJ0ibPMyLUGCmlxQq0IM0hLdWyro7CWEc3sXsqaK4O2zLxOsmtpfW5Q1u68ZrVmepaaNXEewawtI9X5Xl3U3n1qND6+rfPzvqoIWz/fklNCSLY153YV53J/XUxGCJnKZ1lajsn3/Ffegf6Y5pV2LUsSNL2UHzxUfh3TlYpZqqTpXZm0KZk9zJcqaEmaWPHDw0pxe05K7bWOLHFLWXVetqpYmrjle4+1y0aBaF4UOQ1NU+lYezJClkjLUnSEjqhH6zjAW4OjtY39Ibq+sawUb6W2RQfoqG0VeKuwrRJvlba17faRdbe2pTtYq6Nty/S7yAbGsQjWIq41wVoT1+IdZNy1djUcVdu5lklQWC0xHkt1X31qNEE1Pr3qKv/9XiSNj6Aaifj3/69+AYujsR/MvkpZAAAAAElFTkSuQmCC\"","export function createImageBadge(noteId, { x, y }, classNames = []) {\n const buttonEl = document.createElement('button');\n const classList = classNames.concat(['js-image-badge']);\n classList.forEach(className => buttonEl.classList.add(className));\n buttonEl.setAttribute('type', 'button');\n buttonEl.setAttribute('disabled', true);\n buttonEl.dataset.noteId = noteId;\n buttonEl.style.left = `${x}px`;\n buttonEl.style.top = `${y}px`;\n\n return buttonEl;\n}\n\nexport function addImageBadge(containerEl, { coordinate, badgeText, noteId }) {\n const buttonEl = createImageBadge(noteId, coordinate, ['badge']);\n buttonEl.innerText = badgeText;\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function addImageCommentBadge(containerEl, { coordinate, noteId }) {\n const buttonEl = createImageBadge(noteId, coordinate, ['image-comment-badge']);\n buttonEl.innerHTML = gl.utils.spriteIcon('image-comment-dark');\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function addAvatarBadge(el, event) {\n const { noteId, badgeNumber } = event.detail;\n\n // Add badge to new comment\n const avatarBadgeEl = el.querySelector(`#${noteId} .badge`);\n avatarBadgeEl.innerText = badgeNumber;\n avatarBadgeEl.classList.remove('hidden');\n}\n","export function addCommentIndicator(containerEl, { x, y }) {\n const buttonEl = document.createElement('button');\n buttonEl.classList.add('btn-transparent');\n buttonEl.classList.add('comment-indicator');\n buttonEl.setAttribute('type', 'button');\n buttonEl.style.left = `${x}px`;\n buttonEl.style.top = `${y}px`;\n\n buttonEl.innerHTML = gl.utils.spriteIcon('image-comment-dark');\n\n containerEl.appendChild(buttonEl);\n}\n\nexport function removeCommentIndicator(imageFrameEl) {\n const commentIndicatorEl = imageFrameEl.querySelector('.comment-indicator');\n const imageEl = imageFrameEl.querySelector('img');\n const willRemove = !!commentIndicatorEl;\n let meta = {};\n\n if (willRemove) {\n meta = {\n x: parseInt(commentIndicatorEl.style.left, 10),\n y: parseInt(commentIndicatorEl.style.top, 10),\n image: {\n width: imageEl.width,\n height: imageEl.height,\n },\n };\n\n commentIndicatorEl.remove();\n }\n\n return Object.assign({}, meta, {\n removed: willRemove,\n });\n}\n\nexport function showCommentIndicator(imageFrameEl, coordinate) {\n const { x, y } = coordinate;\n const commentIndicatorEl = imageFrameEl.querySelector('.comment-indicator');\n\n if (commentIndicatorEl) {\n commentIndicatorEl.style.left = `${x}px`;\n commentIndicatorEl.style.top = `${y}px`;\n } else {\n addCommentIndicator(imageFrameEl, coordinate);\n }\n}\n\nexport function commentIndicatorOnClick(event) {\n // Prevent from triggering onAddImageDiffNote in notes.js\n event.stopPropagation();\n\n const buttonEl = event.currentTarget;\n const diffViewerEl = buttonEl.closest('.diff-viewer');\n const textareaEl = diffViewerEl.querySelector('.note-container .note-textarea');\n textareaEl.focus();\n}\n","import imageDiffHelper from './helpers/index';\n\nconst defaultMeta = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n};\n\nexport default class ImageBadge {\n constructor(options) {\n const { noteId, discussionId } = options;\n\n this.actual = options.actual || defaultMeta;\n this.browser = options.browser || defaultMeta;\n this.noteId = noteId;\n this.discussionId = discussionId;\n\n if (options.imageEl && !options.browser) {\n this.browser = imageDiffHelper.resizeCoordinatesToImageElement(options.imageEl, this.actual);\n }\n }\n}\n","import $ from 'jquery';\nimport imageDiffHelper from './helpers/index';\nimport ImageBadge from './image_badge';\nimport { isImageLoaded } from '../lib/utils/image_utility';\n\nexport default class ImageDiff {\n constructor(el, options) {\n this.el = el;\n this.canCreateNote = !!(options && options.canCreateNote);\n this.renderCommentBadge = !!(options && options.renderCommentBadge);\n this.$noteContainer = $('.note-container', this.el);\n this.imageBadges = [];\n }\n\n init() {\n this.imageFrameEl = this.el.querySelector('.diff-file .js-image-frame');\n this.imageEl = this.imageFrameEl.querySelector('img');\n\n this.bindEvents();\n }\n\n bindEvents() {\n this.imageClickedWrapper = this.imageClicked.bind(this);\n this.imageBlurredWrapper = imageDiffHelper.removeCommentIndicator.bind(null, this.imageFrameEl);\n this.addBadgeWrapper = this.addBadge.bind(this);\n this.removeBadgeWrapper = this.removeBadge.bind(this);\n this.renderBadgesWrapper = this.renderBadges.bind(this);\n\n // Render badges\n if (isImageLoaded(this.imageEl)) {\n this.renderBadges();\n } else {\n this.imageEl.addEventListener('load', this.renderBadgesWrapper);\n }\n\n // jquery makes the event delegation here much simpler\n this.$noteContainer.on('click', '.js-diff-notes-toggle', imageDiffHelper.toggleCollapsed);\n $(this.el).on('click', '.comment-indicator', imageDiffHelper.commentIndicatorOnClick);\n\n if (this.canCreateNote) {\n this.el.addEventListener('click.imageDiff', this.imageClickedWrapper);\n this.el.addEventListener('blur.imageDiff', this.imageBlurredWrapper);\n this.el.addEventListener('addBadge.imageDiff', this.addBadgeWrapper);\n this.el.addEventListener('removeBadge.imageDiff', this.removeBadgeWrapper);\n }\n }\n\n imageClicked(event) {\n const customEvent = event.detail;\n const selection = imageDiffHelper.getTargetSelection(customEvent);\n const el = customEvent.currentTarget;\n\n imageDiffHelper.setPositionDataAttribute(el, selection.actual);\n imageDiffHelper.showCommentIndicator(this.imageFrameEl, selection.browser);\n }\n\n renderBadges() {\n const discussionsEls = this.el.querySelectorAll('.note-container .discussion-notes .notes');\n [...discussionsEls].forEach(this.renderBadge.bind(this));\n }\n\n renderBadge(discussionEl, index) {\n const imageBadge = imageDiffHelper\n .generateBadgeFromDiscussionDOM(this.imageFrameEl, discussionEl);\n\n this.imageBadges.push(imageBadge);\n\n const options = {\n coordinate: imageBadge.browser,\n noteId: imageBadge.noteId,\n };\n\n if (this.renderCommentBadge) {\n imageDiffHelper.addImageCommentBadge(this.imageFrameEl, options);\n } else {\n const numberBadgeOptions = Object.assign({}, options, {\n badgeText: index + 1,\n });\n\n imageDiffHelper.addImageBadge(this.imageFrameEl, numberBadgeOptions);\n }\n }\n\n addBadge(event) {\n const { x, y, width, height, noteId, discussionId } = event.detail;\n const badgeText = this.imageBadges.length + 1;\n const imageBadge = new ImageBadge({\n actual: {\n x,\n y,\n width,\n height,\n },\n imageEl: this.imageFrameEl.querySelector('img'),\n noteId,\n discussionId,\n });\n\n this.imageBadges.push(imageBadge);\n\n imageDiffHelper.addImageBadge(this.imageFrameEl, {\n coordinate: imageBadge.browser,\n badgeText,\n noteId,\n });\n\n imageDiffHelper.addAvatarBadge(this.el, {\n detail: {\n noteId,\n badgeNumber: badgeText,\n },\n });\n\n const discussionEl = this.el.querySelector(`#discussion_${discussionId}`);\n imageDiffHelper.updateDiscussionBadgeNumber(discussionEl, badgeText);\n }\n\n removeBadge(event) {\n const { badgeNumber } = event.detail;\n const indexToRemove = badgeNumber - 1;\n const imageBadgeEls = this.imageFrameEl.querySelectorAll('.badge');\n\n if (this.imageBadges.length !== badgeNumber) {\n // Cascade badges count numbers for (avatar badges + image badges)\n this.imageBadges.forEach((badge, index) => {\n if (index > indexToRemove) {\n const { discussionId } = badge;\n const updatedBadgeNumber = index;\n const discussionEl = this.el.querySelector(`#discussion_${discussionId}`);\n\n imageBadgeEls[index].innerText = updatedBadgeNumber;\n\n imageDiffHelper.updateDiscussionBadgeNumber(discussionEl, updatedBadgeNumber);\n imageDiffHelper.updateDiscussionAvatarBadgeNumber(discussionEl, updatedBadgeNumber);\n }\n });\n }\n\n this.imageBadges.splice(indexToRemove, 1);\n\n const imageBadgeEl = imageBadgeEls[indexToRemove];\n imageBadgeEl.remove();\n }\n}\n","/* eslint-disable import/prefer-default-export */\n\nexport function isImageLoaded(element) {\n return element.complete && element.naturalHeight !== 0;\n}\n","export const viewTypes = {\n TWO_UP: 'TWO_UP',\n SWIPE: 'SWIPE',\n ONION_SKIN: 'ONION_SKIN',\n};\n\nexport function isValidViewType(validate) {\n return !!Object.getOwnPropertyNames(viewTypes).find(viewType => viewType === validate);\n}\n","import imageDiffHelper from './helpers/index';\nimport { viewTypes, isValidViewType } from './view_types';\nimport ImageDiff from './image_diff';\n\nexport default class ReplacedImageDiff extends ImageDiff {\n init(defaultViewType = viewTypes.TWO_UP) {\n this.imageFrameEls = {\n [viewTypes.TWO_UP]: this.el.querySelector('.two-up .js-image-frame'),\n [viewTypes.SWIPE]: this.el.querySelector('.swipe .js-image-frame'),\n [viewTypes.ONION_SKIN]: this.el.querySelector('.onion-skin .js-image-frame'),\n };\n\n const viewModesEl = this.el.querySelector('.view-modes-menu');\n this.viewModesEls = {\n [viewTypes.TWO_UP]: viewModesEl.querySelector('.two-up'),\n [viewTypes.SWIPE]: viewModesEl.querySelector('.swipe'),\n [viewTypes.ONION_SKIN]: viewModesEl.querySelector('.onion-skin'),\n };\n\n this.currentView = defaultViewType;\n this.generateImageEls();\n this.bindEvents();\n }\n\n generateImageEls() {\n this.imageEls = {};\n\n const viewTypeNames = Object.getOwnPropertyNames(viewTypes);\n viewTypeNames.forEach((viewType) => {\n this.imageEls[viewType] = this.imageFrameEls[viewType].querySelector('img');\n });\n }\n\n bindEvents() {\n super.bindEvents();\n\n this.changeToViewTwoUp = this.changeView.bind(this, viewTypes.TWO_UP);\n this.changeToViewSwipe = this.changeView.bind(this, viewTypes.SWIPE);\n this.changeToViewOnionSkin = this.changeView.bind(this, viewTypes.ONION_SKIN);\n\n this.viewModesEls[viewTypes.TWO_UP].addEventListener('click', this.changeToViewTwoUp);\n this.viewModesEls[viewTypes.SWIPE].addEventListener('click', this.changeToViewSwipe);\n this.viewModesEls[viewTypes.ONION_SKIN].addEventListener('click', this.changeToViewOnionSkin);\n }\n\n get imageEl() {\n return this.imageEls[this.currentView];\n }\n\n get imageFrameEl() {\n return this.imageFrameEls[this.currentView];\n }\n\n changeView(newView) {\n if (!isValidViewType(newView)) {\n return;\n }\n\n const indicator = imageDiffHelper.removeCommentIndicator(this.imageFrameEl);\n\n this.currentView = newView;\n\n // Clear existing badges on new view\n const existingBadges = this.imageFrameEl.querySelectorAll('.badge');\n [...existingBadges].map(badge => badge.remove());\n\n // Remove existing references to old view image badges\n this.imageBadges = [];\n\n // Image_file.js has a fade animation of 200ms for loading the view\n // Need to wait an additional 250ms for the images to be displayed\n // on window in order to re-normalize their dimensions\n setTimeout(this.renderNewView.bind(this, indicator), 250);\n }\n\n renderNewView(indicator) {\n // Generate badge coordinates on new view\n this.renderBadges();\n\n // Re-render indicator in new view\n if (indicator.removed) {\n const normalizedIndicator = imageDiffHelper\n .resizeCoordinatesToImageElement(this.imageEl, {\n x: indicator.x,\n y: indicator.y,\n width: indicator.image.width,\n height: indicator.image.height,\n });\n imageDiffHelper.showCommentIndicator(this.imageFrameEl, normalizedIndicator);\n }\n }\n}\n","/* eslint-disable func-names, wrap-iife, no-var, prefer-arrow-callback, no-else-return, consistent-return, prefer-template, quotes, one-var, one-var-declaration-per-line, no-unused-vars, no-return-assign, comma-dangle, quote-props, no-unused-expressions, no-sequences, max-len */\n\nimport $ from 'jquery';\n\n// Width where images must fits in, for 2-up this gets divided by 2\nconst availWidth = 900;\nconst viewModes = ['two-up', 'swipe'];\n\nexport default class ImageFile {\n constructor(file) {\n this.file = file;\n this.requestImageInfo($('.two-up.view .frame.deleted img', this.file), (function(_this) {\n return function(deletedWidth, deletedHeight) {\n return _this.requestImageInfo($('.two-up.view .frame.added img', _this.file), function(width, height) {\n _this.initViewModes();\n\n // Load two-up view after images are loaded\n // so that we can display the correct width and height information\n const $images = $('.two-up.view img', _this.file);\n\n $images.waitForImages(function() {\n _this.initView('two-up');\n });\n });\n };\n })(this));\n }\n\n initViewModes() {\n const viewMode = viewModes[0];\n $('.view-modes', this.file).removeClass('hide');\n $('.view-modes-menu', this.file).on('click', 'li', (function(_this) {\n return function(event) {\n if (!$(event.currentTarget).hasClass('active')) {\n return _this.activateViewMode(event.currentTarget.className);\n }\n };\n })(this));\n return this.activateViewMode(viewMode);\n }\n\n activateViewMode(viewMode) {\n $('.view-modes-menu li', this.file).removeClass('active').filter(\".\" + viewMode).addClass('active');\n return $(\".view:visible:not(.\" + viewMode + \")\", this.file).fadeOut(200, (function(_this) {\n return function() {\n $(\".view.\" + viewMode, _this.file).fadeIn(200);\n return _this.initView(viewMode);\n };\n })(this));\n }\n\n initView(viewMode) {\n return this.views[viewMode].call(this);\n }\n // eslint-disable-next-line class-methods-use-this\n initDraggable($el, padding, callback) {\n var dragging = false;\n var $body = $('body');\n var $offsetEl = $el.parent();\n\n $el.off('mousedown').on('mousedown', function() {\n dragging = true;\n $body.css('user-select', 'none');\n });\n\n $body.off('mouseup').off('mousemove').on('mouseup', function() {\n dragging = false;\n $body.css('user-select', '');\n })\n .on('mousemove', function(e) {\n var left;\n if (!dragging) return;\n\n left = e.pageX - ($offsetEl.offset().left + padding);\n\n callback(e, left);\n });\n }\n\n prepareFrames(view) {\n var maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n $('.frame', view).each((function(_this) {\n return function(index, frame) {\n var height, width;\n width = $(frame).width();\n height = $(frame).height();\n maxWidth = width > maxWidth ? width : maxWidth;\n return maxHeight = height > maxHeight ? height : maxHeight;\n };\n })(this)).css({\n width: maxWidth,\n height: maxHeight\n });\n return [maxWidth, maxHeight];\n }\n\n views = {\n 'two-up': function() {\n return $('.two-up.view .wrap', this.file).each((function(_this) {\n return function(index, wrap) {\n $('img', wrap).each(function() {\n var currentWidth;\n currentWidth = $(this).width();\n if (currentWidth > availWidth / 2) {\n return $(this).width(availWidth / 2);\n }\n });\n return _this.requestImageInfo($('img', wrap), function(width, height) {\n $('.image-info .meta-width', wrap).text(width + \"px\");\n $('.image-info .meta-height', wrap).text(height + \"px\");\n return $('.image-info', wrap).removeClass('hide');\n });\n };\n })(this));\n },\n 'swipe': function() {\n var maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n return $('.swipe.view', this.file).each((function(_this) {\n return function(index, view) {\n var $swipeWrap, $swipeBar, $swipeFrame, wrapPadding, ref;\n ref = _this.prepareFrames(view), [maxWidth, 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 'onion-skin': function() {\n var dragTrackWidth, maxHeight, maxWidth;\n maxWidth = 0;\n maxHeight = 0;\n dragTrackWidth = $('.drag-track', this.file).width() - $('.dragger', this.file).width();\n return $('.onion-skin.view', this.file).each((function(_this) {\n return function(index, view) {\n var $frame, $track, $dragger, $frameAdded, framePadding, ref, dragging = false;\n ref = _this.prepareFrames(view), [maxWidth, 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 requestImageInfo(img, callback) {\n const domImg = img.get(0);\n if (domImg) {\n if (domImg.complete) {\n return callback.call(this, domImg.naturalWidth, domImg.naturalHeight);\n } else {\n return img.on('load', (function(_this) {\n return function() {\n return callback.call(_this, domImg.naturalWidth, domImg.naturalHeight);\n };\n })(this));\n }\n }\n }\n}\n","import * as badgeHelper from './badge_helper';\nimport * as commentIndicatorHelper from './comment_indicator_helper';\nimport * as domHelper from './dom_helper';\nimport * as utilsHelper from './utils_helper';\n\nexport default {\n addCommentIndicator: commentIndicatorHelper.addCommentIndicator,\n removeCommentIndicator: commentIndicatorHelper.removeCommentIndicator,\n showCommentIndicator: commentIndicatorHelper.showCommentIndicator,\n commentIndicatorOnClick: commentIndicatorHelper.commentIndicatorOnClick,\n\n addImageBadge: badgeHelper.addImageBadge,\n addImageCommentBadge: badgeHelper.addImageCommentBadge,\n addAvatarBadge: badgeHelper.addAvatarBadge,\n\n setPositionDataAttribute: domHelper.setPositionDataAttribute,\n updateDiscussionAvatarBadgeNumber: domHelper.updateDiscussionAvatarBadgeNumber,\n updateDiscussionBadgeNumber: domHelper.updateDiscussionBadgeNumber,\n toggleCollapsed: domHelper.toggleCollapsed,\n\n resizeCoordinatesToImageElement: utilsHelper.resizeCoordinatesToImageElement,\n generateBadgeFromDiscussionDOM: utilsHelper.generateBadgeFromDiscussionDOM,\n getTargetSelection: utilsHelper.getTargetSelection,\n initImageDiff: utilsHelper.initImageDiff,\n};\n","export function setPositionDataAttribute(el, options) {\n // Update position data attribute so that the\n // new comment form can use this data for ajax request\n const { x, y, width, height } = options;\n const { position } = el.dataset;\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"],"sourceRoot":""}