{"version":3,"sources":["webpack:///./create_label.js","webpack:///./labels_select.js","webpack:///./milestone_select.js","webpack:///./filtered_search/issuable_filtered_search_token_keys.js","webpack:///./pages/projects/issues/index/index.js","webpack:///./boards/stores/boards_store.js","webpack:///./filtered_search/event_hub.js","webpack:///./filtered_search/components/recent_searches_dropdown_content.vue?177e","webpack:///filtered_search/components/recent_searches_dropdown_content.vue","webpack:///./filtered_search/components/recent_searches_dropdown_content.vue","webpack:///./filtered_search/components/recent_searches_dropdown_content.vue?3155","webpack:///./filtered_search/recent_searches_root.js","webpack:///./filtered_search/stores/recent_searches_store.js","webpack:///./filtered_search/services/recent_searches_service_error.js","webpack:///./filtered_search/services/recent_searches_service.js","webpack:///./filtered_search/filtered_search_manager.js","webpack:///./pages/search/init_filtered_search.js","webpack:///./pages/constants.js","webpack:///./behaviors/shortcuts/shortcuts_navigation.js","webpack:///./project_select_combo_button.js","webpack:///./project_select.js","webpack:///./pages/projects/project.js","webpack:///./pages/projects/index.js","webpack:///./pages/projects/constants.js","webpack:///./issuable_bulk_update_sidebar.js","webpack:///./issue_status_select.js","webpack:///./subscription_select.js","webpack:///./issuable_index.js","webpack:///./issuable_bulk_update_actions.js"],"names":["CreateLabelDropdown","$el","namespacePath","projectPath","_classCallCheck","this","$dropdownBack","$","closest","$cancelButton","$newLabelField","$newColorField","$colorPreview","$newLabelError","$newLabelCreateButton","$colorSuggestions","hide","disable","cleanBinding","addBinding","off","self","on","e","$this","addColorValue","enableLabelCreateButton","bind","resetForm","preventDefault","stopPropagation","trigger","saveLabel","val","data","css","parent","addClass","enable","removeClass","_this","Api","newLabel","title","color","label","errors","message","Object","keys","map","key","concat","humanize","join","html","show","document","LabelsSelect","els","$els","options","arguments","length","undefined","each","i","dropdown","$block","$dropdown","$form","$loading","$selectbox","$sidebarCollapsedValue","$value","abilityName","defaultLabel","issueUpdateURL","labelUrl","saveLabelData","selectedLabel","showAny","showNo","$sidebarLabelTooltip","initialSelected","fieldName","showMenuAbove","$dropdownContainer","find","hasClass","split","__","fadeOut","is","value","get","handleClick","tooltip","selected","_","isEqual","label_ids","fadeIn","axios","put","then","_ref","labelCount","template","labelTooltipTitle","labelTitles","labels","getLabelTemplate","removeAttr","text","slice","push","attr","container","catch","flash","glDropdown","term","callback","res","extraData","unshift","id","isAny","positionMenuAbove","renderRow","instance","linkEl","listItemEl","colorEl","indeterminate","removesAll","selectedClass","marked","dropdownValue","indexOf","splice","toString","replace","multiSelect","createElement","href","dataset","labelId","className","innerHTML","escape","appendChild","search","fields","selectable","filterable","toggleLabel","el","$dropdownParent","$dropdownInputField","isSelected","selectedLabels","index","sprintf","firstLabel","hidden","isIssueIndex","isMRIndex","page","Issuable","filterResults","submit","vue","clicked","clickEvent","boardsModel","isMarking","selectedObj","fadeOutLoader","enableBulkLabelDropdown","setDropdownData","ModalStore","store","filter","boardsStore","detail","issue","ListLabel","textColor","update","opened","previousSelection","updateLabel","preserveContext","setOriginalDropdownData","bindEvents","tplData","tpl","onSelectCheckboxIssue","IssuableBulkUpdateActions","willUpdateLabels","markedIds","unmarkedIds","indeterminateIds","getOriginalIndeterminateIds","getOriginalCommonIds","$container","MilestoneSelect","currentProject","JSON","parse","init","milestoneLinkNoneTemplate","milestoneLinkTemplate","selectedMilestone","selectedMilestoneDefault","milestonesUrl","showUpcoming","showStarted","useId","defaultNo","$selectBox","extraOptions","name","milestone","currentTarget","modalStoreFilter","isSelecting","milestone_id","_ref2","remaining","timeFor","due_date","boardStoreIssueSet","ListMilestone","boardStoreIssueDelete","window","_filtered_search_token_keys__WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","tokenKeys","type","param","symbol","icon","tag","gon","current_user_id","IssuableFilteredSearchTokenKeys","FilteredSearchTokenKeys","url","tokenKey","r","__webpack_exports__","_issuable_index__WEBPACK_IMPORTED_MODULE_0__","_behaviors_shortcuts_shortcuts_navigation__WEBPACK_IMPORTED_MODULE_1__","_users_select__WEBPACK_IMPORTED_MODULE_2__","_pages_search_init_filtered_search__WEBPACK_IMPORTED_MODULE_3__","ee_else_ce_filtered_search_issuable_filtered_search_token_keys__WEBPACK_IMPORTED_MODULE_4__","_pages_constants__WEBPACK_IMPORTED_MODULE_5__","_pages_projects_constants__WEBPACK_IMPORTED_MODULE_6__","addEventListener","addExtraTokensForIssues","initFilteredSearch","FILTERED_SEARCH","ISSUES","filteredSearchTokenKeys","IssuableIndex","ISSUABLE_INDEX","ISSUE","ShortcutsNavigation","UsersSelect","d","jquery__WEBPACK_IMPORTED_MODULE_0__","jquery__WEBPACK_IMPORTED_MODULE_0___default","n","underscore__WEBPACK_IMPORTED_MODULE_1__","underscore__WEBPACK_IMPORTED_MODULE_1___default","vue__WEBPACK_IMPORTED_MODULE_2__","js_cookie__WEBPACK_IMPORTED_MODULE_3__","js_cookie__WEBPACK_IMPORTED_MODULE_3___default","_lib_utils_common_utils__WEBPACK_IMPORTED_MODULE_4__","disabled","path","state","moving","list","create","lists","getUrlParamsArray","addList","listObj","defaultAvatar","List","new","backlogList","findList","save","issues","forEach","removeIssue","sortBy","removeBlankState","updateNewListDropdown","listId","shouldAddBlankState","addBlankState","welcomeIsHidden","list_type","position","removeList","Cookies","set","expires","parseBoolean","moveList","listFrom","orderLists","_this2","parseInt","moveIssueToList","listTo","newIndex","issueTo","findIssue","issueLists","getLists","listLabels","listIssue","updateIssueLabel","removeLabel","findAssignee","assignee","removeAssignee","currentMilestone","currentLists","some","removeMilestone","addMilestone","currentList","addIssue","removeLabels","shouldRemoveIssue","moveIssueInList","oldIndex","idArray","beforeId","afterId","moveIssue","byType","findListByLabelId","updateFiltersUrl","history","pushState","_len","args","Array","_key","Vue","apply","_len2","_key2","delete","event_hub","components_recent_searches_dropdown_contentvue_type_script_lang_js_","props","items","required","isLocalStorageAvailable","Boolean","default","allowedKeys","computed","processedItems","item","_FilteredSearchTokeni","filtered_search_tokenizer","processTokens","tokens","searchToken","token","prefix","suffix","hasItems","methods","onItemActivated","$emit","onRequestClearRecentSearches","component","componentNormalizer","_vm","_h","$createElement","_c","_self","_l","staticClass","attrs","click","$event","tokenIndex","_v","_s","__file","recent_searches_dropdown_content","RecentSearchesRoot","recentSearchesStore","recentSearchesService","wrapperElement","service","render","onRequestClearRecentSearchesWrapper","eventHub","$on","$off","vm","components","RecentSearchesDropdownContent","resultantSearches","setRecentSearches","unbindEvents","$destroy","RecentSearchesStore","initialState","recent_searches_store_classCallCheck","assign","recentSearches","newSearch","trimmedSearches","trim","uniq","RecentSearchesServiceError","recent_searches_service_error_classCallCheck","prototype","Error","RecentSearchesService","localStorageKey","recent_searches_service_classCallCheck","AccessorUtilities","isLocalStorageAccessSafe","isAvailable","error","Promise","reject","input","localStorage","getItem","searches","err","resolve","setItem","stringify","FilteredSearchManager","_ref$isGroup","isGroup","_ref$isGroupAncestor","isGroupAncestor","_ref$isGroupDecendent","isGroupDecendent","_ref$filteredSearchTo","_ref$stateFiltersSele","stateFiltersSelector","filtered_search_manager_classCallCheck","states","FilteredSearchContainer","filteredSearchInput","querySelector","filteredSearchInputForm","form","clearSearchButton","tokensContainer","recentsStorageKeyNames","merge_requests","getKeys","searchHistoryDropdownElement","fullPath","recentSearchesKey","fetchingRecentSearchesPromise","fetch","Flash","tokenizer","FilteredSearchTokenizer","dropdownManager","FilteredSearchDropdownManager","baseEndpoint","getAttribute","recentSearchesRoot","loadSearchParamsFromURL","setDropdown","cleanupWrapper","cleanup","removeEventListener","destroy","stateFilters","searchStateWrapper","searchState","applyToStateFilters","filterEl","_this3","_this4","querySelectorAll","handleFormSubmit","setDropdownWrapper","toggleClearSearchButtonWrapper","toggleClearSearchButton","handleInputPlaceholderWrapper","handleInputPlaceholder","handleInputVisualTokenWrapper","handleInputVisualToken","checkForEnterWrapper","checkForEnter","onClearSearchWrapper","onClearSearch","checkForBackspaceWrapper","checkForBackspace","call","removeSelectedTokenKeydownWrapper","removeSelectedTokenKeydown","unselectEditTokensWrapper","unselectEditTokens","editTokenWrapper","editToken","tokenChange","addInputContainerFocusWrapper","addInputContainerFocus","removeInputContainerFocusWrapper","removeInputContainerFocus","onrecentSearchesItemSelectedWrapper","onrecentSearchesItemSelected","removeTokenWrapper","removeToken","bindStateEvents","unbindStateEvents","_this5","backspaceCount","keyCode","lastVisualToken","FilteredSearchVisualTokens","getLastVisualTokenBeforeInput","_DropdownUtils$getVis","DropdownUtils","getVisualTokenValues","tokenName","tokenValue","canEdit","getLastTokenPartial","removeLastTokenPartial","updateCurrentDropdownOffset","selectionStart","setSelectionRange","activeElements","mapping","currentDropdown","element","isHandledAsync","stopImmediatePropagation","blur","resetDropdowns","destroyDroplab","addClassIfElementExists","inputContainer","isElementInFilteredSearch","contains","target","isElementInDynamicFilterDropdown","isElementInStaticFilterDropdown","classList","remove","button","selectToken","removeSelectedToken","isElementInFilterDropdown","isElementTokensContainer","moveInputToTheRight","sanitizedTokenName","textContent","query","getSearchQuery","hasHidden","add","currentPlaceholder","placeholder","clearSearch","_this6","removeElements","children","t","canClearToken","_DropdownUtils$getVis2","parentElement","removeChild","_this7","_this$tokenizer$proce","isLastVisualTokenValid","addFilterVisualToken","uppercaseTokenName","shouldUppercaseTokenName","capitalizeTokenValue","shouldCapitalizeTokenValue","fragments","inputValues","last","pop","searchTerms","addSearchVisualToken","match","_this8","searchQuery","addRecentSearch","urlParams","modifyUrlParams","_this9","params","getAllParams","usernameParams","getUsernameParams","hasFilteredSearch","p","keyParam","decodeURIComponent","condition","searchByConditionUrl","sanitizedValue","searchByKeyParam","lastIndexOf","sanitizedKey","quotationsToUse","saveCurrentSearchQuery","_this10","paths","_this$tokenizer$proce2","currentState","getParameterByName","searchByConditionKeyValue","tokenConfig","searchByKey","underscoredKey","tokenPath","lowercaseValueOnSubmit","toLowerCase","encodeURIComponent","sanitized","parameterizedUrl","updateObject","visitUrl","usernamesById","attribute","user","username","currentDropdownRef","reference","dispatchInputEvent","dispatchEvent","CustomEvent","_filtered_search_filtered_search_manager__WEBPACK_IMPORTED_MODULE_0__","setup","MERGE_REQUESTS","ADMIN_RUNNERS","_possibleConstructorReturn","_getPrototypeOf","Mousetrap","findAndFollowLink","enabledHelp","Shortcuts","ProjectSelectComboButton","select","projectSelectInput","newItemBtn","resourceType","resourceLabel","formattedText","deriveTextVariants","groupId","initLocalStorage","siblings","openDropdown","getProjectFromLocalStorage","selectProject","localStorageItemType","setBtnTextFromLocalStorage","event","select2","selectedProjectData","projectMeta","setNewItemBtnAttributes","setProjectInLocalStorage","cachedProjectData","project","defaultTextPrefix","presetTextSuffix","projectString","projectSelect","simpleFilter","includeGroups","allProjects","orderBy","withIssuesEnabled","withMergeRequestsEnabled","withShared","includeProjectsInSubgroups","allowClear","minimumInputLength","finalCallback","projectsCallback","projects","results","groupsCallback","groups","groupProjects","with_issues_enabled","with_merge_requests_enabled","with_shared","include_subgroups","order_by","membership","web_url","name_with_namespace","initSelection","dropdownCssClass","Project","$cloneOptions","$projectCloneField","$cloneBtnLabel","mobileCloneField","selectedCloneOption","cloneType","activeText","$label","toggleClass","clipboardText","initRefSwitcher","parents","projectId","cookieKey","projectSelectDropdown","changeProject","location","refListItem","refLink","ref","filterRemote","filterByText","inputFieldName","li","cloneNode","header","link","obj","$visit","shouldVisit","action","divider","serialize","_projects_gke_cluster_dropdowns__WEBPACK_IMPORTED_MODULE_0__","_persistent_user_callout__WEBPACK_IMPORTED_MODULE_1__","_project__WEBPACK_IMPORTED_MODULE_2__","_behaviors_shortcuts_shortcuts_navigation__WEBPACK_IMPORTED_MODULE_3__","body","callout","PersistentUserCallout","factory","initGkeDropdowns","MERGE_REQUEST","IssuableBulkUpdateSidebar","initDomElements","initDropdowns","setupBulkUpdateActions","$checkedIssues","$page","$sidebar","$sidebarInnerContainer","$bulkEditCancelBtn","$bulkEditSubmitBtn","$bulkUpdateEnableBtn","$otherFilters","$checkAllContainer","$issueChecks","$issuesList","$issuableIdsInput","toggleBulkEdit","selectAll","updateFormState","prepForSubmit","$item","noCheckedIssues","toggleSubmitButtonDisabled","updateSelectedIssuableIds","setTimeout","toggleSidebarDisplay","toggleBulkEditButtonDisabled","toggleOtherFiltersDisabled","toggleCheckboxDisplay","getCheckedIssueIds","checkAllButtonState","prop","pagePrefix","issuable_index_classCallCheck","initBulkUpdate","resetIncomingEmailToken","$resetToken","new_address","focus","userCanBulkUpdate","alreadyInitialized","bulkUpdateSidebar","prefixId","_lib_utils_axios_utils__WEBPACK_IMPORTED_MODULE_2__","_flash__WEBPACK_IMPORTED_MODULE_3__","getElement","$labelDropdown","onFormSubmit","getFormDataAsObject","reload","onFormSubmitFailure","getSelectedIssues","has","getLabelsFromSelection","labelsData","getUnmarkedIndeterminedLabels","result","labelsToKeep","formData","state_event","assignee_id","assignee_ids","issuable_ids","subscription_event","add_label_ids","remove_label_ids","$labelSelect","getOriginalMarkedIds","labelIds","intersection","uniqueIds","issuableLabels","difference","selector","scopeEl"],"mappings":"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","file":"pages.projects.issues.index.9bd256df.chunk.js","sourcesContent":["/* eslint-disable func-names, prefer-arrow-callback */\n\nimport $ from 'jquery';\nimport Api from './api';\nimport { humanize } from './lib/utils/text_utility';\n\nexport default class CreateLabelDropdown {\n constructor($el, namespacePath, projectPath) {\n this.$el = $el;\n this.namespacePath = namespacePath;\n this.projectPath = projectPath;\n this.$dropdownBack = $('.dropdown-menu-back', this.$el.closest('.dropdown'));\n this.$cancelButton = $('.js-cancel-label-btn', this.$el);\n this.$newLabelField = $('#new_label_name', this.$el);\n this.$newColorField = $('#new_label_color', this.$el);\n this.$colorPreview = $('.js-dropdown-label-color-preview', this.$el);\n this.$newLabelError = $('.js-label-error', this.$el);\n this.$newLabelCreateButton = $('.js-new-label-btn', this.$el);\n this.$colorSuggestions = $('.suggest-colors-dropdown a', this.$el);\n\n this.$newLabelError.hide();\n this.$newLabelCreateButton.disable();\n\n this.cleanBinding();\n this.addBinding();\n }\n\n cleanBinding() {\n this.$colorSuggestions.off('click');\n this.$newLabelField.off('keyup change');\n this.$newColorField.off('keyup change');\n this.$dropdownBack.off('click');\n this.$cancelButton.off('click');\n this.$newLabelCreateButton.off('click');\n }\n\n addBinding() {\n const self = this;\n\n this.$colorSuggestions.on('click', function(e) {\n const $this = $(this);\n self.addColorValue(e, $this);\n });\n\n this.$newLabelField.on('keyup change', this.enableLabelCreateButton.bind(this));\n this.$newColorField.on('keyup change', this.enableLabelCreateButton.bind(this));\n\n this.$dropdownBack.on('click', this.resetForm.bind(this));\n\n this.$cancelButton.on('click', function(e) {\n e.preventDefault();\n e.stopPropagation();\n\n self.resetForm();\n self.$dropdownBack.trigger('click');\n });\n\n this.$newLabelCreateButton.on('click', this.saveLabel.bind(this));\n }\n\n addColorValue(e, $this) {\n e.preventDefault();\n e.stopPropagation();\n\n this.$newColorField.val($this.data('color')).trigger('change');\n this.$colorPreview\n .css('background-color', $this.data('color'))\n .parent()\n .addClass('is-active');\n }\n\n enableLabelCreateButton() {\n if (this.$newLabelField.val() !== '' && this.$newColorField.val() !== '') {\n this.$newLabelError.hide();\n this.$newLabelCreateButton.enable();\n } else {\n this.$newLabelCreateButton.disable();\n }\n }\n\n resetForm() {\n this.$newLabelField.val('').trigger('change');\n\n this.$newColorField.val('').trigger('change');\n\n this.$colorPreview\n .css('background-color', '')\n .parent()\n .removeClass('is-active');\n }\n\n saveLabel(e) {\n e.preventDefault();\n e.stopPropagation();\n\n Api.newLabel(\n this.namespacePath,\n this.projectPath,\n {\n title: this.$newLabelField.val(),\n color: this.$newColorField.val(),\n },\n label => {\n this.$newLabelCreateButton.enable();\n\n if (label.message) {\n let errors;\n\n if (typeof label.message === 'string') {\n errors = label.message;\n } else {\n errors = Object.keys(label.message)\n .map(key => `${humanize(key)} ${label.message[key].join(', ')}`)\n .join('
');\n }\n\n this.$newLabelError.html(errors).show();\n } else {\n this.$dropdownBack.trigger('click');\n\n $(document).trigger('created.label', label);\n }\n },\n );\n }\n}\n","/* eslint-disable no-useless-return, func-names, no-var, no-underscore-dangle, prefer-arrow-callback, one-var, no-unused-vars, prefer-template, no-new, consistent-return, object-shorthand, no-shadow, no-param-reassign, vars-on-top, no-lonely-if, no-else-return, dot-notation, no-empty */\n/* global Issuable */\n/* global ListLabel */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport { sprintf, __ } from './locale';\nimport axios from './lib/utils/axios_utils';\nimport IssuableBulkUpdateActions from './issuable_bulk_update_actions';\nimport CreateLabelDropdown from './create_label';\nimport flash from './flash';\nimport ModalStore from './boards/stores/modal_store';\nimport boardsStore from './boards/stores/boards_store';\n\nexport default class LabelsSelect {\n constructor(els, options = {}) {\n var _this, $els;\n _this = this;\n\n $els = $(els);\n\n if (!els) {\n $els = $('.js-label-select');\n }\n\n $els.each(function(i, dropdown) {\n var $block,\n $colorPreview,\n $dropdown,\n $form,\n $loading,\n $selectbox,\n $sidebarCollapsedValue,\n $value,\n abilityName,\n defaultLabel,\n enableLabelCreateButton,\n issueURLSplit,\n issueUpdateURL,\n labelUrl,\n namespacePath,\n projectPath,\n saveLabelData,\n selectedLabel,\n showAny,\n showNo,\n $sidebarLabelTooltip,\n initialSelected,\n $toggleText,\n fieldName,\n useId,\n propertyName,\n showMenuAbove,\n $container,\n $dropdownContainer;\n $dropdown = $(dropdown);\n $dropdownContainer = $dropdown.closest('.labels-filter');\n $toggleText = $dropdown.find('.dropdown-toggle-text');\n namespacePath = $dropdown.data('namespacePath');\n projectPath = $dropdown.data('projectPath');\n issueUpdateURL = $dropdown.data('issueUpdate');\n selectedLabel = $dropdown.data('selected');\n if (selectedLabel != null && !$dropdown.hasClass('js-multiselect')) {\n selectedLabel = selectedLabel.split(',');\n }\n showNo = $dropdown.data('showNo');\n showAny = $dropdown.data('showAny');\n showMenuAbove = $dropdown.data('showMenuAbove');\n defaultLabel = $dropdown.data('defaultLabel') || __('Label');\n abilityName = $dropdown.data('abilityName');\n $selectbox = $dropdown.closest('.selectbox');\n $block = $selectbox.closest('.block');\n $form = $dropdown.closest('form, .js-issuable-update');\n $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span');\n $sidebarLabelTooltip = $block.find('.js-sidebar-labels-tooltip');\n $value = $block.find('.value');\n $loading = $block.find('.block-loading').fadeOut();\n fieldName = $dropdown.data('fieldName');\n useId = $dropdown.is(\n '.js-issuable-form-dropdown, .js-filter-bulk-update, .js-label-sidebar-dropdown',\n );\n propertyName = useId ? 'id' : 'title';\n initialSelected = $selectbox\n .find('input[name=\"' + $dropdown.data('fieldName') + '\"]')\n .map(function() {\n return this.value;\n })\n .get();\n const { handleClick } = options;\n\n $sidebarLabelTooltip.tooltip();\n\n if ($dropdown.closest('.dropdown').find('.dropdown-new-label').length) {\n new CreateLabelDropdown(\n $dropdown.closest('.dropdown').find('.dropdown-new-label'),\n namespacePath,\n projectPath,\n );\n }\n\n saveLabelData = function() {\n var data, selected;\n selected = $dropdown\n .closest('.selectbox')\n .find(\"input[name='\" + fieldName + \"']\")\n .map(function() {\n return this.value;\n })\n .get();\n\n if (_.isEqual(initialSelected, selected)) return;\n initialSelected = selected;\n\n data = {};\n data[abilityName] = {};\n data[abilityName].label_ids = selected;\n if (!selected.length) {\n data[abilityName].label_ids = [''];\n }\n $loading.removeClass('hidden').fadeIn();\n $dropdown.trigger('loading.gl.dropdown');\n axios\n .put(issueUpdateURL, data)\n .then(({ data }) => {\n var labelCount, template, labelTooltipTitle, labelTitles, formattedLabels;\n $loading.fadeOut();\n $dropdown.trigger('loaded.gl.dropdown');\n $selectbox.hide();\n data.issueUpdateURL = issueUpdateURL;\n labelCount = 0;\n if (data.labels.length && issueUpdateURL) {\n template = LabelsSelect.getLabelTemplate({\n labels: data.labels,\n issueUpdateURL,\n });\n labelCount = data.labels.length;\n } else {\n template = 'None';\n }\n $value.removeAttr('style').html(template);\n $sidebarCollapsedValue.text(labelCount);\n\n if (data.labels.length) {\n labelTitles = data.labels.map(function(label) {\n return label.title;\n });\n\n if (labelTitles.length > 5) {\n labelTitles = labelTitles.slice(0, 5);\n labelTitles.push('and ' + (data.labels.length - 5) + ' more');\n }\n\n labelTooltipTitle = labelTitles.join(', ');\n } else {\n labelTooltipTitle = __('Labels');\n }\n\n $sidebarLabelTooltip.attr('title', labelTooltipTitle).tooltip('_fixTitle');\n\n $('.has-tooltip', $value).tooltip({\n container: 'body',\n });\n })\n .catch(() => flash(__('Error saving label update.')));\n };\n $dropdown.glDropdown({\n showMenuAbove: showMenuAbove,\n data: function(term, callback) {\n labelUrl = $dropdown.attr('data-labels');\n axios\n .get(labelUrl)\n .then(res => {\n let { data } = res;\n if ($dropdown.hasClass('js-extra-options')) {\n var extraData = [];\n if (showNo) {\n extraData.unshift({\n id: 0,\n title: 'No Label',\n });\n }\n if (showAny) {\n extraData.unshift({\n isAny: true,\n title: 'Any Label',\n });\n }\n if (extraData.length) {\n extraData.push('divider');\n data = extraData.concat(data);\n }\n }\n\n callback(data);\n if (showMenuAbove) {\n $dropdown.data('glDropdown').positionMenuAbove();\n }\n })\n .catch(() => flash(__('Error fetching labels.')));\n },\n renderRow: function(label, instance) {\n var linkEl,\n listItemEl,\n color,\n colorEl,\n indeterminate,\n removesAll,\n selectedClass,\n spacing,\n i,\n marked,\n dropdownValue;\n\n selectedClass = [];\n removesAll = label.id <= 0 || label.id == null;\n\n if ($dropdown.hasClass('js-filter-bulk-update')) {\n indeterminate = $dropdown.data('indeterminate') || [];\n marked = $dropdown.data('marked') || [];\n\n if (indeterminate.indexOf(label.id) !== -1) {\n selectedClass.push('is-indeterminate');\n }\n\n if (marked.indexOf(label.id) !== -1) {\n // Remove is-indeterminate class if the item will be marked as active\n i = selectedClass.indexOf('is-indeterminate');\n if (i !== -1) {\n selectedClass.splice(i, 1);\n }\n selectedClass.push('is-active');\n }\n } else {\n if (this.id(label)) {\n dropdownValue = this.id(label)\n .toString()\n .replace(/'/g, \"\\\\'\");\n\n if (\n $form.find(\n \"input[type='hidden'][name='\" +\n this.fieldName +\n \"'][value='\" +\n dropdownValue +\n \"']\",\n ).length\n ) {\n selectedClass.push('is-active');\n }\n }\n\n if (this.multiSelect && removesAll) {\n selectedClass.push('dropdown-clear-active');\n }\n }\n\n if (label.color) {\n colorEl =\n \"\";\n } else {\n colorEl = '';\n }\n\n linkEl = document.createElement('a');\n linkEl.href = '#';\n\n // We need to identify which items are actually labels\n if (label.id) {\n selectedClass.push('label-item');\n linkEl.dataset.labelId = label.id;\n }\n\n linkEl.className = selectedClass.join(' ');\n linkEl.innerHTML = `${colorEl} ${_.escape(label.title)}`;\n\n listItemEl = document.createElement('li');\n listItemEl.appendChild(linkEl);\n\n return listItemEl;\n },\n search: {\n fields: ['title'],\n },\n selectable: true,\n filterable: true,\n selected: $dropdown.data('selected') || [],\n toggleLabel: function(selected, el) {\n var $dropdownParent = $dropdown.parent();\n var $dropdownInputField = $dropdownParent.find('.dropdown-input-field');\n var isSelected = el !== null ? el.hasClass('is-active') : false;\n\n var title = selected ? selected.title : null;\n var selectedLabels = this.selected;\n\n if ($dropdownInputField.length && $dropdownInputField.val().length) {\n $dropdownParent.find('.dropdown-input-clear').trigger('click');\n }\n\n if (selected && selected.id === 0) {\n this.selected = [];\n return 'No Label';\n } else if (isSelected) {\n this.selected.push(title);\n } else if (!isSelected && title) {\n var index = this.selected.indexOf(title);\n this.selected.splice(index, 1);\n }\n\n if (selectedLabels.length === 1) {\n return selectedLabels;\n } else if (selectedLabels.length) {\n return sprintf(__('%{firstLabel} +%{labelCount} more'), {\n firstLabel: selectedLabels[0],\n labelCount: selectedLabels.length - 1,\n });\n } else {\n return defaultLabel;\n }\n },\n fieldName: $dropdown.data('fieldName'),\n id: function(label) {\n if (label.id <= 0) return label.title;\n\n if ($dropdown.hasClass('js-issuable-form-dropdown')) {\n return label.id;\n }\n\n if ($dropdown.hasClass('js-filter-submit') && label.isAny == null) {\n return label.title;\n } else {\n return label.id;\n }\n },\n hidden: function() {\n var isIssueIndex, isMRIndex, page, selectedLabels;\n page = $('body').attr('data-page');\n isIssueIndex = page === 'projects:issues:index';\n isMRIndex = page === 'projects:merge_requests:index';\n $selectbox.hide();\n // display:block overrides the hide-collapse rule\n $value.removeAttr('style');\n\n if ($dropdown.hasClass('js-issuable-form-dropdown')) {\n return;\n }\n\n if ($('html').hasClass('issue-boards-page')) {\n return;\n }\n if ($dropdown.hasClass('js-multiselect')) {\n if ($dropdown.hasClass('js-filter-submit') && (isIssueIndex || isMRIndex)) {\n selectedLabels = $dropdown\n .closest('form')\n .find(\"input:hidden[name='\" + $dropdown.data('fieldName') + \"']\");\n Issuable.filterResults($dropdown.closest('form'));\n } else if ($dropdown.hasClass('js-filter-submit')) {\n $dropdown.closest('form').submit();\n } else {\n if (!$dropdown.hasClass('js-filter-bulk-update')) {\n saveLabelData();\n }\n }\n }\n },\n multiSelect: $dropdown.hasClass('js-multiselect'),\n vue: $dropdown.hasClass('js-issue-board-sidebar'),\n clicked: function(clickEvent) {\n const { $el, e, isMarking } = clickEvent;\n const label = clickEvent.selectedObj;\n\n var isIssueIndex, isMRIndex, page, boardsModel;\n var fadeOutLoader = () => {\n $loading.fadeOut();\n };\n\n page = $('body').attr('data-page');\n isIssueIndex = page === 'projects:issues:index';\n isMRIndex = page === 'projects:merge_requests:index';\n\n if ($dropdown.parent().find('.is-active:not(.dropdown-clear-active)').length) {\n $dropdown\n .parent()\n .find('.dropdown-clear-active')\n .removeClass('is-active');\n }\n\n if ($dropdown.hasClass('js-issuable-form-dropdown')) {\n return;\n }\n\n if ($dropdown.hasClass('js-filter-bulk-update')) {\n _this.enableBulkLabelDropdown();\n _this.setDropdownData($dropdown, isMarking, label.id);\n return;\n }\n\n if ($dropdown.closest('.add-issues-modal').length) {\n boardsModel = ModalStore.store.filter;\n }\n\n if (boardsModel) {\n if (label.isAny) {\n boardsModel['label_name'] = [];\n } else if ($el.hasClass('is-active')) {\n boardsModel['label_name'].push(label.title);\n }\n\n e.preventDefault();\n return;\n } else if ($dropdown.hasClass('js-filter-submit') && (isIssueIndex || isMRIndex)) {\n if (!$dropdown.hasClass('js-multiselect')) {\n selectedLabel = label.title;\n return Issuable.filterResults($dropdown.closest('form'));\n }\n } else if ($dropdown.hasClass('js-filter-submit')) {\n return $dropdown.closest('form').submit();\n } else if ($dropdown.hasClass('js-issue-board-sidebar')) {\n if ($el.hasClass('is-active')) {\n boardsStore.detail.issue.labels.push(\n new ListLabel({\n id: label.id,\n title: label.title,\n color: label.color,\n textColor: '#fff',\n }),\n );\n } else {\n var { labels } = boardsStore.detail.issue;\n labels = labels.filter(function(selectedLabel) {\n return selectedLabel.id !== label.id;\n });\n boardsStore.detail.issue.labels = labels;\n }\n\n $loading.fadeIn();\n\n boardsStore.detail.issue\n .update($dropdown.attr('data-issue-update'))\n .then(fadeOutLoader)\n .catch(fadeOutLoader);\n } else if (handleClick) {\n e.preventDefault();\n handleClick(label);\n } else {\n if ($dropdown.hasClass('js-multiselect')) {\n } else {\n return saveLabelData();\n }\n }\n },\n opened: function(e) {\n if ($dropdown.hasClass('js-issue-board-sidebar')) {\n const previousSelection = $dropdown.attr('data-selected');\n this.selected = previousSelection ? previousSelection.split(',') : [];\n $dropdown.data('glDropdown').updateLabel();\n }\n },\n preserveContext: true,\n });\n\n // Set dropdown data\n _this.setOriginalDropdownData($dropdownContainer, $dropdown);\n });\n this.bindEvents();\n }\n\n static getLabelTemplate(tplData) {\n // We could use ES6 template string here\n // and properly indent markup for readability\n // but that also introduces unintended white-space\n // so best approach is to use traditional way of\n // concatenation\n // see: http://2ality.com/2016/05/template-literal-whitespace.html#joining-arrays\n const tpl = _.template(\n [\n '<% _.each(labels, function(label){ %>',\n '?label_name[]=<%- encodeURIComponent(label.title) %>\">',\n '\" style=\"background-color: <%- label.color %>; color: <%- label.text_color %>;\">',\n '<%- label.title %>',\n '',\n '',\n '<% }); %>',\n ].join(''),\n );\n\n return tpl(tplData);\n }\n\n bindEvents() {\n return $('body').on('change', '.selected-issuable', this.onSelectCheckboxIssue);\n }\n // eslint-disable-next-line class-methods-use-this\n onSelectCheckboxIssue() {\n if ($('.selected-issuable:checked').length) {\n return;\n }\n return $('.issues-bulk-update .labels-filter .dropdown-toggle-text').text('Label');\n }\n // eslint-disable-next-line class-methods-use-this\n enableBulkLabelDropdown() {\n IssuableBulkUpdateActions.willUpdateLabels = true;\n }\n // eslint-disable-next-line class-methods-use-this\n setDropdownData($dropdown, isMarking, value) {\n var i, markedIds, unmarkedIds, indeterminateIds;\n\n markedIds = $dropdown.data('marked') || [];\n unmarkedIds = $dropdown.data('unmarked') || [];\n indeterminateIds = $dropdown.data('indeterminate') || [];\n\n if (isMarking) {\n markedIds.push(value);\n\n i = indeterminateIds.indexOf(value);\n if (i > -1) {\n indeterminateIds.splice(i, 1);\n }\n\n i = unmarkedIds.indexOf(value);\n if (i > -1) {\n unmarkedIds.splice(i, 1);\n }\n } else {\n // If marked item (not common) is unmarked\n i = markedIds.indexOf(value);\n if (i > -1) {\n markedIds.splice(i, 1);\n }\n\n // If an indeterminate item is being unmarked\n if (IssuableBulkUpdateActions.getOriginalIndeterminateIds().indexOf(value) > -1) {\n unmarkedIds.push(value);\n }\n\n // If a marked item is being unmarked\n // (a marked item could also be a label that is present in all selection)\n if (IssuableBulkUpdateActions.getOriginalCommonIds().indexOf(value) > -1) {\n unmarkedIds.push(value);\n }\n }\n\n $dropdown.data('marked', markedIds);\n $dropdown.data('unmarked', unmarkedIds);\n $dropdown.data('indeterminate', indeterminateIds);\n }\n // eslint-disable-next-line class-methods-use-this\n setOriginalDropdownData($container, $dropdown) {\n const labels = [];\n $container.find('[name=\"label_name[]\"]').map(function() {\n return labels.push(this.value);\n });\n $dropdown.data('marked', labels);\n }\n}\n","/* eslint-disable one-var, no-unused-vars, object-shorthand, no-else-return, no-self-compare, consistent-return, no-param-reassign, no-shadow */\n/* global Issuable */\n/* global ListMilestone */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport { __ } from '~/locale';\nimport '~/gl_dropdown';\nimport axios from './lib/utils/axios_utils';\nimport { timeFor } from './lib/utils/datetime_utility';\nimport ModalStore from './boards/stores/modal_store';\nimport boardsStore, {\n boardStoreIssueSet,\n boardStoreIssueDelete,\n} from './boards/stores/boards_store';\n\nexport default class MilestoneSelect {\n constructor(currentProject, els, options = {}) {\n if (currentProject !== null) {\n this.currentProject =\n typeof currentProject === 'string' ? JSON.parse(currentProject) : currentProject;\n }\n\n MilestoneSelect.init(els, options);\n }\n\n static init(els, options) {\n let $els = $(els);\n\n if (!els) {\n $els = $('.js-milestone-select');\n }\n\n $els.each((i, dropdown) => {\n let milestoneLinkNoneTemplate,\n milestoneLinkTemplate,\n selectedMilestone,\n selectedMilestoneDefault;\n const $dropdown = $(dropdown);\n const projectId = $dropdown.data('projectId');\n const milestonesUrl = $dropdown.data('milestones');\n const issueUpdateURL = $dropdown.data('issueUpdate');\n const showNo = $dropdown.data('showNo');\n const showAny = $dropdown.data('showAny');\n const showMenuAbove = $dropdown.data('showMenuAbove');\n const showUpcoming = $dropdown.data('showUpcoming');\n const showStarted = $dropdown.data('showStarted');\n const useId = $dropdown.data('useId');\n const defaultLabel = $dropdown.data('defaultLabel');\n const defaultNo = $dropdown.data('defaultNo');\n const issuableId = $dropdown.data('issuableId');\n const abilityName = $dropdown.data('abilityName');\n const $selectBox = $dropdown.closest('.selectbox');\n const $block = $selectBox.closest('.block');\n const $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon');\n const $value = $block.find('.value');\n const $loading = $block.find('.block-loading').fadeOut();\n selectedMilestoneDefault = showAny ? '' : null;\n selectedMilestoneDefault = showNo && defaultNo ? 'No Milestone' : selectedMilestoneDefault;\n selectedMilestone = $dropdown.data('selected') || selectedMilestoneDefault;\n\n if (issueUpdateURL) {\n milestoneLinkTemplate = _.template(\n '\" class=\"bold has-tooltip\" data-container=\"body\" title=\"<%- remaining %>\"><%- title %>',\n );\n milestoneLinkNoneTemplate = 'None';\n }\n return $dropdown.glDropdown({\n showMenuAbove: showMenuAbove,\n data: (term, callback) =>\n axios.get(milestonesUrl).then(({ data }) => {\n const extraOptions = [];\n if (showAny) {\n extraOptions.push({\n id: null,\n name: null,\n title: 'Any Milestone',\n });\n }\n if (showNo) {\n extraOptions.push({\n id: -1,\n name: 'No Milestone',\n title: 'No Milestone',\n });\n }\n if (showUpcoming) {\n extraOptions.push({\n id: -2,\n name: '#upcoming',\n title: 'Upcoming',\n });\n }\n if (showStarted) {\n extraOptions.push({\n id: -3,\n name: '#started',\n title: 'Started',\n });\n }\n if (extraOptions.length) {\n extraOptions.push('divider');\n }\n\n callback(extraOptions.concat(data));\n if (showMenuAbove) {\n $dropdown.data('glDropdown').positionMenuAbove();\n }\n $(`[data-milestone-id=\"${_.escape(selectedMilestone)}\"] > a`).addClass('is-active');\n }),\n renderRow: milestone => `\n
  • \n \n ${_.escape(milestone.title)}\n \n
  • \n `,\n filterable: true,\n search: {\n fields: ['title'],\n },\n selectable: true,\n toggleLabel: (selected, el, e) => {\n if (selected && 'id' in selected && $(el).hasClass('is-active')) {\n return selected.title;\n } else {\n return defaultLabel;\n }\n },\n defaultLabel: defaultLabel,\n fieldName: $dropdown.data('fieldName'),\n text: milestone => _.escape(milestone.title),\n id: milestone => {\n if (!useId && !$dropdown.is('.js-issuable-form-dropdown')) {\n return milestone.name;\n } else {\n return milestone.id;\n }\n },\n hidden: () => {\n $selectBox.hide();\n // display:block overrides the hide-collapse rule\n return $value.css('display', '');\n },\n opened: e => {\n const $el = $(e.currentTarget);\n if ($dropdown.hasClass('js-issue-board-sidebar') || options.handleClick) {\n selectedMilestone = $dropdown[0].dataset.selected || selectedMilestoneDefault;\n }\n $('a.is-active', $el).removeClass('is-active');\n $(`[data-milestone-id=\"${_.escape(selectedMilestone)}\"] > a`, $el).addClass('is-active');\n },\n vue: $dropdown.hasClass('js-issue-board-sidebar'),\n clicked: clickEvent => {\n const { $el, e } = clickEvent;\n let selected = clickEvent.selectedObj;\n\n let data, modalStoreFilter;\n if (!selected) return;\n\n if (options.handleClick) {\n e.preventDefault();\n options.handleClick(selected);\n return;\n }\n\n const page = $('body').attr('data-page');\n const isIssueIndex = page === 'projects:issues:index';\n const isMRIndex = page === page && page === 'projects:merge_requests:index';\n const isSelecting = selected.name !== selectedMilestone;\n selectedMilestone = isSelecting ? selected.name : selectedMilestoneDefault;\n\n if (\n $dropdown.hasClass('js-filter-bulk-update') ||\n $dropdown.hasClass('js-issuable-form-dropdown')\n ) {\n e.preventDefault();\n return;\n }\n\n if ($dropdown.closest('.add-issues-modal').length) {\n modalStoreFilter = ModalStore.store.filter;\n }\n\n if (modalStoreFilter) {\n modalStoreFilter[$dropdown.data('fieldName')] = selected.name;\n e.preventDefault();\n } else if ($dropdown.hasClass('js-filter-submit') && (isIssueIndex || isMRIndex)) {\n return Issuable.filterResults($dropdown.closest('form'));\n } else if ($dropdown.hasClass('js-filter-submit')) {\n return $dropdown.closest('form').submit();\n } else if ($dropdown.hasClass('js-issue-board-sidebar')) {\n if (selected.id !== -1 && isSelecting) {\n boardStoreIssueSet(\n 'milestone',\n new ListMilestone({\n id: selected.id,\n title: selected.name,\n }),\n );\n } else {\n boardStoreIssueDelete('milestone');\n }\n\n $dropdown.trigger('loading.gl.dropdown');\n $loading.removeClass('hidden').fadeIn();\n\n boardsStore.detail.issue\n .update($dropdown.attr('data-issue-update'))\n .then(() => {\n $dropdown.trigger('loaded.gl.dropdown');\n $loading.fadeOut();\n })\n .catch(() => {\n $loading.fadeOut();\n });\n } else {\n selected = $selectBox.find('input[type=\"hidden\"]').val();\n data = {};\n data[abilityName] = {};\n data[abilityName].milestone_id = selected != null ? selected : null;\n $loading.removeClass('hidden').fadeIn();\n $dropdown.trigger('loading.gl.dropdown');\n return axios\n .put(issueUpdateURL, data)\n .then(({ data }) => {\n $dropdown.trigger('loaded.gl.dropdown');\n $loading.fadeOut();\n $selectBox.hide();\n $value.css('display', '');\n if (data.milestone != null) {\n data.milestone.remaining = timeFor(data.milestone.due_date);\n data.milestone.name = data.milestone.title;\n $value.html(milestoneLinkTemplate(data.milestone));\n return $sidebarCollapsedValue\n .attr(\n 'data-original-title',\n `${data.milestone.name}
    ${data.milestone.remaining}`,\n )\n .find('span')\n .text(data.milestone.title);\n } else {\n $value.html(milestoneLinkNoneTemplate);\n return $sidebarCollapsedValue\n .attr('data-original-title', __('Milestone'))\n .find('span')\n .text(__('None'));\n }\n })\n .catch(() => {\n $loading.fadeOut();\n });\n }\n },\n });\n });\n }\n}\n\nwindow.MilestoneSelect = MilestoneSelect;\n","import FilteredSearchTokenKeys from './filtered_search_token_keys';\n\nexport const tokenKeys = [\n {\n key: 'author',\n type: 'string',\n param: 'username',\n symbol: '@',\n icon: 'pencil',\n tag: '@author',\n },\n {\n key: 'assignee',\n type: 'string',\n param: 'username',\n symbol: '@',\n icon: 'user',\n tag: '@assignee',\n },\n {\n key: 'milestone',\n type: 'string',\n param: 'title',\n symbol: '%',\n icon: 'clock',\n tag: '%milestone',\n },\n {\n key: 'label',\n type: 'array',\n param: 'name[]',\n symbol: '~',\n icon: 'labels',\n tag: '~label',\n },\n];\n\nif (gon.current_user_id) {\n // Appending tokenkeys only logged-in\n tokenKeys.push({\n key: 'my-reaction',\n type: 'string',\n param: 'emoji',\n symbol: '',\n icon: 'thumb-up',\n tag: 'emoji',\n });\n}\n\nexport const alternativeTokenKeys = [\n {\n key: 'label',\n type: 'string',\n param: 'name',\n symbol: '~',\n },\n];\n\nexport const conditions = [\n {\n url: 'assignee_id=None',\n tokenKey: 'assignee',\n value: 'None',\n },\n {\n url: 'assignee_id=Any',\n tokenKey: 'assignee',\n value: 'Any',\n },\n {\n url: 'milestone_title=None',\n tokenKey: 'milestone',\n value: 'None',\n },\n {\n url: 'milestone_title=Any',\n tokenKey: 'milestone',\n value: 'Any',\n },\n {\n url: 'milestone_title=%23upcoming',\n tokenKey: 'milestone',\n value: 'Upcoming',\n },\n {\n url: 'milestone_title=%23started',\n tokenKey: 'milestone',\n value: 'Started',\n },\n {\n url: 'label_name[]=None',\n tokenKey: 'label',\n value: 'None',\n },\n {\n url: 'label_name[]=Any',\n tokenKey: 'label',\n value: 'Any',\n },\n {\n url: 'my_reaction_emoji=None',\n tokenKey: 'my-reaction',\n value: 'None',\n },\n {\n url: 'my_reaction_emoji=Any',\n tokenKey: 'my-reaction',\n value: 'Any',\n },\n];\n\nconst IssuableFilteredSearchTokenKeys = new FilteredSearchTokenKeys(\n tokenKeys,\n alternativeTokenKeys,\n conditions,\n);\n\nexport default IssuableFilteredSearchTokenKeys;\n","/* eslint-disable no-new */\n\nimport IssuableIndex from '~/issuable_index';\nimport ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';\nimport UsersSelect from '~/users_select';\nimport initFilteredSearch from '~/pages/search/init_filtered_search';\nimport IssuableFilteredSearchTokenKeys from 'ee_else_ce/filtered_search/issuable_filtered_search_token_keys';\nimport { FILTERED_SEARCH } from '~/pages/constants';\nimport { ISSUABLE_INDEX } from '~/pages/projects/constants';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n IssuableFilteredSearchTokenKeys.addExtraTokensForIssues();\n\n initFilteredSearch({\n page: FILTERED_SEARCH.ISSUES,\n filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys,\n });\n new IssuableIndex(ISSUABLE_INDEX.ISSUE);\n\n new ShortcutsNavigation();\n new UsersSelect();\n});\n","/* eslint-disable no-shadow */\n/* global List */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport Vue from 'vue';\nimport Cookies from 'js-cookie';\nimport { getUrlParamsArray, parseBoolean } from '~/lib/utils/common_utils';\n\nconst boardsStore = {\n disabled: false,\n filter: {\n path: '',\n },\n state: {},\n detail: {\n issue: {},\n },\n moving: {\n issue: {},\n list: {},\n },\n create() {\n this.state.lists = [];\n this.filter.path = getUrlParamsArray().join('&');\n this.detail = {\n issue: {},\n };\n },\n addList(listObj, defaultAvatar) {\n const list = new List(listObj, defaultAvatar);\n this.state.lists.push(list);\n\n return list;\n },\n new(listObj) {\n const list = this.addList(listObj);\n const backlogList = this.findList('type', 'backlog', 'backlog');\n\n list\n .save()\n .then(() => {\n // Remove any new issues from the backlog\n // as they will be visible in the new list\n list.issues.forEach(backlogList.removeIssue.bind(backlogList));\n this.state.lists = _.sortBy(this.state.lists, 'position');\n })\n .catch(() => {\n // https://gitlab.com/gitlab-org/gitlab-ce/issues/30821\n });\n this.removeBlankState();\n },\n updateNewListDropdown(listId) {\n $(`.js-board-list-${listId}`).removeClass('is-active');\n },\n shouldAddBlankState() {\n // Decide whether to add the blank state\n return !this.state.lists.filter(list => list.type !== 'backlog' && list.type !== 'closed')[0];\n },\n addBlankState() {\n if (!this.shouldAddBlankState() || this.welcomeIsHidden() || this.disabled) return;\n\n this.addList({\n id: 'blank',\n list_type: 'blank',\n title: 'Welcome to your Issue Board!',\n position: 0,\n });\n\n this.state.lists = _.sortBy(this.state.lists, 'position');\n },\n removeBlankState() {\n this.removeList('blank');\n\n Cookies.set('issue_board_welcome_hidden', 'true', {\n expires: 365 * 10,\n path: '',\n });\n },\n welcomeIsHidden() {\n return parseBoolean(Cookies.get('issue_board_welcome_hidden'));\n },\n removeList(id, type = 'blank') {\n const list = this.findList('id', id, type);\n\n if (!list) return;\n\n this.state.lists = this.state.lists.filter(list => list.id !== id);\n },\n moveList(listFrom, orderLists) {\n orderLists.forEach((id, i) => {\n const list = this.findList('id', parseInt(id, 10));\n\n list.position = i;\n });\n listFrom.update();\n },\n moveIssueToList(listFrom, listTo, issue, newIndex) {\n const issueTo = listTo.findIssue(issue.id);\n const issueLists = issue.getLists();\n const listLabels = issueLists.map(listIssue => listIssue.label);\n\n if (!issueTo) {\n // Check if target list assignee is already present in this issue\n if (\n listTo.type === 'assignee' &&\n listFrom.type === 'assignee' &&\n issue.findAssignee(listTo.assignee)\n ) {\n const targetIssue = listTo.findIssue(issue.id);\n targetIssue.removeAssignee(listFrom.assignee);\n } else if (listTo.type === 'milestone') {\n const currentMilestone = issue.milestone;\n const currentLists = this.state.lists\n .filter(list => list.type === 'milestone' && list.id !== listTo.id)\n .filter(list => list.issues.some(listIssue => issue.id === listIssue.id));\n\n issue.removeMilestone(currentMilestone);\n issue.addMilestone(listTo.milestone);\n currentLists.forEach(currentList => currentList.removeIssue(issue));\n listTo.addIssue(issue, listFrom, newIndex);\n } else {\n // Add to new lists issues if it doesn't already exist\n listTo.addIssue(issue, listFrom, newIndex);\n }\n } else {\n listTo.updateIssueLabel(issue, listFrom);\n issueTo.removeLabel(listFrom.label);\n }\n\n if (listTo.type === 'closed' && listFrom.type !== 'backlog') {\n issueLists.forEach(list => {\n list.removeIssue(issue);\n });\n issue.removeLabels(listLabels);\n } else if (listTo.type === 'backlog' && listFrom.type === 'assignee') {\n issue.removeAssignee(listFrom.assignee);\n listFrom.removeIssue(issue);\n } else if (listTo.type === 'backlog' && listFrom.type === 'milestone') {\n issue.removeMilestone(listFrom.milestone);\n listFrom.removeIssue(issue);\n } else if (this.shouldRemoveIssue(listFrom, listTo)) {\n listFrom.removeIssue(issue);\n }\n },\n shouldRemoveIssue(listFrom, listTo) {\n return (\n (listTo.type !== 'label' && listFrom.type === 'assignee') ||\n (listTo.type !== 'assignee' && listFrom.type === 'label') ||\n listFrom.type === 'backlog'\n );\n },\n moveIssueInList(list, issue, oldIndex, newIndex, idArray) {\n const beforeId = parseInt(idArray[newIndex - 1], 10) || null;\n const afterId = parseInt(idArray[newIndex + 1], 10) || null;\n\n list.moveIssue(issue, oldIndex, newIndex, beforeId, afterId);\n },\n findList(key, val, type = 'label') {\n const filteredList = this.state.lists.filter(list => {\n const byType = type\n ? list.type === type || list.type === 'assignee' || list.type === 'milestone'\n : true;\n\n return list[key] === val && byType;\n });\n return filteredList[0];\n },\n findListByLabelId(id) {\n return this.state.lists.find(list => list.type === 'label' && list.label.id === id);\n },\n updateFiltersUrl() {\n window.history.pushState(null, null, `?${this.filter.path}`);\n },\n};\n\n// hacks added in order to allow milestone_select to function properly\n// TODO: remove these\n\nexport function boardStoreIssueSet(...args) {\n Vue.set(boardsStore.detail.issue, ...args);\n}\n\nexport function boardStoreIssueDelete(...args) {\n Vue.delete(boardsStore.detail.issue, ...args);\n}\n\nexport default boardsStore;\n","import Vue from 'vue';\n\nexport default new Vue();\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--1!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recent_searches_dropdown_content.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js??ref--1!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./recent_searches_dropdown_content.vue?vue&type=script&lang=js&\"","\n\n","import { render, staticRenderFns } from \"./recent_searches_dropdown_content.vue?vue&type=template&id=ad70826a&\"\nimport script from \"./recent_searches_dropdown_content.vue?vue&type=script&lang=js&\"\nexport * from \"./recent_searches_dropdown_content.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\ncomponent.options.__file = \"recent_searches_dropdown_content.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.isLocalStorageAvailable)?_c('div',{staticClass:\"dropdown-info-note\"},[_vm._v(\"\\n This feature requires local storage to be enabled\\n \")]):(_vm.hasItems)?_c('ul',[_vm._l((_vm.processedItems),function(item,index){return _c('li',{key:(\"processed-items-\" + index)},[_c('button',{staticClass:\"filtered-search-history-dropdown-item\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.onItemActivated(item.text)}}},[_c('span',_vm._l((item.tokens),function(token,tokenIndex){return _c('span',{key:(\"dropdown-token-\" + tokenIndex),staticClass:\"filtered-search-history-dropdown-token\"},[_c('span',{staticClass:\"name\"},[_vm._v(_vm._s(token.prefix))]),_vm._v(\" \"),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(token.suffix))])])}),0),_vm._v(\" \"),_c('span',{staticClass:\"filtered-search-history-dropdown-search-token\"},[_vm._v(\"\\n \"+_vm._s(item.searchToken)+\"\\n \")])])])}),_vm._v(\" \"),_c('li',{staticClass:\"divider\"}),_vm._v(\" \"),_c('li',[_c('button',{staticClass:\"filtered-search-history-clear-button\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.onRequestClearRecentSearches($event)}}},[_vm._v(\"\\n Clear recent searches\\n \")])])],2):_c('div',{staticClass:\"dropdown-info-note\"},[_vm._v(\"You don't have any recent searches\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Vue from 'vue';\nimport RecentSearchesDropdownContent from './components/recent_searches_dropdown_content.vue';\nimport eventHub from './event_hub';\n\nclass RecentSearchesRoot {\n constructor(recentSearchesStore, recentSearchesService, wrapperElement) {\n this.store = recentSearchesStore;\n this.service = recentSearchesService;\n this.wrapperElement = wrapperElement;\n }\n\n init() {\n this.bindEvents();\n this.render();\n }\n\n bindEvents() {\n this.onRequestClearRecentSearchesWrapper = this.onRequestClearRecentSearches.bind(this);\n\n eventHub.$on('requestClearRecentSearches', this.onRequestClearRecentSearchesWrapper);\n }\n\n unbindEvents() {\n eventHub.$off('requestClearRecentSearches', this.onRequestClearRecentSearchesWrapper);\n }\n\n render() {\n const { state } = this.store;\n this.vm = new Vue({\n el: this.wrapperElement,\n components: {\n RecentSearchesDropdownContent,\n },\n data() {\n return state;\n },\n template: `\n \n `,\n });\n }\n\n onRequestClearRecentSearches() {\n const resultantSearches = this.store.setRecentSearches([]);\n this.service.save(resultantSearches);\n }\n\n destroy() {\n this.unbindEvents();\n if (this.vm) {\n this.vm.$destroy();\n }\n }\n}\n\nexport default RecentSearchesRoot;\n","import _ from 'underscore';\n\nclass RecentSearchesStore {\n constructor(initialState = {}, allowedKeys) {\n this.state = Object.assign(\n {\n isLocalStorageAvailable: true,\n recentSearches: [],\n allowedKeys,\n },\n initialState,\n );\n }\n\n addRecentSearch(newSearch) {\n this.setRecentSearches([newSearch].concat(this.state.recentSearches));\n\n return this.state.recentSearches;\n }\n\n setRecentSearches(searches = []) {\n const trimmedSearches = searches.map(search => search.trim());\n this.state.recentSearches = _.uniq(trimmedSearches).slice(0, 5);\n return this.state.recentSearches;\n }\n}\n\nexport default RecentSearchesStore;\n","class RecentSearchesServiceError {\n constructor(message) {\n this.name = 'RecentSearchesServiceError';\n this.message = message || 'Recent Searches Service is unavailable';\n }\n}\n\n// Can't use `extends` for builtin prototypes and get true inheritance yet\nRecentSearchesServiceError.prototype = Error.prototype;\n\nexport default RecentSearchesServiceError;\n","import RecentSearchesServiceError from './recent_searches_service_error';\nimport AccessorUtilities from '../../lib/utils/accessor';\n\nclass RecentSearchesService {\n constructor(localStorageKey = 'issuable-recent-searches') {\n this.localStorageKey = localStorageKey;\n }\n\n fetch() {\n if (!RecentSearchesService.isAvailable()) {\n const error = new RecentSearchesServiceError();\n return Promise.reject(error);\n }\n\n const input = window.localStorage.getItem(this.localStorageKey);\n\n let searches = [];\n if (input && input.length > 0) {\n try {\n searches = JSON.parse(input);\n } catch (err) {\n return Promise.reject(err);\n }\n }\n\n return Promise.resolve(searches);\n }\n\n save(searches = []) {\n if (!RecentSearchesService.isAvailable()) return;\n\n window.localStorage.setItem(this.localStorageKey, JSON.stringify(searches));\n }\n\n static isAvailable() {\n return AccessorUtilities.isLocalStorageAccessSafe();\n }\n}\n\nexport default RecentSearchesService;\n","import _ from 'underscore';\nimport { getParameterByName, getUrlParamsArray } from '~/lib/utils/common_utils';\nimport IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';\nimport { visitUrl } from '../lib/utils/url_utility';\nimport Flash from '../flash';\nimport FilteredSearchContainer from './container';\nimport RecentSearchesRoot from './recent_searches_root';\nimport RecentSearchesStore from './stores/recent_searches_store';\nimport RecentSearchesService from './services/recent_searches_service';\nimport eventHub from './event_hub';\nimport { addClassIfElementExists } from '../lib/utils/dom_utils';\nimport FilteredSearchTokenizer from './filtered_search_tokenizer';\nimport FilteredSearchDropdownManager from './filtered_search_dropdown_manager';\nimport FilteredSearchVisualTokens from './filtered_search_visual_tokens';\nimport DropdownUtils from './dropdown_utils';\n\nexport default class FilteredSearchManager {\n constructor({\n page,\n isGroup = false,\n isGroupAncestor = true,\n isGroupDecendent = false,\n filteredSearchTokenKeys = IssuableFilteredSearchTokenKeys,\n stateFiltersSelector = '.issues-state-filters',\n }) {\n this.isGroup = isGroup;\n this.isGroupAncestor = isGroupAncestor;\n this.isGroupDecendent = isGroupDecendent;\n this.states = ['opened', 'closed', 'merged', 'all'];\n\n this.page = page;\n this.container = FilteredSearchContainer.container;\n this.filteredSearchInput = this.container.querySelector('.filtered-search');\n this.filteredSearchInputForm = this.filteredSearchInput.form;\n this.clearSearchButton = this.container.querySelector('.clear-search');\n this.tokensContainer = this.container.querySelector('.tokens-container');\n this.filteredSearchTokenKeys = filteredSearchTokenKeys;\n this.stateFiltersSelector = stateFiltersSelector;\n this.recentsStorageKeyNames = {\n issues: 'issue-recent-searches',\n merge_requests: 'merge-request-recent-searches',\n };\n\n this.recentSearchesStore = new RecentSearchesStore({\n isLocalStorageAvailable: RecentSearchesService.isAvailable(),\n allowedKeys: this.filteredSearchTokenKeys.getKeys(),\n });\n this.searchHistoryDropdownElement = document.querySelector(\n '.js-filtered-search-history-dropdown',\n );\n const fullPath = this.searchHistoryDropdownElement\n ? this.searchHistoryDropdownElement.dataset.fullPath\n : 'project';\n const recentSearchesKey = `${fullPath}-${this.recentsStorageKeyNames[this.page]}`;\n this.recentSearchesService = new RecentSearchesService(recentSearchesKey);\n }\n\n setup() {\n // Fetch recent searches from localStorage\n this.fetchingRecentSearchesPromise = this.recentSearchesService\n .fetch()\n .catch(error => {\n if (error.name === 'RecentSearchesServiceError') return undefined;\n // eslint-disable-next-line no-new\n new Flash('An error occurred while parsing recent searches');\n // Gracefully fail to empty array\n return [];\n })\n .then(searches => {\n if (!searches) {\n return;\n }\n\n // Put any searches that may have come in before\n // we fetched the saved searches ahead of the already saved ones\n const resultantSearches = this.recentSearchesStore.setRecentSearches(\n this.recentSearchesStore.state.recentSearches.concat(searches),\n );\n this.recentSearchesService.save(resultantSearches);\n });\n\n if (this.filteredSearchInput) {\n this.tokenizer = FilteredSearchTokenizer;\n this.dropdownManager = new FilteredSearchDropdownManager({\n baseEndpoint: this.filteredSearchInput.getAttribute('data-base-endpoint') || '',\n tokenizer: this.tokenizer,\n page: this.page,\n isGroup: this.isGroup,\n isGroupAncestor: this.isGroupAncestor,\n isGroupDecendent: this.isGroupDecendent,\n filteredSearchTokenKeys: this.filteredSearchTokenKeys,\n });\n\n this.recentSearchesRoot = new RecentSearchesRoot(\n this.recentSearchesStore,\n this.recentSearchesService,\n this.searchHistoryDropdownElement,\n );\n this.recentSearchesRoot.init();\n\n this.bindEvents();\n this.loadSearchParamsFromURL();\n this.dropdownManager.setDropdown();\n this.cleanupWrapper = this.cleanup.bind(this);\n document.addEventListener('beforeunload', this.cleanupWrapper);\n }\n }\n\n cleanup() {\n this.unbindEvents();\n document.removeEventListener('beforeunload', this.cleanupWrapper);\n\n if (this.recentSearchesRoot) {\n this.recentSearchesRoot.destroy();\n }\n }\n\n bindStateEvents() {\n this.stateFilters = document.querySelector(`.container-fluid ${this.stateFiltersSelector}`);\n\n if (this.stateFilters) {\n this.searchStateWrapper = this.searchState.bind(this);\n\n this.applyToStateFilters(filterEl => {\n filterEl.addEventListener('click', this.searchStateWrapper);\n });\n }\n }\n\n unbindStateEvents() {\n if (this.stateFilters) {\n this.applyToStateFilters(filterEl => {\n filterEl.removeEventListener('click', this.searchStateWrapper);\n });\n }\n }\n\n applyToStateFilters(callback) {\n this.stateFilters.querySelectorAll('a[data-state]').forEach(filterEl => {\n if (this.states.indexOf(filterEl.dataset.state) > -1) {\n callback(filterEl);\n }\n });\n }\n\n bindEvents() {\n this.handleFormSubmit = this.handleFormSubmit.bind(this);\n this.setDropdownWrapper = this.dropdownManager.setDropdown.bind(this.dropdownManager);\n this.toggleClearSearchButtonWrapper = this.toggleClearSearchButton.bind(this);\n this.handleInputPlaceholderWrapper = this.handleInputPlaceholder.bind(this);\n this.handleInputVisualTokenWrapper = this.handleInputVisualToken.bind(this);\n this.checkForEnterWrapper = this.checkForEnter.bind(this);\n this.onClearSearchWrapper = this.onClearSearch.bind(this);\n this.checkForBackspaceWrapper = this.checkForBackspace.call(this);\n this.removeSelectedTokenKeydownWrapper = this.removeSelectedTokenKeydown.bind(this);\n this.unselectEditTokensWrapper = this.unselectEditTokens.bind(this);\n this.editTokenWrapper = this.editToken.bind(this);\n this.tokenChange = this.tokenChange.bind(this);\n this.addInputContainerFocusWrapper = this.addInputContainerFocus.bind(this);\n this.removeInputContainerFocusWrapper = this.removeInputContainerFocus.bind(this);\n this.onrecentSearchesItemSelectedWrapper = this.onrecentSearchesItemSelected.bind(this);\n this.removeTokenWrapper = this.removeToken.bind(this);\n\n this.filteredSearchInputForm.addEventListener('submit', this.handleFormSubmit);\n this.filteredSearchInput.addEventListener('input', this.setDropdownWrapper);\n this.filteredSearchInput.addEventListener('input', this.toggleClearSearchButtonWrapper);\n this.filteredSearchInput.addEventListener('input', this.handleInputPlaceholderWrapper);\n this.filteredSearchInput.addEventListener('input', this.handleInputVisualTokenWrapper);\n this.filteredSearchInput.addEventListener('keydown', this.checkForEnterWrapper);\n this.filteredSearchInput.addEventListener('keyup', this.checkForBackspaceWrapper);\n this.filteredSearchInput.addEventListener('click', this.tokenChange);\n this.filteredSearchInput.addEventListener('keyup', this.tokenChange);\n this.filteredSearchInput.addEventListener('focus', this.addInputContainerFocusWrapper);\n this.tokensContainer.addEventListener('click', this.removeTokenWrapper);\n this.tokensContainer.addEventListener('click', this.editTokenWrapper);\n this.clearSearchButton.addEventListener('click', this.onClearSearchWrapper);\n document.addEventListener('click', this.unselectEditTokensWrapper);\n document.addEventListener('click', this.removeInputContainerFocusWrapper);\n document.addEventListener('keydown', this.removeSelectedTokenKeydownWrapper);\n eventHub.$on('recentSearchesItemSelected', this.onrecentSearchesItemSelectedWrapper);\n\n this.bindStateEvents();\n }\n\n unbindEvents() {\n this.filteredSearchInputForm.removeEventListener('submit', this.handleFormSubmit);\n this.filteredSearchInput.removeEventListener('input', this.setDropdownWrapper);\n this.filteredSearchInput.removeEventListener('input', this.toggleClearSearchButtonWrapper);\n this.filteredSearchInput.removeEventListener('input', this.handleInputPlaceholderWrapper);\n this.filteredSearchInput.removeEventListener('input', this.handleInputVisualTokenWrapper);\n this.filteredSearchInput.removeEventListener('keydown', this.checkForEnterWrapper);\n this.filteredSearchInput.removeEventListener('keyup', this.checkForBackspaceWrapper);\n this.filteredSearchInput.removeEventListener('click', this.tokenChange);\n this.filteredSearchInput.removeEventListener('keyup', this.tokenChange);\n this.filteredSearchInput.removeEventListener('focus', this.addInputContainerFocusWrapper);\n this.tokensContainer.removeEventListener('click', this.removeTokenWrapper);\n this.tokensContainer.removeEventListener('click', this.editTokenWrapper);\n this.clearSearchButton.removeEventListener('click', this.onClearSearchWrapper);\n document.removeEventListener('click', this.unselectEditTokensWrapper);\n document.removeEventListener('click', this.removeInputContainerFocusWrapper);\n document.removeEventListener('keydown', this.removeSelectedTokenKeydownWrapper);\n eventHub.$off('recentSearchesItemSelected', this.onrecentSearchesItemSelectedWrapper);\n\n this.unbindStateEvents();\n }\n\n checkForBackspace() {\n let backspaceCount = 0;\n\n // closure for keeping track of the number of backspace keystrokes\n return e => {\n // 8 = Backspace Key\n // 46 = Delete Key\n if (e.keyCode === 8 || e.keyCode === 46) {\n const { lastVisualToken } = FilteredSearchVisualTokens.getLastVisualTokenBeforeInput();\n const { tokenName, tokenValue } = DropdownUtils.getVisualTokenValues(lastVisualToken);\n const canEdit = tokenName && this.canEdit && this.canEdit(tokenName, tokenValue);\n\n if (this.filteredSearchInput.value === '' && lastVisualToken && canEdit) {\n backspaceCount += 1;\n\n if (backspaceCount === 2) {\n backspaceCount = 0;\n this.filteredSearchInput.value = FilteredSearchVisualTokens.getLastTokenPartial();\n FilteredSearchVisualTokens.removeLastTokenPartial();\n }\n }\n\n // Reposition dropdown so that it is aligned with cursor\n this.dropdownManager.updateCurrentDropdownOffset();\n } else {\n backspaceCount = 0;\n }\n };\n }\n\n checkForEnter(e) {\n if (e.keyCode === 38 || e.keyCode === 40) {\n const { selectionStart } = this.filteredSearchInput;\n\n e.preventDefault();\n this.filteredSearchInput.setSelectionRange(selectionStart, selectionStart);\n }\n\n if (e.keyCode === 13) {\n const dropdown = this.dropdownManager.mapping[this.dropdownManager.currentDropdown];\n const dropdownEl = dropdown.element;\n const activeElements = dropdownEl.querySelectorAll('.droplab-item-active');\n\n e.preventDefault();\n\n if (!activeElements.length) {\n if (this.isHandledAsync) {\n e.stopImmediatePropagation();\n\n this.filteredSearchInput.blur();\n this.dropdownManager.resetDropdowns();\n } else {\n // Prevent droplab from opening dropdown\n this.dropdownManager.destroyDroplab();\n }\n\n this.search();\n }\n }\n }\n\n addInputContainerFocus() {\n addClassIfElementExists(this.filteredSearchInput.closest('.filtered-search-box'), 'focus');\n }\n\n removeInputContainerFocus(e) {\n const inputContainer = this.filteredSearchInput.closest('.filtered-search-box');\n const isElementInFilteredSearch = inputContainer && inputContainer.contains(e.target);\n const isElementInDynamicFilterDropdown = e.target.closest('.filter-dropdown') !== null;\n const isElementInStaticFilterDropdown = e.target.closest('ul[data-dropdown]') !== null;\n\n if (\n !isElementInFilteredSearch &&\n !isElementInDynamicFilterDropdown &&\n !isElementInStaticFilterDropdown &&\n inputContainer\n ) {\n inputContainer.classList.remove('focus');\n }\n }\n\n removeToken(e) {\n const removeButtonSelected = e.target.closest('.remove-token');\n\n if (removeButtonSelected) {\n e.preventDefault();\n // Prevent editToken from being triggered after token is removed\n e.stopImmediatePropagation();\n\n const button = e.target.closest('.selectable');\n FilteredSearchVisualTokens.selectToken(button, true);\n this.removeSelectedToken();\n }\n }\n\n unselectEditTokens(e) {\n const inputContainer = this.container.querySelector('.filtered-search-box');\n const isElementInFilteredSearch = inputContainer && inputContainer.contains(e.target);\n const isElementInFilterDropdown = e.target.closest('.filter-dropdown') !== null;\n const isElementTokensContainer = e.target.classList.contains('tokens-container');\n\n if ((!isElementInFilteredSearch && !isElementInFilterDropdown) || isElementTokensContainer) {\n FilteredSearchVisualTokens.moveInputToTheRight();\n this.dropdownManager.resetDropdowns();\n }\n }\n\n editToken(e) {\n const token = e.target.closest('.js-visual-token');\n const sanitizedTokenName = token && token.querySelector('.name').textContent.trim();\n const canEdit = this.canEdit && this.canEdit(sanitizedTokenName);\n\n if (token && canEdit) {\n e.preventDefault();\n e.stopPropagation();\n FilteredSearchVisualTokens.editToken(token);\n this.tokenChange();\n }\n }\n\n toggleClearSearchButton() {\n const query = DropdownUtils.getSearchQuery();\n const hidden = 'hidden';\n const hasHidden = this.clearSearchButton.classList.contains(hidden);\n\n if (query.length === 0 && !hasHidden) {\n this.clearSearchButton.classList.add(hidden);\n } else if (query.length && hasHidden) {\n this.clearSearchButton.classList.remove(hidden);\n }\n }\n\n handleInputPlaceholder() {\n const query = DropdownUtils.getSearchQuery();\n const placeholder = 'Search or filter results...';\n const currentPlaceholder = this.filteredSearchInput.placeholder;\n\n if (query.length === 0 && currentPlaceholder !== placeholder) {\n this.filteredSearchInput.placeholder = placeholder;\n } else if (query.length > 0 && currentPlaceholder !== '') {\n this.filteredSearchInput.placeholder = '';\n }\n }\n\n removeSelectedTokenKeydown(e) {\n // 8 = Backspace Key\n // 46 = Delete Key\n if (e.keyCode === 8 || e.keyCode === 46) {\n this.removeSelectedToken();\n }\n }\n\n removeSelectedToken() {\n FilteredSearchVisualTokens.removeSelectedToken();\n this.handleInputPlaceholder();\n this.toggleClearSearchButton();\n this.dropdownManager.updateCurrentDropdownOffset();\n }\n\n onClearSearch(e) {\n e.preventDefault();\n this.clearSearch();\n }\n\n clearSearch() {\n this.filteredSearchInput.value = '';\n\n const removeElements = [];\n\n [].forEach.call(this.tokensContainer.children, t => {\n let canClearToken = t.classList.contains('js-visual-token');\n\n if (canClearToken) {\n const { tokenName, tokenValue } = DropdownUtils.getVisualTokenValues(t);\n canClearToken = this.canEdit && this.canEdit(tokenName, tokenValue);\n }\n\n if (canClearToken) {\n removeElements.push(t);\n }\n });\n\n removeElements.forEach(el => {\n el.parentElement.removeChild(el);\n });\n\n this.clearSearchButton.classList.add('hidden');\n this.handleInputPlaceholder();\n\n this.dropdownManager.resetDropdowns();\n\n if (this.isHandledAsync) {\n this.search();\n }\n }\n\n handleInputVisualToken() {\n const input = this.filteredSearchInput;\n const { tokens, searchToken } = this.tokenizer.processTokens(\n input.value,\n this.filteredSearchTokenKeys.getKeys(),\n );\n const { isLastVisualTokenValid } = FilteredSearchVisualTokens.getLastVisualTokenBeforeInput();\n\n if (isLastVisualTokenValid) {\n tokens.forEach(t => {\n input.value = input.value.replace(`${t.key}:${t.symbol}${t.value}`, '');\n FilteredSearchVisualTokens.addFilterVisualToken(t.key, `${t.symbol}${t.value}`, {\n uppercaseTokenName: this.filteredSearchTokenKeys.shouldUppercaseTokenName(t.key),\n capitalizeTokenValue: this.filteredSearchTokenKeys.shouldCapitalizeTokenValue(t.key),\n });\n });\n\n const fragments = searchToken.split(':');\n if (fragments.length > 1) {\n const inputValues = fragments[0].split(' ');\n const tokenKey = _.last(inputValues);\n\n if (inputValues.length > 1) {\n inputValues.pop();\n const searchTerms = inputValues.join(' ');\n\n input.value = input.value.replace(searchTerms, '');\n FilteredSearchVisualTokens.addSearchVisualToken(searchTerms);\n }\n\n FilteredSearchVisualTokens.addFilterVisualToken(tokenKey, null, {\n uppercaseTokenName: this.filteredSearchTokenKeys.shouldUppercaseTokenName(tokenKey),\n capitalizeTokenValue: this.filteredSearchTokenKeys.shouldCapitalizeTokenValue(tokenKey),\n });\n input.value = input.value.replace(`${tokenKey}:`, '');\n }\n } else {\n // Keep listening to token until we determine that the user is done typing the token value\n const valueCompletedRegex = /([~%@]{0,1}\".+\")|([~%@]{0,1}'.+')|^((?![~%@]')(?![~%@]\")(?!')(?!\")).*/g;\n\n if (searchToken.match(valueCompletedRegex) && input.value[input.value.length - 1] === ' ') {\n const tokenKey = FilteredSearchVisualTokens.getLastTokenPartial();\n FilteredSearchVisualTokens.addFilterVisualToken(searchToken, null, {\n capitalizeTokenValue: this.filteredSearchTokenKeys.shouldCapitalizeTokenValue(tokenKey),\n });\n\n // Trim the last space as seen in the if statement above\n input.value = input.value.replace(searchToken, '').trim();\n }\n }\n }\n\n handleFormSubmit(e) {\n e.preventDefault();\n this.search();\n }\n\n saveCurrentSearchQuery() {\n // Don't save before we have fetched the already saved searches\n this.fetchingRecentSearchesPromise\n .then(() => {\n const searchQuery = DropdownUtils.getSearchQuery();\n if (searchQuery.length > 0) {\n const resultantSearches = this.recentSearchesStore.addRecentSearch(searchQuery);\n this.recentSearchesService.save(resultantSearches);\n }\n })\n .catch(() => {\n // https://gitlab.com/gitlab-org/gitlab-ce/issues/30821\n });\n }\n\n // allows for modifying params array when a param can't be included in the URL (e.g. Service Desk)\n getAllParams(urlParams) {\n return this.modifyUrlParams ? this.modifyUrlParams(urlParams) : urlParams;\n }\n\n loadSearchParamsFromURL() {\n const urlParams = getUrlParamsArray();\n const params = this.getAllParams(urlParams);\n const usernameParams = this.getUsernameParams();\n let hasFilteredSearch = false;\n\n params.forEach(p => {\n const split = p.split('=');\n const keyParam = decodeURIComponent(split[0]);\n const value = split[1];\n\n // Check if it matches edge conditions listed in this.filteredSearchTokenKeys\n const condition = this.filteredSearchTokenKeys.searchByConditionUrl(p);\n\n if (condition) {\n hasFilteredSearch = true;\n const canEdit = this.canEdit && this.canEdit(condition.tokenKey);\n FilteredSearchVisualTokens.addFilterVisualToken(condition.tokenKey, condition.value, {\n canEdit,\n });\n } else {\n // Sanitize value since URL converts spaces into +\n // Replace before decode so that we know what was originally + versus the encoded +\n const sanitizedValue = value ? decodeURIComponent(value.replace(/\\+/g, ' ')) : value;\n const match = this.filteredSearchTokenKeys.searchByKeyParam(keyParam);\n\n if (match) {\n // Use lastIndexOf because the token key is allowed to contain underscore\n // e.g. 'my_reaction' is the token key of 'my_reaction_emoji'\n const lastIndexOf = keyParam.lastIndexOf('_');\n let sanitizedKey = lastIndexOf !== -1 ? keyParam.slice(0, lastIndexOf) : keyParam;\n // Replace underscore with hyphen in the sanitizedkey.\n // e.g. 'my_reaction' => 'my-reaction'\n sanitizedKey = sanitizedKey.replace('_', '-');\n const { symbol } = match;\n let quotationsToUse = '';\n\n if (sanitizedValue.indexOf(' ') !== -1) {\n // Prefer \", but use ' if required\n quotationsToUse = sanitizedValue.indexOf('\"') === -1 ? '\"' : \"'\";\n }\n\n hasFilteredSearch = true;\n const canEdit = this.canEdit && this.canEdit(sanitizedKey, sanitizedValue);\n const { uppercaseTokenName, capitalizeTokenValue } = match;\n FilteredSearchVisualTokens.addFilterVisualToken(\n sanitizedKey,\n `${symbol}${quotationsToUse}${sanitizedValue}${quotationsToUse}`,\n {\n canEdit,\n uppercaseTokenName,\n capitalizeTokenValue,\n },\n );\n } else if (!match && keyParam === 'assignee_id') {\n const id = parseInt(value, 10);\n if (usernameParams[id]) {\n hasFilteredSearch = true;\n const tokenName = 'assignee';\n const canEdit = this.canEdit && this.canEdit(tokenName);\n FilteredSearchVisualTokens.addFilterVisualToken(tokenName, `@${usernameParams[id]}`, {\n canEdit,\n });\n }\n } else if (!match && keyParam === 'author_id') {\n const id = parseInt(value, 10);\n if (usernameParams[id]) {\n hasFilteredSearch = true;\n const tokenName = 'author';\n const canEdit = this.canEdit && this.canEdit(tokenName);\n FilteredSearchVisualTokens.addFilterVisualToken(tokenName, `@${usernameParams[id]}`, {\n canEdit,\n });\n }\n } else if (!match && keyParam === 'search') {\n hasFilteredSearch = true;\n this.filteredSearchInput.value = sanitizedValue;\n }\n }\n });\n\n this.saveCurrentSearchQuery();\n\n if (hasFilteredSearch) {\n this.clearSearchButton.classList.remove('hidden');\n this.handleInputPlaceholder();\n }\n }\n\n searchState(e) {\n e.preventDefault();\n const target = e.currentTarget;\n // remove focus outline after click\n target.blur();\n\n const state = target.dataset && target.dataset.state;\n\n if (state) {\n this.search(state);\n }\n }\n\n search(state = null) {\n const paths = [];\n const searchQuery = DropdownUtils.getSearchQuery();\n\n this.saveCurrentSearchQuery();\n\n const tokenKeys = this.filteredSearchTokenKeys.getKeys();\n const { tokens, searchToken } = this.tokenizer.processTokens(searchQuery, tokenKeys);\n const currentState = state || getParameterByName('state') || 'opened';\n paths.push(`state=${currentState}`);\n\n tokens.forEach(token => {\n const condition = this.filteredSearchTokenKeys.searchByConditionKeyValue(\n token.key,\n token.value,\n );\n const tokenConfig = this.filteredSearchTokenKeys.searchByKey(token.key) || {};\n const { param } = tokenConfig;\n\n // Replace hyphen with underscore to use as request parameter\n // e.g. 'my-reaction' => 'my_reaction'\n const underscoredKey = token.key.replace('-', '_');\n const keyParam = param ? `${underscoredKey}_${param}` : underscoredKey;\n let tokenPath = '';\n\n if (condition) {\n tokenPath = condition.url;\n } else {\n let tokenValue = token.value;\n\n if (tokenConfig.lowercaseValueOnSubmit) {\n tokenValue = tokenValue.toLowerCase();\n }\n\n if (\n (tokenValue[0] === \"'\" && tokenValue[tokenValue.length - 1] === \"'\") ||\n (tokenValue[0] === '\"' && tokenValue[tokenValue.length - 1] === '\"')\n ) {\n tokenValue = tokenValue.slice(1, tokenValue.length - 1);\n }\n\n tokenPath = `${keyParam}=${encodeURIComponent(tokenValue)}`;\n }\n\n paths.push(tokenPath);\n });\n\n if (searchToken) {\n const sanitized = searchToken\n .split(' ')\n .map(t => encodeURIComponent(t))\n .join('+');\n paths.push(`search=${sanitized}`);\n }\n\n const parameterizedUrl = `?scope=all&utf8=%E2%9C%93&${paths.join('&')}`;\n\n if (this.updateObject) {\n this.updateObject(parameterizedUrl);\n } else {\n visitUrl(parameterizedUrl);\n }\n }\n\n getUsernameParams() {\n const usernamesById = {};\n try {\n const attribute = this.filteredSearchInput.getAttribute('data-username-params');\n JSON.parse(attribute).forEach(user => {\n usernamesById[user.id] = user.username;\n });\n } catch (e) {\n // do nothing\n }\n return usernamesById;\n }\n\n tokenChange() {\n const dropdown = this.dropdownManager.mapping[this.dropdownManager.currentDropdown];\n\n if (dropdown) {\n const currentDropdownRef = dropdown.reference;\n\n this.setDropdownWrapper();\n currentDropdownRef.dispatchInputEvent();\n }\n }\n\n onrecentSearchesItemSelected(text) {\n this.clearSearch();\n this.filteredSearchInput.value = text;\n this.filteredSearchInput.dispatchEvent(new CustomEvent('input'));\n this.search();\n }\n\n // eslint-disable-next-line class-methods-use-this\n canEdit() {\n return true;\n }\n}\n","import FilteredSearchManager from '~/filtered_search/filtered_search_manager';\n\nexport default ({\n page,\n filteredSearchTokenKeys,\n isGroup,\n isGroupAncestor,\n isGroupDecendent,\n stateFiltersSelector,\n}) => {\n const filteredSearchEnabled = FilteredSearchManager && document.querySelector('.filtered-search');\n if (filteredSearchEnabled) {\n const filteredSearchManager = new FilteredSearchManager({\n page,\n isGroup,\n isGroupAncestor,\n isGroupDecendent,\n filteredSearchTokenKeys,\n stateFiltersSelector,\n });\n filteredSearchManager.setup();\n }\n};\n","/* eslint-disable import/prefer-default-export */\n\nexport const FILTERED_SEARCH = {\n MERGE_REQUESTS: 'merge_requests',\n ISSUES: 'issues',\n ADMIN_RUNNERS: 'admin/runners',\n};\n","import Mousetrap from 'mousetrap';\nimport findAndFollowLink from '../../lib/utils/navigation_utility';\nimport Shortcuts from './shortcuts';\n\nexport default class ShortcutsNavigation extends Shortcuts {\n constructor() {\n super();\n\n Mousetrap.bind('g p', () => findAndFollowLink('.shortcuts-project'));\n Mousetrap.bind('g v', () => findAndFollowLink('.shortcuts-project-activity'));\n Mousetrap.bind('g r', () => findAndFollowLink('.shortcuts-project-releases'));\n Mousetrap.bind('g f', () => findAndFollowLink('.shortcuts-tree'));\n Mousetrap.bind('g c', () => findAndFollowLink('.shortcuts-commits'));\n Mousetrap.bind('g j', () => findAndFollowLink('.shortcuts-builds'));\n Mousetrap.bind('g n', () => findAndFollowLink('.shortcuts-network'));\n Mousetrap.bind('g d', () => findAndFollowLink('.shortcuts-repository-charts'));\n Mousetrap.bind('g i', () => findAndFollowLink('.shortcuts-issues'));\n Mousetrap.bind('g b', () => findAndFollowLink('.shortcuts-issue-boards'));\n Mousetrap.bind('g m', () => findAndFollowLink('.shortcuts-merge_requests'));\n Mousetrap.bind('g w', () => findAndFollowLink('.shortcuts-wiki'));\n Mousetrap.bind('g s', () => findAndFollowLink('.shortcuts-snippets'));\n Mousetrap.bind('g k', () => findAndFollowLink('.shortcuts-kubernetes'));\n Mousetrap.bind('g e', () => findAndFollowLink('.shortcuts-environments'));\n Mousetrap.bind('g l', () => findAndFollowLink('.shortcuts-metrics'));\n Mousetrap.bind('i', () => findAndFollowLink('.shortcuts-new-issue'));\n\n this.enabledHelp.push('.hidden-shortcut.project');\n }\n}\n","import $ from 'jquery';\nimport AccessorUtilities from './lib/utils/accessor';\n\nexport default class ProjectSelectComboButton {\n constructor(select) {\n this.projectSelectInput = $(select);\n this.newItemBtn = $('.new-project-item-link');\n this.resourceType = this.newItemBtn.data('type');\n this.resourceLabel = this.newItemBtn.data('label');\n this.formattedText = this.deriveTextVariants();\n this.groupId = this.projectSelectInput.data('groupId');\n this.bindEvents();\n this.initLocalStorage();\n }\n\n bindEvents() {\n this.projectSelectInput\n .siblings('.new-project-item-select-button')\n .on('click', e => this.openDropdown(e));\n\n this.newItemBtn.on('click', e => {\n if (!this.getProjectFromLocalStorage()) {\n e.preventDefault();\n this.openDropdown(e);\n }\n });\n\n this.projectSelectInput.on('change', () => this.selectProject());\n }\n\n initLocalStorage() {\n const localStorageIsSafe = AccessorUtilities.isLocalStorageAccessSafe();\n\n if (localStorageIsSafe) {\n this.localStorageKey = [\n 'group',\n this.groupId,\n this.formattedText.localStorageItemType,\n 'recent-project',\n ].join('-');\n this.setBtnTextFromLocalStorage();\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n openDropdown(event) {\n import(/* webpackChunkName: 'select2' */ 'select2/select2')\n .then(() => {\n $(event.currentTarget)\n .siblings('.project-item-select')\n .select2('open');\n })\n .catch(() => {});\n }\n\n selectProject() {\n const selectedProjectData = JSON.parse(this.projectSelectInput.val());\n const projectUrl = `${selectedProjectData.url}/${this.projectSelectInput.data('relativePath')}`;\n const projectName = selectedProjectData.name;\n\n const projectMeta = {\n url: projectUrl,\n name: projectName,\n };\n\n this.setNewItemBtnAttributes(projectMeta);\n this.setProjectInLocalStorage(projectMeta);\n }\n\n setBtnTextFromLocalStorage() {\n const cachedProjectData = this.getProjectFromLocalStorage();\n\n this.setNewItemBtnAttributes(cachedProjectData);\n }\n\n setNewItemBtnAttributes(project) {\n if (project) {\n this.newItemBtn.attr('href', project.url);\n this.newItemBtn.text(`${this.formattedText.defaultTextPrefix} in ${project.name}`);\n } else {\n this.newItemBtn.text(`Select project to create ${this.formattedText.presetTextSuffix}`);\n }\n }\n\n getProjectFromLocalStorage() {\n const projectString = localStorage.getItem(this.localStorageKey);\n\n return JSON.parse(projectString);\n }\n\n setProjectInLocalStorage(projectMeta) {\n const projectString = JSON.stringify(projectMeta);\n\n localStorage.setItem(this.localStorageKey, projectString);\n }\n\n deriveTextVariants() {\n const defaultTextPrefix = this.resourceLabel;\n\n // the trailing slice call depluralizes each of these strings (e.g. new-issues -> new-issue)\n const localStorageItemType = `new-${this.resourceType\n .split('_')\n .join('-')\n .slice(0, -1)}`;\n const presetTextSuffix = this.resourceType\n .split('_')\n .join(' ')\n .slice(0, -1);\n\n return {\n localStorageItemType, // new-issue / new-merge-request\n defaultTextPrefix, // New issue / New merge request\n presetTextSuffix, // issue / merge request\n };\n }\n}\n","/* eslint-disable func-names, no-var, object-shorthand, one-var, no-else-return */\n\nimport $ from 'jquery';\nimport Api from './api';\nimport ProjectSelectComboButton from './project_select_combo_button';\n\nexport default function projectSelect() {\n import(/* webpackChunkName: 'select2' */ 'select2/select2')\n .then(() => {\n $('.ajax-project-select').each(function(i, select) {\n var placeholder;\n const simpleFilter = $(select).data('simpleFilter') || false;\n this.groupId = $(select).data('groupId');\n this.includeGroups = $(select).data('includeGroups');\n this.allProjects = $(select).data('allProjects') || false;\n this.orderBy = $(select).data('orderBy') || 'id';\n this.withIssuesEnabled = $(select).data('withIssuesEnabled');\n this.withMergeRequestsEnabled = $(select).data('withMergeRequestsEnabled');\n this.withShared =\n $(select).data('withShared') === undefined ? true : $(select).data('withShared');\n this.includeProjectsInSubgroups = $(select).data('includeProjectsInSubgroups') || false;\n this.allowClear = $(select).data('allowClear') || false;\n\n placeholder = 'Search for project';\n if (this.includeGroups) {\n placeholder += ' or group';\n }\n\n $(select).select2({\n placeholder: placeholder,\n minimumInputLength: 0,\n query: (function(_this) {\n return function(query) {\n var finalCallback, projectsCallback;\n finalCallback = function(projects) {\n var data;\n data = {\n results: projects,\n };\n return query.callback(data);\n };\n if (_this.includeGroups) {\n projectsCallback = function(projects) {\n var groupsCallback;\n groupsCallback = function(groups) {\n var data;\n data = groups.concat(projects);\n return finalCallback(data);\n };\n return Api.groups(query.term, {}, groupsCallback);\n };\n } else {\n projectsCallback = finalCallback;\n }\n if (_this.groupId) {\n return Api.groupProjects(\n _this.groupId,\n query.term,\n {\n with_issues_enabled: _this.withIssuesEnabled,\n with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n with_shared: _this.withShared,\n include_subgroups: _this.includeProjectsInSubgroups,\n },\n projectsCallback,\n );\n } else {\n return Api.projects(\n query.term,\n {\n order_by: _this.orderBy,\n with_issues_enabled: _this.withIssuesEnabled,\n with_merge_requests_enabled: _this.withMergeRequestsEnabled,\n membership: !_this.allProjects,\n },\n projectsCallback,\n );\n }\n };\n })(this),\n id: function(project) {\n if (simpleFilter) return project.id;\n return JSON.stringify({\n name: project.name,\n url: project.web_url,\n });\n },\n text: function(project) {\n return project.name_with_namespace || project.name;\n },\n\n initSelection: function(el, callback) {\n return Api.project(el.val()).then(({ data }) => callback(data));\n },\n\n allowClear: this.allowClear,\n\n dropdownCssClass: 'ajax-project-dropdown',\n });\n if (simpleFilter) return select;\n return new ProjectSelectComboButton(select);\n });\n })\n .catch(() => {});\n}\n","/* eslint-disable func-names, no-var, no-return-assign, one-var, object-shorthand, vars-on-top */\n\nimport $ from 'jquery';\nimport Cookies from 'js-cookie';\nimport { __ } from '~/locale';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport axios from '~/lib/utils/axios_utils';\nimport flash from '~/flash';\nimport projectSelect from '../../project_select';\n\nexport default class Project {\n constructor() {\n const $cloneOptions = $('ul.clone-options-dropdown');\n const $projectCloneField = $('#project_clone');\n const $cloneBtnLabel = $('.js-git-clone-holder .js-clone-dropdown-label');\n const mobileCloneField = document.querySelector(\n '.js-mobile-git-clone .js-clone-dropdown-label',\n );\n\n const selectedCloneOption = $cloneBtnLabel.text().trim();\n if (selectedCloneOption.length > 0) {\n $(`a:contains('${selectedCloneOption}')`, $cloneOptions).addClass('is-active');\n }\n\n $('a', $cloneOptions).on('click', e => {\n e.preventDefault();\n const $this = $(e.currentTarget);\n const url = $this.attr('href');\n const cloneType = $this.data('cloneType');\n\n $('.is-active', $cloneOptions).removeClass('is-active');\n $(`a[data-clone-type=\"${cloneType}\"]`).each(function() {\n const $el = $(this);\n const activeText = $el.find('.dropdown-menu-inner-title').text();\n const $container = $el.closest('.project-clone-holder');\n const $label = $container.find('.js-clone-dropdown-label');\n\n $el.toggleClass('is-active');\n $label.text(activeText);\n });\n\n if (mobileCloneField) {\n mobileCloneField.dataset.clipboardText = url;\n } else {\n $projectCloneField.val(url);\n }\n $('.js-git-empty .js-clone').text(url);\n });\n // Ref switcher\n Project.initRefSwitcher();\n $('.project-refs-select').on('change', function() {\n return $(this)\n .parents('form')\n .submit();\n });\n $('.hide-no-ssh-message').on('click', function(e) {\n Cookies.set('hide_no_ssh_message', 'false');\n $(this)\n .parents('.no-ssh-key-message')\n .remove();\n return e.preventDefault();\n });\n $('.hide-no-password-message').on('click', function(e) {\n Cookies.set('hide_no_password_message', 'false');\n $(this)\n .parents('.no-password-message')\n .remove();\n return e.preventDefault();\n });\n $('.hide-auto-devops-implicitly-enabled-banner').on('click', function(e) {\n const projectId = $(this).data('project-id');\n const cookieKey = `hide_auto_devops_implicitly_enabled_banner_${projectId}`;\n Cookies.set(cookieKey, 'false');\n $(this)\n .parents('.auto-devops-implicitly-enabled-banner')\n .remove();\n return e.preventDefault();\n });\n Project.projectSelectDropdown();\n }\n\n static projectSelectDropdown() {\n projectSelect();\n $('.project-item-select').on('click', e => Project.changeProject($(e.currentTarget).val()));\n }\n\n static changeProject(url) {\n return (window.location = url);\n }\n\n static initRefSwitcher() {\n var refListItem = document.createElement('li');\n var refLink = document.createElement('a');\n\n refLink.href = '#';\n\n return $('.js-project-refs-dropdown').each(function() {\n var $dropdown, selected;\n $dropdown = $(this);\n selected = $dropdown.data('selected');\n return $dropdown.glDropdown({\n data(term, callback) {\n axios\n .get($dropdown.data('refsUrl'), {\n params: {\n ref: $dropdown.data('ref'),\n search: term,\n },\n })\n .then(({ data }) => callback(data))\n .catch(() => flash(__('An error occurred while getting projects')));\n },\n selectable: true,\n filterable: true,\n filterRemote: true,\n filterByText: true,\n inputFieldName: $dropdown.data('inputFieldName'),\n fieldName: $dropdown.data('fieldName'),\n renderRow: function(ref) {\n var li = refListItem.cloneNode(false);\n\n if (ref.header != null) {\n li.className = 'dropdown-header';\n li.textContent = ref.header;\n } else {\n var link = refLink.cloneNode(false);\n\n if (ref === selected) {\n link.className = 'is-active';\n }\n\n link.textContent = ref;\n link.dataset.ref = ref;\n\n li.appendChild(link);\n }\n\n return li;\n },\n id: function(obj, $el) {\n return $el.attr('data-ref');\n },\n toggleLabel: function(obj, $el) {\n return $el.text().trim();\n },\n clicked: function(options) {\n const { e } = options;\n e.preventDefault();\n if ($('input[name=\"ref\"]').length) {\n var $form = $dropdown.closest('form');\n\n var $visit = $dropdown.data('visit');\n var shouldVisit = $visit ? true : $visit;\n var action = $form.attr('action');\n var divider = action.indexOf('?') === -1 ? '?' : '&';\n if (shouldVisit) {\n visitUrl(`${action}${divider}${$form.serialize()}`);\n }\n }\n },\n });\n });\n }\n}\n","import initGkeDropdowns from '~/projects/gke_cluster_dropdowns';\nimport PersistentUserCallout from '../../persistent_user_callout';\nimport Project from './project';\nimport ShortcutsNavigation from '../../behaviors/shortcuts/shortcuts_navigation';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const { page } = document.body.dataset;\n const newClusterViews = [\n 'projects:clusters:new',\n 'projects:clusters:create_gcp',\n 'projects:clusters:create_user',\n ];\n\n if (newClusterViews.indexOf(page) > -1) {\n const callout = document.querySelector('.gcp-signup-offer');\n PersistentUserCallout.factory(callout);\n\n initGkeDropdowns();\n }\n\n new Project(); // eslint-disable-line no-new\n new ShortcutsNavigation(); // eslint-disable-line no-new\n});\n","/* eslint-disable import/prefer-default-export */\n\nexport const ISSUABLE_INDEX = {\n MERGE_REQUEST: 'merge_request_',\n ISSUE: 'issue_',\n};\n","/* eslint-disable class-methods-use-this, no-new */\n\nimport $ from 'jquery';\nimport IssuableBulkUpdateActions from './issuable_bulk_update_actions';\nimport MilestoneSelect from './milestone_select';\nimport issueStatusSelect from './issue_status_select';\nimport subscriptionSelect from './subscription_select';\nimport LabelsSelect from './labels_select';\n\nconst HIDDEN_CLASS = 'hidden';\nconst DISABLED_CONTENT_CLASS = 'disabled-content';\nconst SIDEBAR_EXPANDED_CLASS = 'right-sidebar-expanded issuable-bulk-update-sidebar';\nconst SIDEBAR_COLLAPSED_CLASS = 'right-sidebar-collapsed issuable-bulk-update-sidebar';\n\nexport default class IssuableBulkUpdateSidebar {\n constructor() {\n this.initDomElements();\n this.bindEvents();\n this.initDropdowns();\n this.setupBulkUpdateActions();\n }\n\n initDomElements() {\n this.$page = $('.layout-page');\n this.$sidebar = $('.right-sidebar');\n this.$sidebarInnerContainer = this.$sidebar.find('.issuable-sidebar');\n this.$bulkEditCancelBtn = $('.js-bulk-update-menu-hide');\n this.$bulkEditSubmitBtn = $('.update-selected-issues');\n this.$bulkUpdateEnableBtn = $('.js-bulk-update-toggle');\n this.$otherFilters = $('.issues-other-filters');\n this.$checkAllContainer = $('.check-all-holder');\n this.$issueChecks = $('.issue-check');\n this.$issuesList = $('.selected-issuable');\n this.$issuableIdsInput = $('#update_issuable_ids');\n }\n\n bindEvents() {\n this.$bulkUpdateEnableBtn.on('click', e => this.toggleBulkEdit(e, true));\n this.$bulkEditCancelBtn.on('click', e => this.toggleBulkEdit(e, false));\n this.$checkAllContainer.on('click', e => this.selectAll(e));\n this.$issuesList.on('change', () => this.updateFormState());\n this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit());\n this.$checkAllContainer.on('click', () => this.updateFormState());\n }\n\n initDropdowns() {\n new LabelsSelect();\n new MilestoneSelect();\n issueStatusSelect();\n subscriptionSelect();\n }\n\n setupBulkUpdateActions() {\n IssuableBulkUpdateActions.setOriginalDropdownData();\n }\n\n updateFormState() {\n const noCheckedIssues = !$('.selected-issuable:checked').length;\n\n this.toggleSubmitButtonDisabled(noCheckedIssues);\n this.updateSelectedIssuableIds();\n\n IssuableBulkUpdateActions.setOriginalDropdownData();\n }\n\n prepForSubmit() {\n // if submit button is disabled, submission is blocked. This ensures we disable after\n // form submission is carried out\n setTimeout(() => this.$bulkEditSubmitBtn.disable());\n this.updateSelectedIssuableIds();\n }\n\n toggleBulkEdit(e, enable) {\n e.preventDefault();\n\n this.toggleSidebarDisplay(enable);\n this.toggleBulkEditButtonDisabled(enable);\n this.toggleOtherFiltersDisabled(enable);\n this.toggleCheckboxDisplay(enable);\n }\n\n updateSelectedIssuableIds() {\n this.$issuableIdsInput.val(IssuableBulkUpdateSidebar.getCheckedIssueIds());\n }\n\n selectAll() {\n const checkAllButtonState = this.$checkAllContainer.find('input').prop('checked');\n\n this.$issuesList.prop('checked', checkAllButtonState);\n }\n\n toggleSidebarDisplay(show) {\n this.$page.toggleClass(SIDEBAR_EXPANDED_CLASS, show);\n this.$page.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);\n this.$sidebarInnerContainer.toggleClass(HIDDEN_CLASS, !show);\n this.$sidebar.toggleClass(SIDEBAR_EXPANDED_CLASS, show);\n this.$sidebar.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);\n }\n\n toggleBulkEditButtonDisabled(disable) {\n if (disable) {\n this.$bulkUpdateEnableBtn.disable();\n } else {\n this.$bulkUpdateEnableBtn.enable();\n }\n }\n\n toggleCheckboxDisplay(show) {\n this.$checkAllContainer.toggleClass(HIDDEN_CLASS, !show);\n this.$issueChecks.toggleClass(HIDDEN_CLASS, !show);\n }\n\n toggleOtherFiltersDisabled(disable) {\n this.$otherFilters.toggleClass(DISABLED_CONTENT_CLASS, disable);\n }\n\n toggleSubmitButtonDisabled(disable) {\n if (disable) {\n this.$bulkEditSubmitBtn.disable();\n } else {\n this.$bulkEditSubmitBtn.enable();\n }\n }\n\n static getCheckedIssueIds() {\n const $checkedIssues = $('.selected-issuable:checked');\n\n if ($checkedIssues.length > 0) {\n return $.map($checkedIssues, value => $(value).data('id'));\n }\n\n return [];\n }\n}\n","import $ from 'jquery';\n\nexport default function issueStatusSelect() {\n $('.js-issue-status').each((i, el) => {\n const fieldName = $(el).data('fieldName');\n return $(el).glDropdown({\n selectable: true,\n fieldName,\n toggleLabel(selected, element, instance) {\n let label = 'Author';\n const $item = instance.dropdown.find('.is-active');\n if ($item.length) {\n label = $item.text();\n }\n return label;\n },\n clicked(options) {\n return options.e.preventDefault();\n },\n id(obj, element) {\n return $(element).data('id');\n },\n });\n });\n}\n","import $ from 'jquery';\n\nexport default function subscriptionSelect() {\n $('.js-subscription-event').each((i, element) => {\n const fieldName = $(element).data('fieldName');\n\n return $(element).glDropdown({\n selectable: true,\n fieldName,\n toggleLabel(selected, el, instance) {\n let label = 'Subscription';\n const $item = instance.dropdown.find('.is-active');\n if ($item.length) {\n label = $item.text();\n }\n return label;\n },\n clicked(options) {\n return options.e.preventDefault();\n },\n id(obj, el) {\n return $(el).data('id');\n },\n });\n });\n}\n","import $ from 'jquery';\nimport axios from './lib/utils/axios_utils';\nimport flash from './flash';\nimport { __ } from './locale';\nimport IssuableBulkUpdateSidebar from './issuable_bulk_update_sidebar';\nimport IssuableBulkUpdateActions from './issuable_bulk_update_actions';\n\nexport default class IssuableIndex {\n constructor(pagePrefix) {\n this.initBulkUpdate(pagePrefix);\n IssuableIndex.resetIncomingEmailToken();\n }\n initBulkUpdate(pagePrefix) {\n const userCanBulkUpdate = $('.issues-bulk-update').length > 0;\n const alreadyInitialized = !!this.bulkUpdateSidebar;\n\n if (userCanBulkUpdate && !alreadyInitialized) {\n IssuableBulkUpdateActions.init({\n prefixId: pagePrefix,\n });\n\n this.bulkUpdateSidebar = new IssuableBulkUpdateSidebar();\n }\n }\n\n static resetIncomingEmailToken() {\n const $resetToken = $('.incoming-email-token-reset');\n\n $resetToken.on('click', e => {\n e.preventDefault();\n\n $resetToken.text('resetting...');\n\n axios\n .put($resetToken.attr('href'))\n .then(({ data }) => {\n $('#issuable_email')\n .val(data.new_address)\n .focus();\n\n $resetToken.text('reset it');\n })\n .catch(() => {\n flash(__('There was an error when reseting email token.'));\n\n $resetToken.text('reset it');\n });\n });\n }\n}\n","/* eslint-disable consistent-return, func-names, array-callback-return, prefer-arrow-callback, no-unused-vars */\n\nimport $ from 'jquery';\nimport _ from 'underscore';\nimport axios from './lib/utils/axios_utils';\nimport Flash from './flash';\n\nexport default {\n init({ container, form, issues, prefixId } = {}) {\n this.prefixId = prefixId || 'issue_';\n this.form = form || this.getElement('.bulk-update');\n this.$labelDropdown = this.form.find('.js-label-select');\n this.issues = issues || this.getElement('.issues-list .issue');\n this.willUpdateLabels = false;\n this.bindEvents();\n },\n\n bindEvents() {\n return this.form.off('submit').on('submit', this.onFormSubmit.bind(this));\n },\n\n onFormSubmit(e) {\n e.preventDefault();\n return this.submit();\n },\n\n submit() {\n axios[this.form.attr('method')](this.form.attr('action'), this.getFormDataAsObject())\n .then(() => window.location.reload())\n .catch(() => this.onFormSubmitFailure());\n },\n\n onFormSubmitFailure() {\n this.form.find('[type=\"submit\"]').enable();\n return new Flash('Issue update failed');\n },\n\n getSelectedIssues() {\n return this.issues.has('.selected-issuable:checked');\n },\n\n getLabelsFromSelection() {\n const labels = [];\n this.getSelectedIssues().map(function() {\n const labelsData = $(this).data('labels');\n if (labelsData) {\n return labelsData.map(function(labelId) {\n if (labels.indexOf(labelId) === -1) {\n return labels.push(labelId);\n }\n });\n }\n });\n return labels;\n },\n\n /**\n * Will return only labels that were marked previously and the user has unmarked\n * @return {Array} Label IDs\n */\n\n getUnmarkedIndeterminedLabels() {\n const result = [];\n const labelsToKeep = this.$labelDropdown.data('indeterminate');\n\n this.getLabelsFromSelection().forEach(id => {\n if (labelsToKeep.indexOf(id) === -1) {\n result.push(id);\n }\n });\n\n return result;\n },\n\n /**\n * Simple form serialization, it will return just what we need\n * Returns key/value pairs from form data\n */\n\n getFormDataAsObject() {\n const formData = {\n update: {\n state_event: this.form.find('input[name=\"update[state_event]\"]').val(),\n // For Merge Requests\n assignee_id: this.form.find('input[name=\"update[assignee_id]\"]').val(),\n // For Issues\n assignee_ids: [this.form.find('input[name=\"update[assignee_ids][]\"]').val()],\n milestone_id: this.form.find('input[name=\"update[milestone_id]\"]').val(),\n issuable_ids: this.form.find('input[name=\"update[issuable_ids]\"]').val(),\n subscription_event: this.form.find('input[name=\"update[subscription_event]\"]').val(),\n add_label_ids: [],\n remove_label_ids: [],\n },\n };\n if (this.willUpdateLabels) {\n formData.update.add_label_ids = this.$labelDropdown.data('marked');\n formData.update.remove_label_ids = this.$labelDropdown.data('unmarked');\n }\n return formData;\n },\n\n setOriginalDropdownData() {\n const $labelSelect = $('.bulk-update .js-label-select');\n $labelSelect.data('common', this.getOriginalCommonIds());\n $labelSelect.data('marked', this.getOriginalMarkedIds());\n $labelSelect.data('indeterminate', this.getOriginalIndeterminateIds());\n },\n\n // From issuable's initial bulk selection\n getOriginalCommonIds() {\n const labelIds = [];\n\n this.getElement('.selected-issuable:checked').each((i, el) => {\n labelIds.push(this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels'));\n });\n return _.intersection.apply(this, labelIds);\n },\n\n // From issuable's initial bulk selection\n getOriginalMarkedIds() {\n const labelIds = [];\n this.getElement('.selected-issuable:checked').each((i, el) => {\n labelIds.push(this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels'));\n });\n return _.intersection.apply(this, labelIds);\n },\n\n // From issuable's initial bulk selection\n getOriginalIndeterminateIds() {\n const uniqueIds = [];\n const labelIds = [];\n let issuableLabels = [];\n\n // Collect unique label IDs for all checked issues\n this.getElement('.selected-issuable:checked').each((i, el) => {\n issuableLabels = this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels');\n issuableLabels.forEach(labelId => {\n // Store unique IDs\n if (uniqueIds.indexOf(labelId) === -1) {\n uniqueIds.push(labelId);\n }\n });\n // Store array of IDs per issuable\n labelIds.push(issuableLabels);\n });\n // Add uniqueIds to add it as argument for _.intersection\n labelIds.unshift(uniqueIds);\n // Return IDs that are present but not in all selected issueables\n return _.difference(uniqueIds, _.intersection.apply(this, labelIds));\n },\n\n getElement(selector) {\n this.scopeEl = this.scopeEl || $('.content');\n return this.scopeEl.find(selector);\n },\n};\n"],"sourceRoot":""}