{"version":3,"sources":["webpack:///./task_list.js","webpack:///./vue_shared/components/skeleton_loading_container.vue?4fff","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:///./diff_notes/icons/collapse_icon.svg","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:///./zen_mode.js","webpack:///./diff_notes/models/note.js","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?bf53","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:///../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","webpack:///./autosave.js","webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/mousetrap/plugins/pause/mousetrap-pause.js"],"names":["TaskList","options","arguments","length","undefined","_classCallCheck","this","selector","dataType","fieldName","onSuccess","onError","e","errorMessages","response","data","_typeof","errors","join","_flash__WEBPACK_IMPORTED_MODULE_3__","init","disable","jquery__WEBPACK_IMPORTED_MODULE_0___default","taskList","document","on","update","bind","off","_this","$target","target","patchData","val","_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","key","__webpack_exports__","el","tooltip","trigger","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","get","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","window","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","id","isNewNote","$newNote","animateAppendNote","setupNewNote","updateNotesCount","isUpdatedNote","isEditing","initialContent","text","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","reset","event","createEvent","initEvent","dispatchEvent","formClone","setupNoteForm","initCommentTypeToggle","textarea","glForm","gl_form","autosave","formParentTimeline","$parentTimeline","isNewDiffComment","discussionId","mergeRequestId","ResolveService","toggleResolveForDiscussion","$targetNote","$noteEntityEl","revertNoteEditForm","$el","isAllowed","scrollTo","$editForm","getEditFormSelector","$currentlyEditing","checkContentToAllowEditing","putEditFormInPlace","noteId","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","Event","bubbles","cancelable","initCustomEvent","el1","container","field","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","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","discussion_DiscussionModel","DiscussionModel","loading","canResolve","noteObj","set","NoteModel","delete","resolved","resolved_by","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","save","unResolveAll","resolveAll","resp","json","resolvedBy","unResolveAllNotes","resolveAllNotes","updateHeadline","DiffNotesResolveServiceClass","mixins_discussion","discussionCount","discussions","resolvedDiscussionCount","resolvedCount","unresolvedDiscussionCount","unresolvedCount","CommentAndResolveBtn","String","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","authorName","authorAvatar","noteTruncated","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","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","dropzone__WEBPACK_IMPORTED_MODULE_2___default","ZenMode","active_backdrop","active_textarea","enter","exit","keyCode","backdrop","mousetrap__WEBPACK_IMPORTED_MODULE_3___default","pause","removeAttr","unpause","$dropzone","zen_area","user_avatar_user_avatar_imagevue_type_script_lang_js","directives","lazy","imgSrc","no_avatar_default","cssClasses","imgAlt","size","tooltipText","tooltipPlacement","sanitizedSource","resultantSrcAttribute","lazy_loader","tooltipContainer","avatarSizeClass","_obj","_vm","rawName","attrs","src","alt","data-src","data-container","data-placement","data-boundary","createImageBadge","classNames","buttonEl","addCommentIndicator","containerEl","spriteIcon","appendChild","defaultMeta","ImageBadge","actual","browser","imageEl","resizeCoordinatesToImageElement","ImageDiff","image_diff_classCallCheck","renderCommentBadge","imageBadges","imageFrameEl","element","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","Autosave","isLocalStorageAvailable","_lib_utils_accessor__WEBPACK_IMPORTED_MODULE_0__","isLocalStorageAccessSafe","restore","localStorage","getItem","setItem","removeItem","Mousetrap","self","_originalStopCallback","stopCallback","enabled","combo"],"mappings":"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","file":"pages.projects.commit.show.66607f52.chunk.js","sourcesContent":["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('click', '.js-toggle-lazy-diff-retry-button', this.onClickRetryLazyLoad.bind(this));\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 (\n !window.confirm('您确定要取消发表评论?')\n ) {\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 (\n !window.confirm('您确定要取消编辑评论?')\n ) {\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)\n .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\n $tempNote.find('.d-none.d-sm-inline-block').text(_.escape(currentUserFullname));\n $tempNote\n .find('.note-headline-light')\n .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\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 = 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;\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\n // If there's xhr error message, let's show it instead of dropzone's one.\n const message = xhr ? xhr.responseText : errorMessage;\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","/* 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","module.exports = \"\\n\"","/* eslint-disable camelcase, guard-for-in, no-restricted-syntax */\n/* global NoteModel */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\nimport { localTimeAgo } from '../../lib/utils/datetime_utility';\n\nclass DiscussionModel {\n constructor (discussionId) {\n this.id = discussionId;\n this.notes = {};\n this.loading = false;\n this.canResolve = false;\n }\n\n createNote (noteObj) {\n Vue.set(this.notes, noteObj.noteId, new NoteModel(this.id, noteObj));\n }\n\n deleteNote (noteId) {\n Vue.delete(this.notes, noteId);\n }\n\n getNote (noteId) {\n return this.notes[noteId];\n }\n\n notesCount() {\n return Object.keys(this.notes).length;\n }\n\n isResolved () {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (!note.resolved) {\n return false;\n }\n }\n return true;\n }\n\n resolveAllNotes (resolved_by) {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (!note.resolved) {\n note.resolved = true;\n note.resolved_by = resolved_by;\n }\n }\n }\n\n unResolveAllNotes () {\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (note.resolved) {\n note.resolved = false;\n note.resolved_by = null;\n }\n }\n }\n\n updateHeadline (data) {\n const discussionSelector = `.discussion[data-discussion-id=\"${this.id}\"]`;\n const $discussionHeadline = $(`${discussionSelector} .js-discussion-headline`);\n\n if (data.discussion_headline_html) {\n if ($discussionHeadline.length) {\n $discussionHeadline.replaceWith(data.discussion_headline_html);\n } else {\n $(`${discussionSelector} .discussion-header`).append(data.discussion_headline_html);\n }\n\n localTimeAgo($('.js-timeago', `${discussionSelector}`));\n } else {\n $discussionHeadline.remove();\n }\n }\n\n isResolvable () {\n if (!this.canResolve) {\n return false;\n }\n\n for (const noteId in this.notes) {\n const note = this.notes[noteId];\n\n if (note.canResolve) {\n return true;\n }\n }\n\n return false;\n }\n}\n\nwindow.DiscussionModel = DiscussionModel;\n","/* eslint-disable object-shorthand, func-names, camelcase, no-restricted-syntax, guard-for-in, 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(\n `${root}/notes{/noteId}/resolve?html=true`,\n );\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 () =>\n new Flash(\n 'An error occurred when trying to resolve a discussion. Please try again.',\n ),\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, comma-dangle, no-else-return, quotes */\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","/* 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","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","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=760a8c7a\"\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","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","/* 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","/**\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"],"sourceRoot":""}