{"version":3,"sources":["webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/mousetrap/plugins/pause/mousetrap-pause.js","webpack:///./task_list.js","webpack:///./vue_shared/components/skeleton_loading_container.vue?aff0","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:///./droplab/plugins/input_setter.js","webpack:///./files_comment_button.js","webpack:///./single_file_diff.js","webpack:///./diff.js","webpack:///./comment_type_toggle.js","webpack:///./notes.js","webpack:////opt/gitlab/embedded/service/gitlab-rails/node_modules/stickyfilljs/dist/stickyfill.js","webpack:///./lib/utils/sticky.js","webpack:///./vue_shared/directives/tooltip.js","webpack:///./shortcuts_navigation.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:///./project_select_combo_button.js","webpack:///./project_select.js","webpack:///./pages/projects/project.js","webpack:///./diff_notes/mixins/discussion.js","webpack:///./pages/projects/index.js","webpack:///./diff_notes/models/discussion.js","webpack:///./diff_notes/stores/comments.js","webpack:///./diff_notes/services/resolve.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:///./diff_notes/icons/collapse_icon.svg","webpack:///./mini_pipeline_graph_dropdown.js","webpack:///./diff_notes/models/note.js","webpack:///./commit_merge_requests.js","webpack:///./pages/projects/commit/show/index.js","webpack:///./dropzone_input.js","webpack:///./lib/utils/text_markdown.js","webpack:///./gl_form.js","webpack:///./zen_mode.js","webpack:///./vue_shared/components/user_avatar/user_avatar_image.vue?5c14","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:///./autosave.js"],"names":["Mousetrap","self","_originalStopCallback","stopCallback","enabled","e","element","combo","pause","unpause","TaskList","options","arguments","length","undefined","_classCallCheck","this","selector","dataType","fieldName","onSuccess","onError","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__","InputSetter","hook","destroyed","config","eventWrapper","addEvents","setInputs","list","addEventListener","removeEvents","removeEventListener","selectedItem","detail","selected","isArray","forEach","setInput","input","trigger","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","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","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","boundGetContent","getContent","$textarea","discussionNoteForm","editNote","myLastNote","which","gon","current_user_id","confirm","removeDiscussionNoteForm","removeNoteEditForm","interval","clearInterval","setInterval","pollingInterval","hidden","_this2","refreshing","headers","X-Last-Fetched-At","notes","note","renderNote","shouldReset","nthInterval","Math","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","refreshVueNotes","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","page","indexOf","discussion_resolvable","renderDiscussionAvatar","changesDiscussionContainer","avatarHolder","createElement","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","insertBefore","enable","noteElId","el","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","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","style","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","height","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","top","left","stickies","extend","targetObj","sourceObject","hasOwnProperty","parseNumeric","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetTop","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","offsetHeight","_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","isSticky","scrollY","stickyTop","insertPlaceholder","floor","placeholder","createPlaceholder","heightBefore","stickyMonitor","CSS","supports","passive","polyfillSticky","stickyfilljs__WEBPACK_IMPORTED_MODULE_0___default","tooltip","componentUpdated","unbind","ShortcutsNavigation","_possibleConstructorReturn","__proto__","getPrototypeOf","call","mousetrap__WEBPACK_IMPORTED_MODULE_0___default","_shortcuts_dashboard_navigation__WEBPACK_IMPORTED_MODULE_1__","enabledHelp","_shortcuts__WEBPACK_IMPORTED_MODULE_2__","jQuery","factory","modules","installedModules","__webpack_require__","moduleId","l","m","c","d","getter","o","n","__esModule","object","property","p","s","NodeArray","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","autocomplete","_notes__WEBPACK_IMPORTED_MODULE_0__","initialize","ProjectSelectComboButton","select","projectSelectInput","newItemBtn","resourceType","resourceLabel","formattedText","deriveTextVariants","groupId","bindEvents","initLocalStorage","openDropdown","getProjectFromLocalStorage","selectProject","accessor","isLocalStorageAccessSafe","localStorageKey","localStorageItemType","setBtnTextFromLocalStorage","select2","selectedProjectData","projectMeta","setNewItemBtnAttributes","setProjectInLocalStorage","cachedProjectData","project","defaultTextPrefix","presetTextSuffix","projectString","localStorage","getItem","stringify","setItem","projectSelect","simpleFilter","includeGroups","allProjects","orderBy","withIssuesEnabled","withMergeRequestsEnabled","minimumInputLength","query","finalCallback","projectsCallback","projects","callback","groupsCallback","groups","api","term","groupProjects","order_by","with_issues_enabled","with_merge_requests_enabled","membership","web_url","name_with_namespace","dropdownCssClass","project_select_combo_button","Project","$cloneOptions","$projectCloneField","$cloneBtnText","selectedCloneOption","$this","activeText","not","initRefSwitcher","submit","js_cookie__WEBPACK_IMPORTED_MODULE_1___default","set","projectSelectDropdown","_project_select__WEBPACK_IMPORTED_MODULE_6__","changeProject","refListItem","refLink","href","$dropdown","_lib_utils_axios_utils__WEBPACK_IMPORTED_MODULE_4__","search","_flash__WEBPACK_IMPORTED_MODULE_5__","_locale__WEBPACK_IMPORTED_MODULE_2__","selectable","filterRemote","filterByText","inputFieldName","renderRow","li","cloneNode","header","appendChild","obj","toggleLabel","clicked","$visit","shouldVisit","action","divider","_lib_utils_url_utility__WEBPACK_IMPORTED_MODULE_3__","visitUrl","DiscussionMixins","discussionCount","discussions","resolvedDiscussionCount","resolvedCount","isResolved","unresolvedDiscussionCount","unresolvedCount","_project__WEBPACK_IMPORTED_MODULE_0__","_shortcuts_navigation__WEBPACK_IMPORTED_MODULE_1__","discussion_DiscussionModel","DiscussionModel","loading","canResolve","noteObj","NoteModel","delete","resolved","resolved_by","discussionSelector","$discussionHeadline","discussion_headline_html","CommentsStore","state","getNote","createDiscussion","discussion","create","createNote","deleteNote","notesCount","unresolvedDiscussionIds","ids","resolve_ResolveServiceClass","ResolveServiceClass","root","resolve_classCallCheck","noteResource","resource","discussionResource","save","unResolveAll","resolveAll","resp","json","resolvedBy","unResolveAllNotes","resolveAllNotes","updateHeadline","DiffNotesResolveServiceClass","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","watch","handler","deep","resolvedByName","updateTooltip","$nextTick","$refs","button","unresolve","beforeDestroy","ResolveCount","loggedOut","resolvedCountText","ResolveDiscussionBtn","DiffNoteAvatars","isVisible","storeState","shownAvatars","collapseIcon","collapse_icon_default","userAvatarImage","user_avatar_image","template","addNoCommentClass","setDiscussionVisible","discussionClassName","notesSubset","extraNotesTitle","extra","moreText","clickedAvatar","toggleDiscussionsToggleState","nextUntil","$notesHolders","$visibleNotesHolders","getTooltipText","NewIssueForDiscussion","projectPath","tmpApp","outerHTML","$mount","one","$components","resolveCountAppEl","resolve-count","MiniPipelineGraph","dropdownListSelector","getBuildsList","stopPropagation","stageContainer","parentElement","relatedTarget","endpoint","stageEndpoint","renderBuildsList","toggleLoading","stopDropdownClickPropagation","dropdown","_flash__WEBPACK_IMPORTED_MODULE_1__","toggle","createHeader","childElementCount","mergeRequestCount","headerText","getHeaderText","createItem","mergeRequest","$item","path","iid","createLink","$title","title","createTitle","fetchCommitMergeRequests","$content","mergeRequests","$header","createContent","Flash","diff","zen_mode","shortcuts_navigation","mini_pipeline_graph_dropdown","init_notes","init_changes_dropdown","load","commitPath","diff_notes_bundle","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","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","caretStart","selectionStart","caretEnd","selectionEnd","textEnd","beforeSelection","substring","afterSelection","setSelectionRange","scrollHeight","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","gfm_auto_complete","setup","emojis","members","issues","milestones","labels","addEventListeners","isAutosizeable","setupAutosize","setHeightData","destroyAutosize","setTimeout","outerHeight","dropzone__WEBPACK_IMPORTED_MODULE_2___default","ZenMode","active_backdrop","active_textarea","enter","exit","keyCode","backdrop","mousetrap__WEBPACK_IMPORTED_MODULE_3___default","removeAttr","$dropzone","zen_area","user_avatar_user_avatar_imagevue_type_script_lang_js","directives","lazy","imgSrc","no_avatar_default","cssClasses","imgAlt","size","tooltipText","tooltipPlacement","sanitizedSource","resultantSrcAttribute","lazy_loader","tooltipContainer","avatarSizeClass","_obj","_vm","rawName","attrs","data-boundary","src","alt","data-src","data-container","data-placement","Autosave","isLocalStorageAvailable","_lib_utils_accessor__WEBPACK_IMPORTED_MODULE_0__","restore","removeItem"],"mappings":"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","file":"pages.projects.commit.show.01b99035.chunk.js","sourcesContent":["/**\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","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=993aae32\"\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","/* 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, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, one-var, one-var-declaration-per-line, consistent-return, no-param-reassign, max-len */\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 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, space-before-function-paren,\nno-var, prefer-rest-params, wrap-iife, no-use-before-define, camelcase,\nno-unused-expressions, quotes, max-len, one-var, one-var-declaration-per-line,\ndefault-case, prefer-template, consistent-return, no-alert, no-return-assign,\nno-param-reassign, prefer-arrow-callback, no-else-return, comma-dangle, no-new,\nbrace-style, no-lonely-if, vars-on-top, no-unused-vars, no-sequences, no-shadow,\nnewline-per-chained-call, 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 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 hasVueMRDiscussionsCookie,\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(\n notes_url,\n note_ids,\n last_fetched_at,\n view,\n enableGFM = true,\n ) {\n if (!this.instance) {\n this.instance = new Notes(\n notes_url,\n note_ids,\n last_fetched_at,\n view,\n enableGFM,\n );\n }\n }\n\n static getInstance() {\n return this.instance;\n }\n\n constructor(notes_url, note_ids, last_fetched_at, view, enableGFM = true) {\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 = hasVueMRDiscussionsCookie()\n ? $(document).find('.diffs')\n : $(document);\n this.cleanBinding();\n this.addBinding();\n this.setPollingInterval();\n this.setupMainTargetNoteForm();\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(\n 'keyup input',\n '.js-note-text',\n this.updateTargetButtons,\n );\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(\n 'click',\n '.js-note-attachment-delete',\n this.removeAttachment,\n );\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(\n 'change',\n '.js-note-attachment-input',\n this.updateFormAttachment,\n );\n // reply to diff/discussion notes\n this.$wrapperEl.on(\n 'click',\n '.js-discussion-reply-button',\n this.onReplyToDiscussionNote,\n );\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(\n 'click',\n '.js-add-image-diff-note-button',\n this.onAddImageDiffNote,\n );\n // hide diff note form\n this.$wrapperEl.on(\n 'click',\n '.js-close-discussion-note-form',\n this.cancelDiscussionForm,\n );\n // toggle commit list\n this.$wrapperEl.on(\n 'click',\n '.system-note-commit-list-toggler',\n this.toggleCommitList,\n );\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(\n 'ajax:success',\n '.js-discussion-note-form',\n this.addDiscussionNote,\n );\n this.$wrapperEl.on(\n 'ajax:success',\n '.js-main-target-form',\n this.resetMainTargetForm,\n );\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 this.boundGetContent = this.getContent.bind(this);\n document.addEventListener('refreshLegacyNotes', this.boundGetContent);\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 document.removeEventListener('refreshLegacyNotes', this.boundGetContent);\n $(window).off('hashchange', this.onHashChange);\n }\n\n static initCommentTypeToggle(form) {\n const dropdownTrigger = form.querySelector(\n '.js-comment-type-dropdown .dropdown-toggle',\n );\n const dropdownList = form.querySelector(\n '.js-comment-type-dropdown .dropdown-menu',\n );\n const noteTypeInput = form.querySelector('#note_type');\n const submitButton = form.querySelector(\n '.js-comment-type-dropdown .js-comment-submit-button',\n );\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='${\n gon.current_user_id\n }'][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 !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 !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.notes;\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 =\n 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(\n votesBlock,\n noteEntity.commands_changes.emoji_award,\n );\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 (\n noteEntity.commands_changes &&\n Object.keys(noteEntity.commands_changes).length > 0\n ) {\n $notesList.find('.system-note.being-posted').remove();\n }\n this.addFlash(\n noteEntity.errors.commands_only,\n 'notice',\n this.parentTimeline.get(0),\n );\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 (hasVueMRDiscussionsCookie()) {\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 ||\n 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 Notes.refreshVueNotes();\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 =\n $form ||\n $(\n `.js-discussion-note-form[data-discussion-id=\"${\n noteEntity.discussion_id\n }\"]`,\n );\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 = $(\n `.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`,\n );\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 (\n !this.isParallelView() ||\n row.hasClass('js-temp-notes-holder') ||\n noteEntity.on_image\n ) {\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(\n `.notes[data-discussion-id=\"${noteEntity.discussion_id}\"]`,\n );\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 }\n // Init discussion on 'Discussion' page if it is merge request page\n const page = $('body').attr('data-page');\n if (\n (page && page.indexOf('projects:merge_request') !== -1) ||\n !noteEntity.diff_discussion_html\n ) {\n if (!hasVueMRDiscussionsCookie()) {\n Notes.animateAppendNote(\n noteEntity.discussion_html,\n $('.main-notes-list'),\n );\n }\n }\n } else {\n // append new note to all matching discussions\n Notes.animateAppendNote(noteEntity.html, discussionContainer);\n }\n\n if (\n typeof gl.diffNotesCompileComponents !== 'undefined' &&\n noteEntity.discussion_resolvable\n ) {\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() {\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);\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) {\n var textarea, key;\n this.glForm = new GLForm(form, this.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 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\n .find('.js-note-text')\n .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 (\n notesTr.find('.discussion-notes').length > 1 ||\n notesTr.length === 0\n ) {\n const $diffFile = $notes.closest('.diff-file');\n if ($diffFile.length > 0) {\n const removeBadgeEvent = new CustomEvent(\n 'removeBadge.imageDiff',\n {\n detail: {\n // badgeNumber's start with 1 and index starts with 0\n badgeNumber: $notes.index() + 1,\n },\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.refreshVueNotes();\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('.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\n .removeClass('js-main-target-form')\n .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\n .find('.js-comment-resolve-button')\n .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\n .closest('.diff-viewer')\n .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\n .find('.content:not(:empty)')\n .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\n this.glForm = new GLForm($editForm.find('form'), this.enableGFM);\n\n $editForm\n .find('form')\n .attr('action', `${postUrl}?html=true`)\n .attr('data-remote', 'true');\n $editForm.find('.js-form-target-id').val(targetId);\n $editForm.find('.js-form-target-type').val(targetType);\n $editForm\n .find('.js-note-text')\n .focus()\n .val(originalContent);\n $editForm.find('.js-md-write-button').trigger('click');\n $editForm.find('.referenced-users').hide();\n }\n\n putConflictEditWarningInPlace(noteEntity, $note) {\n if ($note.find('.js-conflict-edit-warning').length === 0) {\n const $alert = $(`
\n This comment has changed since you started editing, please review the\n \n updated comment\n \n to ensure information is not lost\n
`);\n $alert.insertAfter($note.find('.note-text'));\n }\n }\n\n updateNotesCount(updateCount) {\n return this.notesCountBadge.text(\n parseInt(this.notesCountBadge.text(), 10) + updateCount,\n );\n }\n\n static renderPlaceholderComponent($container) {\n const el = $container.find('.js-code-placeholder').get(0);\n new Vue({\n // eslint-disable-line no-new\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(\n '.system-note-commit-list',\n );\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\n .find('.note-text')\n .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 static refreshVueNotes() {\n document.dispatchEvent(new CustomEvent('refreshVueNotes'));\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(\n 'js-comment-resolve-button',\n );\n const {\n formData,\n formContent,\n formAction,\n formContentOriginal,\n } = 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 /* eslint-disable promise/catch-or-return */\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\n .find('textarea.js-note-text')\n .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 );\n }\n\n Notes.refreshVueNotes();\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\n .parent()\n .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\n .removeClass('is-editing fade-in-full')\n .addClass('being-posted fade-in-half');\n $editingNote\n .find('.note-headline-meta a')\n .html(\n '',\n );\n\n /* eslint-disable promise/catch-or-return */\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);","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 $ 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","import Mousetrap from 'mousetrap';\nimport findAndFollowLink from './shortcuts_dashboard_navigation';\nimport Shortcuts from './shortcuts';\n\nexport default class ShortcutsNavigation extends Shortcuts {\n constructor() {\n super();\n\n Mousetrap.bind('g p', () => findAndFollowLink('.shortcuts-project'));\n Mousetrap.bind('g v', () => findAndFollowLink('.shortcuts-project-activity'));\n Mousetrap.bind('g f', () => findAndFollowLink('.shortcuts-tree'));\n Mousetrap.bind('g c', () => findAndFollowLink('.shortcuts-commits'));\n Mousetrap.bind('g j', () => findAndFollowLink('.shortcuts-builds'));\n Mousetrap.bind('g n', () => findAndFollowLink('.shortcuts-network'));\n Mousetrap.bind('g d', () => findAndFollowLink('.shortcuts-repository-charts'));\n Mousetrap.bind('g i', () => findAndFollowLink('.shortcuts-issues'));\n Mousetrap.bind('g b', () => findAndFollowLink('.shortcuts-issue-boards'));\n Mousetrap.bind('g m', () => findAndFollowLink('.shortcuts-merge_requests'));\n Mousetrap.bind('g w', () => findAndFollowLink('.shortcuts-wiki'));\n Mousetrap.bind('g s', () => findAndFollowLink('.shortcuts-snippets'));\n Mousetrap.bind('g k', () => findAndFollowLink('.shortcuts-kubernetes'));\n Mousetrap.bind('g e', () => findAndFollowLink('.shortcuts-environments'));\n Mousetrap.bind('i', () => findAndFollowLink('.shortcuts-new-issue'));\n\n this.enabledHelp.push('.hidden-shortcut.project');\n }\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TaskList\"] = factory();\n\telse\n\t\troot[\"TaskList\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nvar NodeArray, TaskList, closest, createEvent,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\nNodeArray = function(nodeList) {\n return Array.prototype.slice.apply(nodeList);\n};\n\nclosest = function(el, className) {\n while (el && !el.classList.contains(className)) {\n el = el.parentNode;\n }\n return el;\n};\n\ncreateEvent = function(eventName, detail) {\n var event;\n if (typeof Event === 'function') {\n event = new Event(eventName, {\n bubbles: true,\n cancelable: true\n });\n event.detail = detail;\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(eventName, true, true, detail);\n }\n return event;\n};\n\nTaskList = (function() {\n function TaskList(el1) {\n this.el = el1;\n this.container = closest(this.el, 'js-task-list-container');\n this.field = this.container.querySelector('.js-task-list-field');\n this.container.addEventListener('change', (function(_this) {\n return function(event) {\n if (event.target.classList.contains('task-list-item-checkbox')) {\n return _this.updateTaskList(event.target);\n }\n };\n })(this));\n this.enable();\n }\n\n TaskList.prototype.enable = function() {\n var event;\n if (this.container.querySelectorAll('.js-task-list-field').length > 0) {\n NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n return item.classList.add('enabled');\n });\n NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n return checkbox.disabled = false;\n });\n this.container.classList.add('is-task-list-enabled');\n event = createEvent('tasklist:enabled');\n return this.container.dispatchEvent(event);\n }\n };\n\n TaskList.prototype.disable = function() {\n var event;\n NodeArray(this.container.querySelectorAll('.task-list-item')).forEach(function(item) {\n return item.classList.remove('enabled');\n });\n NodeArray(this.container.querySelectorAll('.task-list-item-checkbox')).forEach(function(checkbox) {\n return checkbox.disabled = true;\n });\n this.container.classList.remove('is-task-list-enabled');\n event = createEvent('tasklist:disabled');\n return this.container.dispatchEvent(event);\n };\n\n TaskList.prototype.updateTaskList = function(item) {\n var changeEvent, changedEvent, checkboxes, index;\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 autocomplete,\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, autocomplete);\n};\n","import $ from 'jquery';\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class ProjectSelectComboButton {\n constructor(select) {\n this.projectSelectInput = $(select);\n this.newItemBtn = $('.new-project-item-link');\n this.resourceType = this.newItemBtn.data('type');\n this.resourceLabel = this.newItemBtn.data('label');\n this.formattedText = this.deriveTextVariants();\n this.groupId = this.projectSelectInput.data('groupId');\n this.bindEvents();\n this.initLocalStorage();\n }\n\n bindEvents() {\n this.projectSelectInput.siblings('.new-project-item-select-button')\n .on('click', e => this.openDropdown(e));\n\n this.newItemBtn.on('click', (e) => {\n if (!this.getProjectFromLocalStorage()) {\n e.preventDefault();\n this.openDropdown(e);\n }\n });\n\n this.projectSelectInput.on('change', () => this.selectProject());\n }\n\n initLocalStorage() {\n const localStorageIsSafe = AccessorUtilities.isLocalStorageAccessSafe();\n\n if (localStorageIsSafe) {\n this.localStorageKey = ['group', this.groupId, this.formattedText.localStorageItemType, 'recent-project'].join('-');\n this.setBtnTextFromLocalStorage();\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n openDropdown(event) {\n $(event.currentTarget).siblings('.project-item-select').select2('open');\n }\n\n selectProject() {\n const selectedProjectData = JSON.parse(this.projectSelectInput.val());\n const projectUrl = `${selectedProjectData.url}/${this.projectSelectInput.data('relativePath')}`;\n const projectName = selectedProjectData.name;\n\n const projectMeta = {\n url: projectUrl,\n name: projectName,\n };\n\n this.setNewItemBtnAttributes(projectMeta);\n this.setProjectInLocalStorage(projectMeta);\n }\n\n setBtnTextFromLocalStorage() {\n const cachedProjectData = this.getProjectFromLocalStorage();\n\n this.setNewItemBtnAttributes(cachedProjectData);\n }\n\n setNewItemBtnAttributes(project) {\n if (project) {\n this.newItemBtn.attr('href', project.url);\n this.newItemBtn.text(`${this.formattedText.defaultTextPrefix} in ${project.name}`);\n } else {\n this.newItemBtn.text(`选择一个项目来创建 ${this.formattedText.presetTextSuffix}`);\n }\n }\n\n getProjectFromLocalStorage() {\n const projectString = localStorage.getItem(this.localStorageKey);\n\n return JSON.parse(projectString);\n }\n\n setProjectInLocalStorage(projectMeta) {\n const projectString = JSON.stringify(projectMeta);\n\n localStorage.setItem(this.localStorageKey, projectString);\n }\n\n deriveTextVariants() {\n const defaultTextPrefix = this.resourceLabel;\n\n // the trailing slice call depluralizes each of these strings (e.g. new-issues -> new-issue)\n const localStorageItemType = `new-${this.resourceType.split('_').join('-').slice(0, -1)}`;\n const presetTextSuffix = this.resourceType.split('_').join(' ').slice(0, -1);\n\n return {\n localStorageItemType, // new-issue / new-merge-request\n defaultTextPrefix, // New issue / New merge request\n presetTextSuffix, // issue / merge request\n };\n }\n}\n\n","/* eslint-disable func-names, space-before-function-paren, wrap-iife, prefer-arrow-callback, no-var, comma-dangle, object-shorthand, one-var, one-var-declaration-per-line, no-else-return, quotes, max-len */\n\nimport $ from 'jquery';\nimport Api from './api';\nimport ProjectSelectComboButton from './project_select_combo_button';\n\nexport default function projectSelect() {\n $('.ajax-project-select').each(function(i, select) {\n var placeholder;\n const simpleFilter = $(select).data('simpleFilter') || false;\n this.groupId = $(select).data('groupId');\n this.includeGroups = $(select).data('includeGroups');\n this.allProjects = $(select).data('allProjects') || false;\n this.orderBy = $(select).data('orderBy') || 'id';\n this.withIssuesEnabled = $(select).data('withIssuesEnabled');\n this.withMergeRequestsEnabled = $(select).data('withMergeRequestsEnabled');\n\n placeholder = \"搜索项目\";\n if (this.includeGroups) {\n placeholder += \"或群组\";\n }\n\n $(select).select2({\n placeholder: placeholder,\n minimumInputLength: 0,\n query: (function (_this) {\n return function (query) {\n var finalCallback, projectsCallback;\n finalCallback = function (projects) {\n var data;\n data = {\n results: projects\n };\n return query.callback(data);\n };\n if (_this.includeGroups) {\n projectsCallback = function (projects) {\n var groupsCallback;\n groupsCallback = function (groups) {\n var data;\n data = groups.concat(projects);\n return finalCallback(data);\n };\n return Api.groups(query.term, {}, groupsCallback);\n };\n } else {\n projectsCallback = finalCallback;\n }\n if (_this.groupId) {\n return Api.groupProjects(_this.groupId, query.term, projectsCallback);\n } else {\n return Api.projects(query.term, {\n order_by: _this.orderBy,\n with_issues_enabled: _this.withIssuesEnabled,\n with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n membership: !_this.allProjects,\n }, projectsCallback);\n }\n };\n })(this),\n id: function(project) {\n if (simpleFilter) return project.id;\n return JSON.stringify({\n name: project.name,\n url: project.web_url,\n });\n },\n text: function (project) {\n return project.name_with_namespace || project.name;\n },\n dropdownCssClass: \"ajax-project-dropdown\"\n });\n if (simpleFilter) return select;\n return new ProjectSelectComboButton(select);\n });\n}\n","/* eslint-disable func-names, space-before-function-paren, no-var, consistent-return, no-new, prefer-arrow-callback, no-return-assign, one-var, one-var-declaration-per-line, object-shorthand, no-else-return, newline-per-chained-call, no-shadow, vars-on-top, prefer-template, max-len */\n\nimport $ from 'jquery';\nimport Cookies from 'js-cookie';\nimport { __ } from '~/locale';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport projectSelect from '../../project_select';\n\nexport default class Project {\n constructor() {\n const $cloneOptions = $('ul.clone-options-dropdown');\n const $projectCloneField = $('#project_clone');\n const $cloneBtnText = $('a.clone-dropdown-btn span');\n\n const selectedCloneOption = $cloneBtnText.text().trim();\n if (selectedCloneOption.length > 0) {\n $(`a:contains('${selectedCloneOption}')`, $cloneOptions).addClass('is-active');\n }\n\n $('a', $cloneOptions).on('click', (e) => {\n const $this = $(e.currentTarget);\n const url = $this.attr('href');\n const activeText = $this.find('.dropdown-menu-inner-title').text();\n\n e.preventDefault();\n\n $('.is-active', $cloneOptions).not($this).removeClass('is-active');\n $this.toggleClass('is-active');\n $projectCloneField.val(url);\n $cloneBtnText.text(activeText);\n\n return $('.clone').text(url);\n });\n // Ref switcher\n Project.initRefSwitcher();\n $('.project-refs-select').on('change', function() {\n return $(this).parents('form').submit();\n });\n $('.hide-no-ssh-message').on('click', function(e) {\n Cookies.set('hide_no_ssh_message', 'false');\n $(this).parents('.no-ssh-key-message').remove();\n return e.preventDefault();\n });\n $('.hide-no-password-message').on('click', function(e) {\n Cookies.set('hide_no_password_message', 'false');\n $(this).parents('.no-password-message').remove();\n return e.preventDefault();\n });\n Project.projectSelectDropdown();\n }\n\n static projectSelectDropdown() {\n projectSelect();\n $('.project-item-select').on('click', e => Project.changeProject($(e.currentTarget).val()));\n }\n\n static changeProject(url) {\n return window.location = url;\n }\n\n static initRefSwitcher() {\n var refListItem = document.createElement('li');\n var refLink = document.createElement('a');\n\n refLink.href = '#';\n\n return $('.js-project-refs-dropdown').each(function() {\n var $dropdown, selected;\n $dropdown = $(this);\n selected = $dropdown.data('selected');\n return $dropdown.glDropdown({\n data(term, callback) {\n axios.get($dropdown.data('refsUrl'), {\n params: {\n ref: $dropdown.data('ref'),\n search: term,\n },\n })\n .then(({ data }) => callback(data))\n .catch(() => flash(__('An error occurred while getting projects')));\n },\n selectable: true,\n filterable: true,\n filterRemote: true,\n filterByText: true,\n inputFieldName: $dropdown.data('inputFieldName'),\n fieldName: $dropdown.data('fieldName'),\n renderRow: function(ref) {\n var li = refListItem.cloneNode(false);\n\n if (ref.header != null) {\n li.className = 'dropdown-header';\n li.textContent = ref.header;\n } else {\n var link = refLink.cloneNode(false);\n\n if (ref === selected) {\n link.className = 'is-active';\n }\n\n link.textContent = ref;\n link.dataset.ref = ref;\n\n li.appendChild(link);\n }\n\n return li;\n },\n id: function(obj, $el) {\n return $el.attr('data-ref');\n },\n toggleLabel: function(obj, $el) {\n return $el.text().trim();\n },\n clicked: function(options) {\n const { e } = options;\n e.preventDefault();\n if ($('input[name=\"ref\"]').length) {\n var $form = $dropdown.closest('form');\n\n var $visit = $dropdown.data('visit');\n var shouldVisit = $visit ? true : $visit;\n var action = $form.attr('action');\n var divider = action.indexOf('?') === -1 ? '?' : '&';\n if (shouldVisit) {\n visitUrl(`${action}${divider}${$form.serialize()}`);\n }\n }\n },\n });\n });\n }\n}\n","/* eslint-disable object-shorthand, func-names, guard-for-in, no-restricted-syntax, comma-dangle, no-param-reassign, max-len */\n\nwindow.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","import Project from './project';\nimport ShortcutsNavigation from '../../shortcuts_navigation';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n new Project(); // eslint-disable-line no-new\n new ShortcutsNavigation(); // eslint-disable-line no-new\n});\n","/* eslint-disable space-before-function-paren, camelcase, guard-for-in, no-restricted-syntax, no-unused-vars, max-len */\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, no-param-reassign */\n/* global DiscussionModel */\n\nimport Vue from 'vue';\n\nwindow.CommentsStore = {\n state: {},\n get: function (discussionId, noteId) {\n return this.state[discussionId].getNote(noteId);\n },\n createDiscussion: function (discussionId, canResolve) {\n let discussion = this.state[discussionId];\n if (!this.state[discussionId]) {\n discussion = new DiscussionModel(discussionId);\n Vue.set(this.state, discussionId, discussion);\n }\n\n if (canResolve !== undefined) {\n discussion.canResolve = canResolve;\n }\n\n return discussion;\n },\n create: function (noteObj) {\n const discussion = this.createDiscussion(noteObj.discussionId);\n\n discussion.createNote(noteObj);\n },\n update: function (discussionId, noteId, resolved, resolved_by) {\n const discussion = this.state[discussionId];\n const note = discussion.getNote(noteId);\n note.resolved = resolved;\n note.resolved_by = resolved_by;\n },\n delete: function (discussionId, noteId) {\n const discussion = this.state[discussionId];\n discussion.deleteNote(noteId);\n\n if (discussion.notesCount() === 0) {\n Vue.delete(this.state, discussionId);\n }\n },\n unresolvedDiscussionIds: function () {\n const ids = [];\n\n for (const discussionId in this.state) {\n const discussion = this.state[discussionId];\n\n if (!discussion.isResolved()) {\n ids.push(discussion.id);\n }\n }\n\n return ids;\n }\n};\n","/* global CommentsStore */\n\nimport Vue from 'vue';\nimport Flash from '../../flash';\nimport '../../vue_shared/vue_resource_interceptor';\n\nwindow.gl = window.gl || {};\n\nclass ResolveServiceClass {\n constructor(root) {\n this.noteResource = Vue.resource(`${root}/notes{/noteId}/resolve?html=true`);\n this.discussionResource = Vue.resource(`${root}/merge_requests{/mergeRequestId}/discussions{/discussionId}/resolve?html=true`);\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 document.dispatchEvent(new CustomEvent('refreshVueNotes'));\n })\n .catch(() => new Flash('An error occurred when trying to resolve a discussion. Please try again.'));\n }\n\n resolveAll(mergeRequestId, discussionId) {\n const discussion = CommentsStore.state[discussionId];\n\n discussion.loading = true;\n\n return this.discussionResource.save({\n mergeRequestId,\n discussionId,\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 mergeRequestId,\n discussionId,\n }, {});\n }\n}\n\ngl.DiffNotesResolveServiceClass = ResolveServiceClass;\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: String,\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, one-var, space-before-function-paren, no-lonely-if, no-continue, brace-style, max-len, quotes */\n/* global DiscussionMixins */\n/* global CommentsStore */\n\nimport $ from 'jquery';\nimport Vue from 'vue';\n\nimport '../mixins/discussion';\n\nconst JumpToDiscussion = Vue.extend({\n mixins: [DiscussionMixins],\n props: {\n discussionId: String\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 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.discussions;\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 created() {\n this.discussion = this.discussions[this.discussionId];\n },\n});\n\nVue.component('jump-to-discussion', JumpToDiscussion);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, quote-props, no-else-return, camelcase, max-len */\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: Number,\n discussionId: String,\n resolved: Boolean,\n canResolve: Boolean,\n resolvedBy: String,\n authorName: String,\n authorAvatar: String,\n noteTruncated: String,\n },\n data: function () {\n return {\n discussions: CommentsStore.state,\n loading: false\n };\n },\n watch: {\n 'discussions': {\n handler: 'updateTooltip',\n deep: true\n }\n },\n computed: {\n discussion: function () {\n return this.discussions[this.discussionId];\n },\n note: function () {\n return this.discussion ? this.discussion.getNote(this.noteId) : {};\n },\n buttonText: function () {\n if (this.isResolved) {\n return `Resolved by ${this.resolvedByName}`;\n } else if (this.canResolve) {\n return '标记为已解决';\n } else {\n return '无法解决';\n }\n },\n isResolved: function () {\n if (this.note) {\n return this.note.resolved;\n } else {\n return false;\n }\n },\n resolvedByName: function () {\n return this.note.resolved_by;\n },\n },\n methods: {\n updateTooltip: function () {\n this.$nextTick(() => {\n $(this.$refs.button)\n .tooltip('hide')\n .tooltip('_fixTitle');\n });\n },\n resolve: function () {\n if (!this.canResolve) return;\n\n let promise;\n this.loading = true;\n\n if (this.isResolved) {\n promise = ResolveService\n .unresolve(this.noteId);\n } else {\n promise = ResolveService\n .resolve(this.noteId);\n }\n\n promise\n .then(resp => resp.json())\n .then((data) => {\n this.loading = false;\n\n const resolved_by = data ? data.resolved_by : null;\n\n CommentsStore.update(this.discussionId, this.noteId, !this.isResolved, resolved_by);\n this.discussion.updateHeadline(data);\n gl.mrWidget.checkStatus();\n document.dispatchEvent(new CustomEvent('refreshVueNotes'));\n\n this.updateTooltip();\n })\n .catch(() => new Flash('An error occurred when trying to resolve a comment. Please try again.'));\n }\n },\n mounted: function () {\n $(this.$refs.button).tooltip({\n container: 'body'\n });\n },\n beforeDestroy: function () {\n CommentsStore.delete(this.discussionId, this.noteId);\n },\n created: function () {\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});\n\nVue.component('resolve-btn', ResolveBtn);\n","/* eslint-disable comma-dangle, object-shorthand, func-names, no-param-reassign */\n/* global DiscussionMixins */\n/* global CommentsStore */\n\nimport Vue from 'vue';\n\nimport '../mixins/discussion';\n\nwindow.ResolveCount = Vue.extend({\n mixins: [DiscussionMixins],\n props: {\n loggedOut: Boolean\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, space-before-function-paren, comma-dangle, no-else-return, quotes, max-len */\n/* global CommentsStore */\n/* global ResolveService */\n\nimport Vue from 'vue';\n\nconst ResolveDiscussionBtn = Vue.extend({\n props: {\n discussionId: String,\n mergeRequestId: Number,\n canResolve: Boolean,\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 methods: {\n resolve: function () {\n ResolveService.toggleResolveForDiscussion(this.mergeRequestId, this.discussionId);\n }\n },\n created: function () {\n CommentsStore.createDiscussion(this.discussionId, this.canResolve);\n\n this.discussion = CommentsStore.state[this.discussionId];\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 props: ['discussionId'],\n data() {\n return {\n isVisible: false,\n lineType: '',\n storeState: CommentsStore.state,\n shownAvatars: 3,\n collapseIcon,\n };\n },\n components: {\n userAvatarImage,\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 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 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 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 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.notesCount;\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});\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, comma-dangle, new-cap, no-new, max-len */\n/* global ResolveCount */\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';\nimport { hasVueMRDiscussionsCookie } from '../lib/utils/common_utils';\n\nexport default () => {\n const projectPathHolder = document.querySelector('.merge-request') || document.querySelector('.commit-box');\n const projectPath = projectPathHolder.dataset.projectPath;\n const COMPONENT_SELECTOR = '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 const resolveCountAppEl = document.querySelector('#resolve-count-app');\n if (!hasVueMRDiscussionsCookie() && resolveCountAppEl) {\n new Vue({\n el: resolveCountAppEl,\n components: {\n 'resolve-count': ResolveCount\n },\n });\n }\n\n $(window).trigger('resize.nav');\n};\n","module.exports = \"\\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","/* eslint-disable camelcase, no-unused-vars */\n\nclass 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","/* 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","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 import/prefer-default-export, func-names, space-before-function-paren, wrap-iife, no-var, no-param-reassign, no-cond-assign, quotes, one-var, one-var-declaration-per-line, operator-assignment, no-else-return, prefer-template, prefer-arrow-callback, no-empty, max-len, consistent-return, no-unused-vars, no-return-assign, max-len, vars-on-top */\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 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 = false) {\n this.form = form;\n this.textarea = this.form.find('textarea.js-gfm-input');\n this.enableGFM = enableGFM;\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'), {\n emojis: true,\n members: this.enableGFM,\n issues: this.enableGFM,\n milestones: this.enableGFM,\n mergeRequests: this.enableGFM,\n labels: this.enableGFM,\n });\n dropzoneInput(this.form);\n autosize(this.textarea);\n }\n // form and textarea event listeners\n this.addEventListeners();\n addMarkdownListeners(this.form);\n // hide discard button\n this.form.find('.js-note-discard').hide();\n this.form.show();\n if (this.isAutosizeable) this.setupAutosize();\n }\n\n setupAutosize() {\n this.textarea.off('autosize:resized')\n .on('autosize:resized', this.setHeightData.bind(this));\n\n this.textarea.off('mouseup.autosize')\n .on('mouseup.autosize', this.destroyAutosize.bind(this));\n\n setTimeout(() => {\n autosize(this.textarea);\n this.textarea.css('resize', 'vertical');\n }, 0);\n }\n\n setHeightData() {\n this.textarea.data('height', this.textarea.outerHeight());\n }\n\n destroyAutosize() {\n const outerHeight = this.textarea.outerHeight();\n\n if (this.textarea.data('height') === outerHeight) return;\n\n autosize.destroy(this.textarea);\n\n this.textarea.data('height', outerHeight);\n this.textarea.outerHeight(outerHeight);\n this.textarea.css('max-height', window.outerHeight);\n }\n\n clearEventListeners() {\n this.textarea.off('focus');\n this.textarea.off('blur');\n removeMarkdownListeners(this.form);\n }\n\n addEventListeners() {\n this.textarea.on('focus', function focusTextArea() {\n $(this).closest('.md-area').addClass('is-focused');\n });\n this.textarea.on('blur', function blurTextArea() {\n $(this).closest('.md-area').removeClass('is-focused');\n });\n }\n}\n","/* eslint-disable func-names, space-before-function-paren, 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","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:{\"data-boundary\":\"window\",\"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}})\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=322edd8c\"\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\"","/* eslint-disable no-param-reassign, prefer-template, no-var, 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 field.dispatchEvent(event);\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"],"sourceRoot":""}