{"version":3,"sources":["webpack:///boards.24eba708768ebdc67ff6.bundle.js","webpack:///../images/no_avatar.png","webpack:///./boards/boards_bundle.js","webpack:///./boards/components/board.js","webpack:///./boards/components/board_blank_state.js","webpack:///./boards/components/board_delete.js","webpack:///boards/components/board_card.vue","webpack:///./boards/components/board_card.vue?02db","webpack:///./boards/components/board_card.vue","webpack:///./boards/components/board_list.js","webpack:///./boards/components/board_new_issue.js","webpack:///./boards/components/board_sidebar.js","webpack:///./boards/components/issue_card_inner.js","webpack:///./boards/components/modal/filters.js","webpack:///./boards/components/modal/tabs.js","webpack:///./boards/components/modal/header.js","webpack:///./boards/components/modal/list.js","webpack:///./boards/components/modal/lists_dropdown.js","webpack:///./boards/components/modal/footer.js","webpack:///./boards/components/modal/empty_state.js","webpack:///./boards/components/modal/index.js","webpack:///./boards/components/new_list_dropdown.js","webpack:///./boards/components/sidebar/remove_issue.js","webpack:///./boards/eventhub.js","webpack:///./boards/filtered_search_boards.js","webpack:///./boards/filters/due_date_filters.js","webpack:///./boards/mixins/modal_mixins.js","webpack:///./boards/mixins/sortable_default_options.js","webpack:///./boards/models/assignee.js","webpack:///./boards/models/issue.js","webpack:///./boards/models/label.js","webpack:///./boards/models/list.js","webpack:///./boards/models/milestone.js","webpack:///./boards/services/board_service.js","webpack:///./boards/stores/boards_store.js","webpack:///./boards/stores/modal_store.js","webpack:///./boards/utils/query_data.js","webpack:///./sidebar/components/assignees/assignee_title.js","webpack:///./sidebar/components/assignees/assignees.js","webpack:///sidebar/components/subscriptions/subscriptions.vue","webpack:///./sidebar/components/subscriptions/subscriptions.vue?de8c","webpack:///./sidebar/components/subscriptions/subscriptions.vue","webpack:///./sidebar/event_hub.js"],"names":["webpackJsonp","../images/no_avatar.png","module","exports","./boards/boards_bundle.js","__webpack_exports__","__webpack_require__","Object","defineProperty","value","$","__WEBPACK_IMPORTED_MODULE_0_underscore__","__WEBPACK_IMPORTED_MODULE_0_underscore___default","n","__WEBPACK_IMPORTED_MODULE_1_vue__","__WEBPACK_IMPORTED_MODULE_2_vue_resource__","__WEBPACK_IMPORTED_MODULE_3__flash__","__WEBPACK_IMPORTED_MODULE_4__locale__","__WEBPACK_IMPORTED_MODULE_5__filtered_search_boards__","__WEBPACK_IMPORTED_MODULE_6__eventhub__","__WEBPACK_IMPORTED_MODULE_7__sidebar_event_hub__","__WEBPACK_IMPORTED_MODULE_9__models_label__","__WEBPACK_IMPORTED_MODULE_11__models_milestone__","__WEBPACK_IMPORTED_MODULE_12__models_assignee__","__WEBPACK_IMPORTED_MODULE_14__stores_modal_store__","__WEBPACK_IMPORTED_MODULE_15__services_board_service__","__WEBPACK_IMPORTED_MODULE_16__mixins_modal_mixins__","__WEBPACK_IMPORTED_MODULE_17__mixins_sortable_default_options__","use","$boardApp","document","getElementById","Store","gl","issueBoards","BoardsStore","ModalStore","window","IssueBoardsApp","$destroy","create","boardStoreIssueSet","_len","arguments","length","args","Array","_key","set","apply","detail","issue","concat","boardStoreIssueDelete","_len2","_key2","delete","el","components","board","Board","board-sidebar","BoardSidebar","board-add-issues-modal","IssuesModal","data","state","loading","boardsEndpoint","dataset","listsEndpoint","boardId","disabled","issueLinkBase","rootPath","bulkUpdatePath","detailIssue","defaultAvatar","computed","detailIssueVisible","keys","this","created","boardService","$on","updateTokens","updateDetailIssue","clearDetailIssue","toggleSubscription","beforeDestroy","$off","mounted","_this","filterManager","filter","setup","all","then","response","json","resp","forEach","list","addList","type","position","Infinity","label","description","lists","a","sortBy","addBlankState","catch","methods","newIssue","sidebarInfoEndpoint","undefined","subscribed","setFetchingState","getIssueInfo","res","updateData","id","toggleSubscriptionEndpoint","toggleIssueSubscription","IssueBoardsSearch","filters","newListDropdownInit","IssueBoardsModalAddBtn","mixins","ModalMixins","modal","store","watch","updateTooltip","preset","tooltipTitle","_this2","$tooltip","$refs","addIssuesButton","$nextTick","tooltip","openModal","toggleModal","template","call","./boards/components/board.js","__WEBPACK_IMPORTED_MODULE_0_vue__","__WEBPACK_IMPORTED_MODULE_1__lib_utils_accessor__","__WEBPACK_IMPORTED_MODULE_2__board_list__","__WEBPACK_IMPORTED_MODULE_3__board_blank_state__","extend","boardList","board-delete","BoardDelete","boardBlankState","props","Boolean","String","required","handler","page","getIssues","deep","findIssue","offsetLeft","$el","boardsList","querySelectorAll","left","scrollLeft","right","offsetWidth","innerWidth","classList","contains","animate","sortableOptions","animation","showNewIssueForm","showIssueForm","toggleExpanded","e","isExpandable","target","isExpanded","isLocalStorageAccessSafe","localStorage","setItem","getBoardSortableDefaultOptions","group","draggable","handle","onEnd","newIndex","oldIndex","order","sortable","toArray","findList","parseInt","item","moveList","Sortable","parentNode","isCollapsed","getItem","./boards/components/board_blank_state.js","__WEBPACK_IMPORTED_MODULE_1_js_cookie__","__WEBPACK_IMPORTED_MODULE_1_js_cookie___default","predefinedLabels","ListLabel","title","color","addDefaultLists","clearBlankState","i","list_type","generateDefaultLists","listObj","removeList","remove","path","removeBlankState","bind","./boards/components/board_delete.js","deleteBoard","confirm","destroy","./boards/components/board_list.js","board_new_issue","eventhub","board_card","name","issue-card-inner","IssueCardInner","index","Number","showDetail","issueDetailVisible","mouseDown","mouseMove","showIssue","$emit","render","_vm","_h","$createElement","_c","_self","staticClass","class","user-can-drag","is-disabled","is-active","attrs","data-issue-id","on","mousedown","mousemove","mouseup","$event","issue-link-base","root-path","update-filters","staticRenderFns","esExports","components_board_card","normalizeComponent","Component","boards_components_board_card","loading_icon","board_list_Store","issues","scrollOffset","showCount","boardCard","boardNewIssue","loadingIcon","listHeight","getBoundingClientRect","height","scrollHeight","scrollTop","scrollToTop","loadNextPage","nextPage","loadingDone","loadingMore","toggleForm","onScroll","issuesSize","Math","ceil","_this3","options","scroll","dataIdAttr","onStart","card","moving","issueId","onAdd","moveIssueToList","onUpdate","sortedArray","moveIssueInList","onMove","related","addEventListener","removeEventListener","./boards/components/board_new_issue.js","__WEBPACK_IMPORTED_MODULE_0__eventhub__","error","submit","preventDefault","trim","Promise","resolve","labels","ListIssue","assignees","cancel","submitButton","enable","removeIssue","input","focus","./boards/components/board_sidebar.js","__WEBPACK_IMPORTED_MODULE_1__flash__","__WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__","__WEBPACK_IMPORTED_MODULE_3__sidebar_components_assignees_assignee_title__","__WEBPACK_IMPORTED_MODULE_4__sidebar_components_assignees_assignees__","__WEBPACK_IMPORTED_MODULE_5__due_date_select__","__WEBPACK_IMPORTED_MODULE_7__issuable_context__","__WEBPACK_IMPORTED_MODULE_8__labels_select__","__WEBPACK_IMPORTED_MODULE_9__sidebar_components_subscriptions_subscriptions_vue__","currentUser","loadingAssignees","showSidebar","milestoneTitle","milestone","canRemove","find","each","clearMenu","endpoint","assigneeDropdown","issueUpdate","closeSidebar","assignSelf","assigneeBlock","dispatchEvent","Event","addAssignee","saveAssignees","removeAssignee","removeAllAssignees","update","MilestoneSelect","Sidebar","assigneeTitle","removeBtn","RemoveIssueBtn","subscriptions","./boards/components/issue_card_inner.js","__WEBPACK_IMPORTED_MODULE_1__vue_shared_components_user_avatar_user_avatar_link_vue__","__WEBPACK_IMPORTED_MODULE_2__eventhub__","default","updateFilters","limitBeforeCounter","maxRender","maxCounter","userAvatarLink","numberOverLimit","assigneeCounterTooltip","assigneeCounterLabel","shouldRenderCounter","cardUrl","iid","showLabelFooter","l","showLabel","isIndexLessThanlimit","shouldRenderAssignee","assigneeUrl","assignee","username","assigneeUrlTitle","avatarUrlTitle","filterByLabel","filterPath","split","labelTitle","encodeURIComponent","param","labelIndex","indexOf","currentTarget","push","splice","join","updateFiltersUrl","labelStyle","backgroundColor","textColor","./boards/components/modal/index.js","vue_esm","query_data","filtered_search_boards","container","filteredSearch","removeTokens","handleInputPlaceholder","toggleClearSearchButton","destroyed","cleanup","ModalTabs","selectedCount","activeTab","header_ModalStore","ModalHeader","projectId","milestonePath","labelPath","selectAllText","showSearch","issuesCount","toggleAll","selectAllBtn","blur","modal-tabs","modalFilters","breakpoints","list_ModalStore","ModalList","emptyStateSvg","purgeUnselectedIssues","loopIssues","selectedIssues","groupedIssues","groups","columns","scrollHandler","currentPage","floor","perPage","loadingNewPage","toggleIssue","tagName","selectedIssueIndex","setColumnCount","breakpoint","getBreakpointSize","scrollHandlerWrapper","setColumnCountWrapper","flash","lists_dropdown_ModalStore","ModalFooterListsDropdown","selected","selectedList","text_utility","footer_ModalStore","ModalFooter","submitDisabled","submitText","count","addIssues","getSelectedIssues","issueIds","map","bulkUpdate","add_label_ids","addIssue","lists-dropdown","empty_state_ModalStore","ModalEmptyState","newIssuePath","contents","obj","content","modal_ModalStore","loadIssues","showAddIssuesModal","filterLoading","clearIssues","getBacklog","per","issueObj","foundSelectedIssue","findSelectedIssue","size","showList","showEmptyState","modal-header","modal-list","modal-footer","empty-state","./boards/components/new_list_dropdown.js","__WEBPACK_IMPORTED_MODULE_1__create_label__","off","new","$this","closest","glDropdown","term","callback","get","attr","renderRow","active","$li","$a","text","href","$labelColor","style","append","prepend","search","fields","filterable","selectable","multiSelect","clicked","selectedObj","./boards/components/sidebar/remove_issue.js","updateUrl","getLists","listLabelIds","labelIds","includes","label_ids","http","patch","./boards/eventhub.js","./boards/filtered_search_boards.js","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","prototype","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","__WEBPACK_IMPORTED_MODULE_0__filtered_search_container__","_typeof","Symbol","iterator","_createClass","defineProperties","descriptor","key","protoProps","staticProps","FilteredSearchBoards","_gl$FilteredSearchMan","cantEdit","getPrototypeOf","isHandledAsync","cantEditWithValue","substr","tokens","removeChild","filteredSearchInput","loadSearchParamsFromURL","tokenName","tokenValue","findIndex","token","FilteredSearchManager","./boards/filters/due_date_filters.js","date","Date","dateFormat","./boards/mixins/modal_mixins.js","toggle","changeTab","tab","./boards/mixins/sortable_default_options.js","body","add","touchEnabled","DocumentTouch","defaultSortOptions","forceFallback","fallbackClass","fallbackOnBody","ghostClass","delay","scrollSensitivity","scrollSpeed","./boards/models/assignee.js","ListAssignee","user","avatar","avatar_url","./boards/models/issue.js","confidential","dueDate","due_date","relative_position","isFetching","isLoading","issue_sidebar_endpoint","toggle_subscription_endpoint","ListMilestone","findLabel","removeLabel","findAssignee","newData","assign","url","milestone_id","assignee_ids","u","./boards/models/label.js","text_color","priority","./boards/models/list.js","__WEBPACK_IMPORTED_MODULE_0__utils_query_data__","List","_uid","guid","s4","random","toString","substring","createList","updateNewListDropdown","destroyList","updateList","emptyIssues","label_name","getIssuesForList","createIssues","project","moveBeforeId","moveIssue","_this4","listFrom","moveAfterId","addLabel","updateIssueLabel","_this5","matchesRemove","./boards/models/milestone.js","./boards/services/board_service.js","BoardService","_ref","boards","resource","method","gon","relative_url_root","generate","label_id","save","from_list_id","to_list_id","move_before_id","move_after_id","extraData","issuable_ids","post","./boards/stores/boards_store.js","__WEBPACK_IMPORTED_MODULE_2__lib_utils_common_utils__","backlogList","listId","removeClass","shouldAddBlankState","welcomeIsHidden","expires","orderLists","listTo","issueTo","issueLists","listLabels","listIssue","removeLabels","idArray","beforeId","afterId","val","byType","history","pushState","./boards/stores/modal_store.js","searchTerm","removeSelectedIssue","addSelectedIssue","select","forcePurge","fIssue","filteredIssue","./boards/utils/query_data.js","reduce","dataParam","filterParam","paramSplit","paramKeyNormalized","replace","isArray","decodeURIComponent","./sidebar/components/assignees/assignee_title.js","numberOfAssignees","editable","showToggle","./sidebar/components/assignees/assignees.js","defaultRenderCount","defaultMaxCounter","showLess","users","firstUser","hasMoreThanTwoAssignees","hasMoreThanOneAssignee","hasAssignees","hasNoUsers","hasOneUser","renderShowMoreSection","numberOfHiddenAssignees","isHiddenAssignees","hiddenAssigneesLabel","collapsedTooltipTitle","min","renderUsers","slice","names","sidebarAvatarCounter","counter","toggleShowLess","renderAssignee","avatarUrl","assigneeAlt","assigneeUsername","shouldRenderCollapsedAssignee","firstTwo","./sidebar/components/subscriptions/subscriptions.vue","locale","event_hub","loading_button","loadingButton","buttonLabel","_m","_v","_s","__","ref","click","aria-hidden","subscriptions_subscriptions","./sidebar/event_hub.js","eventHub","emitSidebarEvent"],"mappings":"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","file":"boards.24eba708768ebdc67ff6.bundle.js","sourcesContent":["webpackJsonp([\"boards\"],{\n\n/***/ \"../images/no_avatar.png\":\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAAAAAAdJSU2AAACNElEQVR4AdXYBa7jMBCA4b3/JZahzIkjp2qt+BWUWnG5ln2XxaJJb2b5F2ukL4wvzK/rP7bUcbf92u6oftLSe1ldk8efsfaVeEjusZZeC6e1RllaCk/yG6ag1lZ4WwPX69uyD6tAe/g2ipAlNMRS37awDLaFrpcMWxXQOi0jnWCWjFkSZomYJWDWKmatYNZyEWkJsvQimoZYah5NgdaLxagCtF6GRy0DshZPkeYwS/KIJWGWYjwYUzDLxCwDtJ54OKglimBLqHWahii2g1pmHLLGBmwVoRjcKlmgOdw65H5qKuGWCVi5Qlhs6m1sENZi4q3AWNvca5UYy2RjT/SAsiZey6CsIvc0wVlV5lJ0ibPMyLUGCmlxQq0IM0hLdWyro7CWEc3sXsqaK4O2zLxOsmtpfW5Q1u68ZrVmepaaNXEewawtI9X5Xl3U3n1qND6+rfPzvqoIWz/fklNCSLY153YV53J/XUxGCJnKZ1lajsn3/Ffegf6Y5pV2LUsSNL2UHzxUfh3TlYpZqqTpXZm0KZk9zJcqaEmaWPHDw0pxe05K7bWOLHFLWXVetqpYmrjle4+1y0aBaF4UOQ1NU+lYezJClkjLUnSEjqhH6zjAW4OjtY39Ibq+sawUb6W2RQfoqG0VeKuwrRJvlba17faRdbe2pTtYq6Nty/S7yAbGsQjWIq41wVoT1+IdZNy1djUcVdu5lklQWC0xHkt1X31qNEE1Pr3qKv/9XiSNj6Aaifj3/69+AYujsR/MvkpZAAAAAElFTkSuQmCC\"\n\n/***/ }),\n\n/***/ \"./boards/boards_bundle.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore__ = __webpack_require__(\"../../../node_modules/underscore/underscore.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_underscore__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_vue_resource__ = __webpack_require__(\"../../../node_modules/vue-resource/dist/vue-resource.es2015.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__flash__ = __webpack_require__(\"./flash.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__locale__ = __webpack_require__(\"./locale/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__filtered_search_boards__ = __webpack_require__(\"./boards/filtered_search_boards.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__eventhub__ = __webpack_require__(\"./boards/eventhub.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__sidebar_event_hub__ = __webpack_require__(\"./sidebar/event_hub.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__models_issue__ = __webpack_require__(\"./boards/models/issue.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__models_label__ = __webpack_require__(\"./boards/models/label.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__models_label___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9__models_label__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__models_list__ = __webpack_require__(\"./boards/models/list.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__models_milestone__ = __webpack_require__(\"./boards/models/milestone.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__models_milestone___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11__models_milestone__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__models_assignee__ = __webpack_require__(\"./boards/models/assignee.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__models_assignee___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_12__models_assignee__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__stores_boards_store__ = __webpack_require__(\"./boards/stores/boards_store.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__stores_modal_store__ = __webpack_require__(\"./boards/stores/modal_store.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__stores_modal_store___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_14__stores_modal_store__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__services_board_service__ = __webpack_require__(\"./boards/services/board_service.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__mixins_modal_mixins__ = __webpack_require__(\"./boards/mixins/modal_mixins.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__mixins_modal_mixins___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_16__mixins_modal_mixins__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__mixins_sortable_default_options__ = __webpack_require__(\"./boards/mixins/sortable_default_options.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__mixins_sortable_default_options___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_17__mixins_sortable_default_options__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__filters_due_date_filters__ = __webpack_require__(\"./boards/filters/due_date_filters.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__components_board__ = __webpack_require__(\"./boards/components/board.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__components_board_sidebar__ = __webpack_require__(\"./boards/components/board_sidebar.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__components_new_list_dropdown__ = __webpack_require__(\"./boards/components/new_list_dropdown.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__components_modal_index__ = __webpack_require__(\"./boards/components/modal/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__vue_shared_vue_resource_interceptor__ = __webpack_require__(\"./vue_shared/vue_resource_interceptor.js\");\n/* eslint-disable one-var, quote-props, comma-dangle, space-before-function-paren */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */].use(__WEBPACK_IMPORTED_MODULE_2_vue_resource__[\"a\" /* default */]);\n\n$(function () {\n  var $boardApp = document.getElementById('board-app');\n  var Store = gl.issueBoards.BoardsStore;\n  var ModalStore = gl.issueBoards.ModalStore;\n\n  window.gl = window.gl || {};\n\n  if (gl.IssueBoardsApp) {\n    gl.IssueBoardsApp.$destroy(true);\n  }\n\n  Store.create();\n\n  // hack to allow sidebar scripts like milestone_select manipulate the BoardsStore\n  gl.issueBoards.boardStoreIssueSet = function () {\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return __WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */].set.apply(__WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */], [Store.detail.issue].concat(args));\n  };\n  gl.issueBoards.boardStoreIssueDelete = function () {\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return __WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */].delete.apply(__WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */], [Store.detail.issue].concat(args));\n  };\n\n  gl.IssueBoardsApp = new __WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */]({\n    el: $boardApp,\n    components: {\n      'board': gl.issueBoards.Board,\n      'board-sidebar': gl.issueBoards.BoardSidebar,\n      'board-add-issues-modal': gl.issueBoards.IssuesModal\n    },\n    data: {\n      state: Store.state,\n      loading: true,\n      boardsEndpoint: $boardApp.dataset.boardsEndpoint,\n      listsEndpoint: $boardApp.dataset.listsEndpoint,\n      boardId: $boardApp.dataset.boardId,\n      disabled: $boardApp.dataset.disabled === 'true',\n      issueLinkBase: $boardApp.dataset.issueLinkBase,\n      rootPath: $boardApp.dataset.rootPath,\n      bulkUpdatePath: $boardApp.dataset.bulkUpdatePath,\n      detailIssue: Store.detail,\n      defaultAvatar: $boardApp.dataset.defaultAvatar\n    },\n    computed: {\n      detailIssueVisible: function detailIssueVisible() {\n        return Object.keys(this.detailIssue.issue).length;\n      }\n    },\n    created: function created() {\n      gl.boardService = new __WEBPACK_IMPORTED_MODULE_15__services_board_service__[\"a\" /* default */]({\n        boardsEndpoint: this.boardsEndpoint,\n        listsEndpoint: this.listsEndpoint,\n        bulkUpdatePath: this.bulkUpdatePath,\n        boardId: this.boardId\n      });\n      Store.rootPath = this.boardsEndpoint;\n\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$on('updateTokens', this.updateTokens);\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$on('newDetailIssue', this.updateDetailIssue);\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$on('clearDetailIssue', this.clearDetailIssue);\n      __WEBPACK_IMPORTED_MODULE_7__sidebar_event_hub__[\"a\" /* default */].$on('toggleSubscription', this.toggleSubscription);\n    },\n    beforeDestroy: function beforeDestroy() {\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$off('updateTokens', this.updateTokens);\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$off('newDetailIssue', this.updateDetailIssue);\n      __WEBPACK_IMPORTED_MODULE_6__eventhub__[\"a\" /* default */].$off('clearDetailIssue', this.clearDetailIssue);\n      __WEBPACK_IMPORTED_MODULE_7__sidebar_event_hub__[\"a\" /* default */].$off('toggleSubscription', this.toggleSubscription);\n    },\n    mounted: function mounted() {\n      var _this = this;\n\n      this.filterManager = new __WEBPACK_IMPORTED_MODULE_5__filtered_search_boards__[\"a\" /* default */](Store.filter, true);\n      this.filterManager.setup();\n\n      Store.disabled = this.disabled;\n      gl.boardService.all().then(function (response) {\n        return response.json();\n      }).then(function (resp) {\n        resp.forEach(function (board) {\n          var list = Store.addList(board, _this.defaultAvatar);\n\n          if (list.type === 'closed') {\n            list.position = Infinity;\n            list.label = { description: 'Shows all closed issues. Moving an issue to this list closes it' };\n          } else if (list.type === 'backlog') {\n            list.position = -1;\n          }\n        });\n\n        _this.state.lists = __WEBPACK_IMPORTED_MODULE_0_underscore___default.a.sortBy(_this.state.lists, 'position');\n\n        Store.addBlankState();\n        _this.loading = false;\n      }).catch(function () {\n        return new __WEBPACK_IMPORTED_MODULE_3__flash__[\"a\" /* default */]('An error occurred. Please try again.');\n      });\n    },\n\n    methods: {\n      updateTokens: function updateTokens() {\n        this.filterManager.updateTokens();\n      },\n      updateDetailIssue: function updateDetailIssue(newIssue) {\n        var sidebarInfoEndpoint = newIssue.sidebarInfoEndpoint;\n        if (sidebarInfoEndpoint && newIssue.subscribed === undefined) {\n          newIssue.setFetchingState('subscriptions', true);\n          __WEBPACK_IMPORTED_MODULE_15__services_board_service__[\"a\" /* default */].getIssueInfo(sidebarInfoEndpoint).then(function (res) {\n            return res.json();\n          }).then(function (data) {\n            newIssue.setFetchingState('subscriptions', false);\n            newIssue.updateData({\n              subscribed: data.subscribed\n            });\n          }).catch(function () {\n            newIssue.setFetchingState('subscriptions', false);\n            Object(__WEBPACK_IMPORTED_MODULE_3__flash__[\"a\" /* default */])(Object(__WEBPACK_IMPORTED_MODULE_4__locale__[\"__\"])('An error occurred while fetching sidebar data'));\n          });\n        }\n\n        Store.detail.issue = newIssue;\n      },\n      clearDetailIssue: function clearDetailIssue() {\n        Store.detail.issue = {};\n      },\n      toggleSubscription: function toggleSubscription(id) {\n        var issue = Store.detail.issue;\n        if (issue.id === id && issue.toggleSubscriptionEndpoint) {\n          issue.setFetchingState('subscriptions', true);\n          __WEBPACK_IMPORTED_MODULE_15__services_board_service__[\"a\" /* default */].toggleIssueSubscription(issue.toggleSubscriptionEndpoint).then(function () {\n            issue.setFetchingState('subscriptions', false);\n            issue.updateData({\n              subscribed: !issue.subscribed\n            });\n          }).catch(function () {\n            issue.setFetchingState('subscriptions', false);\n            Object(__WEBPACK_IMPORTED_MODULE_3__flash__[\"a\" /* default */])(Object(__WEBPACK_IMPORTED_MODULE_4__locale__[\"__\"])('An error occurred when toggling the notification subscription'));\n          });\n        }\n      }\n    }\n  });\n\n  gl.IssueBoardsSearch = new __WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */]({\n    el: document.getElementById('js-add-list'),\n    data: {\n      filters: Store.state.filters\n    },\n    mounted: function mounted() {\n      gl.issueBoards.newListDropdownInit();\n    }\n  });\n\n  gl.IssueBoardsModalAddBtn = new __WEBPACK_IMPORTED_MODULE_1_vue__[\"a\" /* default */]({\n    mixins: [gl.issueBoards.ModalMixins],\n    el: document.getElementById('js-add-issues-btn'),\n    data: function data() {\n      return {\n        modal: ModalStore.store,\n        store: Store.state\n      };\n    },\n\n    watch: {\n      disabled: function disabled() {\n        this.updateTooltip();\n      }\n    },\n    computed: {\n      disabled: function disabled() {\n        if (!this.store) {\n          return true;\n        }\n        return !this.store.lists.filter(function (list) {\n          return !list.preset;\n        }).length;\n      },\n      tooltipTitle: function tooltipTitle() {\n        if (this.disabled) {\n          return 'Please add a list to your board first';\n        }\n\n        return '';\n      }\n    },\n    methods: {\n      updateTooltip: function updateTooltip() {\n        var _this2 = this;\n\n        var $tooltip = $(this.$refs.addIssuesButton);\n\n        this.$nextTick(function () {\n          if (_this2.disabled) {\n            $tooltip.tooltip();\n          } else {\n            $tooltip.tooltip('destroy');\n          }\n        });\n      },\n      openModal: function openModal() {\n        if (!this.disabled) {\n          this.toggleModal(true);\n        }\n      }\n    },\n    mounted: function mounted() {\n      this.updateTooltip();\n    },\n\n    template: '\\n      <div class=\"board-extra-actions\">\\n        <button\\n          class=\"btn btn-create prepend-left-10\"\\n          type=\"button\"\\n          data-placement=\"bottom\"\\n          ref=\"addIssuesButton\"\\n          :class=\"{ \\'disabled\\': disabled }\"\\n          :title=\"tooltipTitle\"\\n          :aria-disabled=\"disabled\"\\n          @click=\"openModal\">\\n          \\u6DFB\\u52A0\\u95EE\\u9898\\n        </button>\\n      </div>\\n    '\n  });\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/board.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_utils_accessor__ = __webpack_require__(\"./lib/utils/accessor.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__board_list__ = __webpack_require__(\"./boards/components/board_list.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__board_blank_state__ = __webpack_require__(\"./boards/components/board_blank_state.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__board_delete__ = __webpack_require__(\"./boards/components/board_delete.js\");\n/* eslint-disable comma-dangle, space-before-function-paren, one-var */\n/* global Sortable */\n\n\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.Board = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].extend({\n  template: '#js-board-template',\n  components: {\n    boardList: __WEBPACK_IMPORTED_MODULE_2__board_list__[\"a\" /* default */],\n    'board-delete': gl.issueBoards.BoardDelete,\n    boardBlankState: __WEBPACK_IMPORTED_MODULE_3__board_blank_state__[\"a\" /* default */]\n  },\n  props: {\n    list: Object,\n    disabled: Boolean,\n    issueLinkBase: String,\n    rootPath: String,\n    boardId: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return {\n      detailIssue: Store.detail,\n      filter: Store.filter\n    };\n  },\n\n  watch: {\n    filter: {\n      handler: function handler() {\n        this.list.page = 1;\n        this.list.getIssues(true).catch(function () {\n          // TODO: handle request error\n        });\n      },\n\n      deep: true\n    },\n    detailIssue: {\n      handler: function handler() {\n        if (!Object.keys(this.detailIssue.issue).length) return;\n\n        var issue = this.list.findIssue(this.detailIssue.issue.id);\n\n        if (issue) {\n          var offsetLeft = this.$el.offsetLeft;\n          var boardsList = document.querySelectorAll('.boards-list')[0];\n          var left = boardsList.scrollLeft - offsetLeft;\n          var right = offsetLeft + this.$el.offsetWidth;\n\n          if (window.innerWidth > 768 && boardsList.classList.contains('is-compact')) {\n            // -290 here because width of boardsList is animating so therefore\n            // getting the width here is incorrect\n            // 290 is the width of the sidebar\n            right -= boardsList.offsetWidth - 290;\n          } else {\n            right -= boardsList.offsetWidth;\n          }\n\n          if (right - boardsList.scrollLeft > 0) {\n            $(boardsList).animate({\n              scrollLeft: right\n            }, this.sortableOptions.animation);\n          } else if (left > 0) {\n            $(boardsList).animate({\n              scrollLeft: offsetLeft\n            }, this.sortableOptions.animation);\n          }\n        }\n      },\n\n      deep: true\n    }\n  },\n  methods: {\n    showNewIssueForm: function showNewIssueForm() {\n      this.$refs['board-list'].showIssueForm = !this.$refs['board-list'].showIssueForm;\n    },\n    toggleExpanded: function toggleExpanded(e) {\n      if (this.list.isExpandable && !e.target.classList.contains('js-no-trigger-collapse')) {\n        this.list.isExpanded = !this.list.isExpanded;\n\n        if (__WEBPACK_IMPORTED_MODULE_1__lib_utils_accessor__[\"a\" /* default */].isLocalStorageAccessSafe()) {\n          localStorage.setItem('boards.' + this.boardId + '.' + this.list.type + '.expanded', this.list.isExpanded);\n        }\n      }\n    }\n  },\n  mounted: function mounted() {\n    var _this = this;\n\n    this.sortableOptions = gl.issueBoards.getBoardSortableDefaultOptions({\n      disabled: this.disabled,\n      group: 'boards',\n      draggable: '.is-draggable',\n      handle: '.js-board-handle',\n      onEnd: function onEnd(e) {\n        gl.issueBoards.onEnd();\n\n        if (e.newIndex !== undefined && e.oldIndex !== e.newIndex) {\n          var order = _this.sortable.toArray();\n          var list = Store.findList('id', parseInt(e.item.dataset.id, 10));\n\n          _this.$nextTick(function () {\n            Store.moveList(list, order);\n          });\n        }\n      }\n    });\n\n    this.sortable = Sortable.create(this.$el.parentNode, this.sortableOptions);\n  },\n  created: function created() {\n    if (this.list.isExpandable && __WEBPACK_IMPORTED_MODULE_1__lib_utils_accessor__[\"a\" /* default */].isLocalStorageAccessSafe()) {\n      var isCollapsed = localStorage.getItem('boards.' + this.boardId + '.' + this.list.type + '.expanded') === 'false';\n\n      this.list.isExpanded = !isCollapsed;\n    }\n  }\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/board_blank_state.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore__ = __webpack_require__(\"../../../node_modules/underscore/underscore.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_underscore__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_js_cookie__ = __webpack_require__(\"../../../node_modules/js-cookie/src/js.cookie.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_js_cookie___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_js_cookie__);\n/* global ListLabel */\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n  template: '\\n    <div class=\"board-blank-state\">\\n      <p>\\n        \\u53EA\\u9700\\u70B9\\u51FB\\u4E00\\u4E0B\\uFF0C\\u5373\\u53EF\\u5C06\\u4EE5\\u4E0B\\u9ED8\\u8BA4\\u5217\\u8868\\u6DFB\\u52A0\\u5230\\u95EE\\u9898\\u770B\\u677F\\uFF1A\\n      </p>\\n      <ul class=\"board-blank-state-list\">\\n        <li v-for=\"label in predefinedLabels\">\\n          <span\\n            class=\"label-color\"\\n            :style=\"{ backgroundColor: label.color }\">\\n          </span>\\n          {{ label.title }}\\n        </li>\\n      </ul>\\n      <p>\\n        \\u4F7F\\u7528\\u9ED8\\u8BA4\\u5217\\u8868\\u5C06\\u8BA9\\u60A8\\u80FD\\u6B63\\u786E\\u5E76\\u5145\\u5206\\u5730\\u5229\\u7528\\u60A8\\u7684\\u7684\\u95EE\\u9898\\u770B\\u677F\\u3002\\n      </p>\\n      <button\\n        class=\"btn btn-create btn-inverted btn-block\"\\n        type=\"button\"\\n        @click.stop=\"addDefaultLists\">\\n        \\u6DFB\\u52A0\\u9ED8\\u8BA4\\u5217\\u8868\\n      </button>\\n      <button\\n        class=\"btn btn-default btn-block\"\\n        type=\"button\"\\n        @click.stop=\"clearBlankState\">\\n        \\u6CA1\\u5173\\u7CFB\\uFF0C\\u6211\\u5C06\\u81EA\\u5DF1\\u521B\\u5EFA\\u5217\\u8868\\n      </button>\\n    </div>\\n  ',\n  data: function data() {\n    return {\n      predefinedLabels: [new ListLabel({ title: 'To Do', color: '#F0AD4E' }), new ListLabel({ title: 'Doing', color: '#5CB85C' })]\n    };\n  },\n\n  methods: {\n    addDefaultLists: function addDefaultLists() {\n      this.clearBlankState();\n\n      this.predefinedLabels.forEach(function (label, i) {\n        Store.addList({\n          title: label.title,\n          position: i,\n          list_type: 'label',\n          label: {\n            title: label.title,\n            color: label.color\n          }\n        });\n      });\n\n      Store.state.lists = __WEBPACK_IMPORTED_MODULE_0_underscore___default.a.sortBy(Store.state.lists, 'position');\n\n      // Save the labels\n      gl.boardService.generateDefaultLists().then(function (resp) {\n        return resp.json();\n      }).then(function (data) {\n        data.forEach(function (listObj) {\n          var list = Store.findList('title', listObj.title);\n\n          list.id = listObj.id;\n          list.label.id = listObj.label.id;\n          list.getIssues().catch(function () {\n            // TODO: handle request error\n          });\n        });\n      }).catch(function () {\n        Store.removeList(undefined, 'label');\n        __WEBPACK_IMPORTED_MODULE_1_js_cookie___default.a.remove('issue_board_welcome_hidden', {\n          path: ''\n        });\n        Store.addBlankState();\n      });\n    },\n\n    clearBlankState: Store.removeBlankState.bind(Store)\n  }\n});\n\n/***/ }),\n\n/***/ \"./boards/components/board_delete.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* eslint-disable comma-dangle, space-before-function-paren, no-alert */\n\n\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.BoardDelete = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].extend({\n  props: {\n    list: Object\n  },\n  methods: {\n    deleteBoard: function deleteBoard() {\n      $(this.$el).tooltip('hide');\n\n      if (confirm('您确定要删除这个列表?')) {\n        this.list.destroy();\n      }\n    }\n  }\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/board_list.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./boards/components/board_new_issue.js\nvar board_new_issue = __webpack_require__(\"./boards/components/board_new_issue.js\");\n\n// EXTERNAL MODULE: ./boards/components/issue_card_inner.js\nvar issue_card_inner = __webpack_require__(\"./boards/components/issue_card_inner.js\");\n\n// EXTERNAL MODULE: ./boards/eventhub.js\nvar eventhub = __webpack_require__(\"./boards/eventhub.js\");\n\n// CONCATENATED MODULE: /opt/gitlab/embedded/service/gitlab-rails/node_modules/babel-loader/lib!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=script&index=0!./boards/components/board_card.vue\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\n/* harmony default export */ var board_card = ({\n  name: 'BoardsIssueCard',\n  components: {\n    'issue-card-inner': gl.issueBoards.IssueCardInner\n  },\n  props: {\n    list: Object,\n    issue: Object,\n    issueLinkBase: String,\n    disabled: Boolean,\n    index: Number,\n    rootPath: String\n  },\n  data: function data() {\n    return {\n      showDetail: false,\n      detailIssue: Store.detail\n    };\n  },\n\n  computed: {\n    issueDetailVisible: function issueDetailVisible() {\n      return this.detailIssue.issue && this.detailIssue.issue.id === this.issue.id;\n    }\n  },\n  methods: {\n    mouseDown: function mouseDown() {\n      this.showDetail = true;\n    },\n    mouseMove: function mouseMove() {\n      this.showDetail = false;\n    },\n    showIssue: function showIssue(e) {\n      if (e.target.classList.contains('js-no-trigger')) return;\n\n      if (this.showDetail) {\n        this.showDetail = false;\n\n        if (Store.detail.issue && Store.detail.issue.id === this.issue.id) {\n          eventhub[\"a\" /* default */].$emit('clearDetailIssue');\n        } else {\n          eventhub[\"a\" /* default */].$emit('newDetailIssue', this.issue);\n          Store.detail.list = this.list;\n        }\n      }\n    }\n  }\n});\n// CONCATENATED MODULE: /opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ffbf4286\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=template&index=0!./boards/components/board_card.vue\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{staticClass:\"card\",class:{ 'user-can-drag': !_vm.disabled && _vm.issue.id, 'is-disabled': _vm.disabled || !_vm.issue.id, 'is-active': _vm.issueDetailVisible },attrs:{\"index\":_vm.index,\"data-issue-id\":_vm.issue.id},on:{\"mousedown\":_vm.mouseDown,\"mousemove\":_vm.mouseMove,\"mouseup\":function($event){_vm.showIssue($event)}}},[_c('issue-card-inner',{attrs:{\"list\":_vm.list,\"issue\":_vm.issue,\"issue-link-base\":_vm.issueLinkBase,\"root-path\":_vm.rootPath,\"update-filters\":true}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ var components_board_card = (esExports);\n// CONCATENATED MODULE: ./boards/components/board_card.vue\nvar normalizeComponent = __webpack_require__(\"../../../node_modules/vue-loader/lib/component-normalizer.js\")\n/* script */\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n  board_card,\n  components_board_card,\n  __vue_template_functional__,\n  __vue_styles__,\n  __vue_scopeId__,\n  __vue_module_identifier__\n)\n\n/* harmony default export */ var boards_components_board_card = (Component.exports);\n\n// EXTERNAL MODULE: ./vue_shared/components/loading_icon.vue + 2 modules\nvar loading_icon = __webpack_require__(\"./vue_shared/components/loading_icon.vue\");\n\n// CONCATENATED MODULE: ./boards/components/board_list.js\n/* global Sortable */\n\n\n\n\n\nvar board_list_Store = gl.issueBoards.BoardsStore;\n\n/* harmony default export */ var board_list = __webpack_exports__[\"a\"] = ({\n  name: 'BoardList',\n  props: {\n    disabled: {\n      type: Boolean,\n      required: true\n    },\n    list: {\n      type: Object,\n      required: true\n    },\n    issues: {\n      type: Array,\n      required: true\n    },\n    loading: {\n      type: Boolean,\n      required: true\n    },\n    issueLinkBase: {\n      type: String,\n      required: true\n    },\n    rootPath: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return {\n      scrollOffset: 250,\n      filters: board_list_Store.state.filters,\n      showCount: false,\n      showIssueForm: false\n    };\n  },\n\n  components: {\n    boardCard: boards_components_board_card,\n    boardNewIssue: board_new_issue[\"a\" /* default */],\n    loadingIcon: loading_icon[\"a\" /* default */]\n  },\n  methods: {\n    listHeight: function listHeight() {\n      return this.$refs.list.getBoundingClientRect().height;\n    },\n    scrollHeight: function scrollHeight() {\n      return this.$refs.list.scrollHeight;\n    },\n    scrollTop: function scrollTop() {\n      return this.$refs.list.scrollTop + this.listHeight();\n    },\n    scrollToTop: function scrollToTop() {\n      this.$refs.list.scrollTop = 0;\n    },\n    loadNextPage: function loadNextPage() {\n      var _this = this;\n\n      var getIssues = this.list.nextPage();\n      var loadingDone = function loadingDone() {\n        _this.list.loadingMore = false;\n      };\n\n      if (getIssues) {\n        this.list.loadingMore = true;\n        getIssues.then(loadingDone).catch(loadingDone);\n      }\n    },\n    toggleForm: function toggleForm() {\n      this.showIssueForm = !this.showIssueForm;\n    },\n    onScroll: function onScroll() {\n      if (!this.loadingMore && this.scrollTop() > this.scrollHeight() - this.scrollOffset) {\n        this.loadNextPage();\n      }\n    }\n  },\n  watch: {\n    filters: {\n      handler: function handler() {\n        this.list.loadingMore = false;\n        this.$refs.list.scrollTop = 0;\n      },\n\n      deep: true\n    },\n    issues: function issues() {\n      var _this2 = this;\n\n      this.$nextTick(function () {\n        if (_this2.scrollHeight() <= _this2.listHeight() && _this2.list.issuesSize > _this2.list.issues.length) {\n          _this2.list.page += 1;\n          _this2.list.getIssues(false).catch(function () {\n            // TODO: handle request error\n          });\n        }\n\n        if (_this2.scrollHeight() > Math.ceil(_this2.listHeight())) {\n          _this2.showCount = true;\n        } else {\n          _this2.showCount = false;\n        }\n      });\n    }\n  },\n  created: function created() {\n    eventhub[\"a\" /* default */].$on('hide-issue-form-' + this.list.id, this.toggleForm);\n    eventhub[\"a\" /* default */].$on('scroll-board-list-' + this.list.id, this.scrollToTop);\n  },\n  mounted: function mounted() {\n    var _this3 = this;\n\n    var options = gl.issueBoards.getBoardSortableDefaultOptions({\n      scroll: document.querySelectorAll('.boards-list')[0],\n      group: 'issues',\n      disabled: this.disabled,\n      filter: '.board-list-count, .is-disabled',\n      dataIdAttr: 'data-issue-id',\n      onStart: function onStart(e) {\n        var card = _this3.$refs.issue[e.oldIndex];\n\n        card.showDetail = false;\n        board_list_Store.moving.list = card.list;\n        board_list_Store.moving.issue = board_list_Store.moving.list.findIssue(+e.item.dataset.issueId);\n\n        gl.issueBoards.onStart();\n      },\n      onAdd: function onAdd(e) {\n        gl.issueBoards.BoardsStore.moveIssueToList(board_list_Store.moving.list, _this3.list, board_list_Store.moving.issue, e.newIndex);\n\n        _this3.$nextTick(function () {\n          e.item.remove();\n        });\n      },\n      onUpdate: function onUpdate(e) {\n        var sortedArray = _this3.sortable.toArray().filter(function (id) {\n          return id !== '-1';\n        });\n        gl.issueBoards.BoardsStore.moveIssueInList(_this3.list, board_list_Store.moving.issue, e.oldIndex, e.newIndex, sortedArray);\n      },\n      onMove: function onMove(e) {\n        return !e.related.classList.contains('board-list-count');\n      }\n    });\n\n    this.sortable = Sortable.create(this.$refs.list, options);\n\n    // Scroll event on list to load more\n    this.$refs.list.addEventListener('scroll', this.onScroll);\n  },\n  beforeDestroy: function beforeDestroy() {\n    eventhub[\"a\" /* default */].$off('hide-issue-form-' + this.list.id, this.toggleForm);\n    eventhub[\"a\" /* default */].$off('scroll-board-list-' + this.list.id, this.scrollToTop);\n    this.$refs.list.removeEventListener('scroll', this.onScroll);\n  },\n\n  template: '\\n    <div class=\"board-list-component\">\\n      <div\\n        class=\"board-list-loading text-center\"\\n        aria-label=\"Loading issues\"\\n        v-if=\"loading\">\\n        <loading-icon />\\n      </div>\\n      <board-new-issue\\n        :list=\"list\"\\n        v-if=\"list.type !== \\'closed\\' && showIssueForm\"/>\\n      <ul\\n        class=\"board-list\"\\n        v-show=\"!loading\"\\n        ref=\"list\"\\n        :data-board=\"list.id\"\\n        :class=\"{ \\'is-smaller\\': showIssueForm }\">\\n        <board-card\\n          v-for=\"(issue, index) in issues\"\\n          ref=\"issue\"\\n          :index=\"index\"\\n          :list=\"list\"\\n          :issue=\"issue\"\\n          :issue-link-base=\"issueLinkBase\"\\n          :root-path=\"rootPath\"\\n          :disabled=\"disabled\"\\n          :key=\"issue.id\" />\\n        <li\\n          class=\"board-list-count text-center\"\\n          v-if=\"showCount\"\\n          data-id=\"-1\">\\n\\n          <loading-icon\\n            v-show=\"list.loadingMore\"\\n            label=\"Loading more issues\"\\n            />\\n\\n          <span v-if=\"list.issues.length === list.issuesSize\">\\n            Showing all issues\\n          </span>\\n          <span v-else>\\n            Showing {{ list.issues.length }} of {{ list.issuesSize }} issues\\n          </span>\\n        </li>\\n      </ul>\\n    </div>\\n  '\n});\n\n/***/ }),\n\n/***/ \"./boards/components/board_new_issue.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__eventhub__ = __webpack_require__(\"./boards/eventhub.js\");\n/* global ListIssue */\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n  name: 'BoardNewIssue',\n  props: {\n    list: {\n      type: Object,\n      required: true\n    }\n  },\n  data: function data() {\n    return {\n      title: '',\n      error: false\n    };\n  },\n\n  methods: {\n    submit: function submit(e) {\n      var _this = this;\n\n      e.preventDefault();\n      if (this.title.trim() === '') return Promise.resolve();\n\n      this.error = false;\n\n      var labels = this.list.label ? [this.list.label] : [];\n      var issue = new ListIssue({\n        title: this.title,\n        labels: labels,\n        subscribed: true,\n        assignees: []\n      });\n\n      __WEBPACK_IMPORTED_MODULE_0__eventhub__[\"a\" /* default */].$emit('scroll-board-list-' + this.list.id);\n      this.cancel();\n\n      return this.list.newIssue(issue).then(function () {\n        // Need this because our jQuery very kindly disables buttons on ALL form submissions\n        $(_this.$refs.submitButton).enable();\n\n        Store.detail.issue = issue;\n        Store.detail.list = _this.list;\n      }).catch(function () {\n        // Need this because our jQuery very kindly disables buttons on ALL form submissions\n        $(_this.$refs.submitButton).enable();\n\n        // Remove the issue\n        _this.list.removeIssue(issue);\n\n        // Show error message\n        _this.error = true;\n      });\n    },\n    cancel: function cancel() {\n      this.title = '';\n      __WEBPACK_IMPORTED_MODULE_0__eventhub__[\"a\" /* default */].$emit('hide-issue-form-' + this.list.id);\n    }\n  },\n  mounted: function mounted() {\n    this.$refs.input.focus();\n  },\n\n  template: '\\n    <div class=\"card board-new-issue-form\">\\n      <form @submit=\"submit($event)\">\\n        <div class=\"flash-container\"\\n          v-if=\"error\">\\n          <div class=\"flash-alert\">\\n            \\u51FA\\u73B0\\u9519\\u8BEF\\uFF0C\\u8BF7\\u91CD\\u8BD5\\u3002\\n          </div>\\n        </div>\\n        <label class=\"label-light\"\\n          :for=\"list.id + \\'-title\\'\">\\n          \\u6807\\u9898\\n        </label>\\n        <input class=\"form-control\"\\n          type=\"text\"\\n          v-model=\"title\"\\n          ref=\"input\"\\n          autocomplete=\"off\"\\n          :id=\"list.id + \\'-title\\'\" />\\n        <div class=\"clearfix prepend-top-10\">\\n          <button class=\"btn btn-success pull-left\"\\n            type=\"submit\"\\n            :disabled=\"title === \\'\\'\"\\n            ref=\"submit-button\">\\n            \\u63D0\\u4EA4\\u95EE\\u9898\\n          </button>\\n          <button class=\"btn btn-default pull-right\"\\n            type=\"button\"\\n            @click=\"cancel\">\\n            \\u53D6\\u6D88\\n          </button>\\n        </div>\\n      </form>\\n    </div>\\n  '\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/board_sidebar.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__flash__ = __webpack_require__(\"./flash.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__ = __webpack_require__(\"./sidebar/event_hub.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__sidebar_components_assignees_assignee_title__ = __webpack_require__(\"./sidebar/components/assignees/assignee_title.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__sidebar_components_assignees_assignees__ = __webpack_require__(\"./sidebar/components/assignees/assignees.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__due_date_select__ = __webpack_require__(\"./due_date_select.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__sidebar_remove_issue__ = __webpack_require__(\"./boards/components/sidebar/remove_issue.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__issuable_context__ = __webpack_require__(\"./issuable_context.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__labels_select__ = __webpack_require__(\"./labels_select.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__sidebar_components_subscriptions_subscriptions_vue__ = __webpack_require__(\"./sidebar/components/subscriptions/subscriptions.vue\");\n/* eslint-disable comma-dangle, space-before-function-paren, no-new */\n/* global MilestoneSelect */\n/* global Sidebar */\n\n\n\n\n\n\n\n\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.BoardSidebar = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].extend({\n  props: {\n    currentUser: Object\n  },\n  data: function data() {\n    return {\n      detail: Store.detail,\n      issue: {},\n      list: {},\n      loadingAssignees: false\n    };\n  },\n\n  computed: {\n    showSidebar: function showSidebar() {\n      return Object.keys(this.issue).length;\n    },\n    milestoneTitle: function milestoneTitle() {\n      return this.issue.milestone ? this.issue.milestone.title : 'No Milestone';\n    },\n    canRemove: function canRemove() {\n      return !this.list.preset;\n    }\n  },\n  watch: {\n    detail: {\n      handler: function handler() {\n        var _this = this;\n\n        if (this.issue.id !== this.detail.issue.id) {\n          $('.block.assignee').find('input:not(.js-vue)[name=\"issue[assignee_ids][]\"]').each(function (i, el) {\n            $(el).remove();\n          });\n\n          $('.js-issue-board-sidebar', this.$el).each(function (i, el) {\n            $(el).data('glDropdown').clearMenu();\n          });\n        }\n\n        this.issue = this.detail.issue;\n        this.list = this.detail.list;\n\n        this.$nextTick(function () {\n          _this.endpoint = _this.$refs.assigneeDropdown.dataset.issueUpdate;\n        });\n      },\n\n      deep: true\n    }\n  },\n  methods: {\n    closeSidebar: function closeSidebar() {\n      this.detail.issue = {};\n    },\n    assignSelf: function assignSelf() {\n      // Notify gl dropdown that we are now assigning to current user\n      this.$refs.assigneeBlock.dispatchEvent(new Event('assignYourself'));\n\n      this.addAssignee(this.currentUser);\n      this.saveAssignees();\n    },\n    removeAssignee: function removeAssignee(a) {\n      gl.issueBoards.BoardsStore.detail.issue.removeAssignee(a);\n    },\n    addAssignee: function addAssignee(a) {\n      gl.issueBoards.BoardsStore.detail.issue.addAssignee(a);\n    },\n    removeAllAssignees: function removeAllAssignees() {\n      gl.issueBoards.BoardsStore.detail.issue.removeAllAssignees();\n    },\n    saveAssignees: function saveAssignees() {\n      var _this2 = this;\n\n      this.loadingAssignees = true;\n\n      gl.issueBoards.BoardsStore.detail.issue.update(this.endpoint).then(function () {\n        _this2.loadingAssignees = false;\n      }).catch(function () {\n        _this2.loadingAssignees = false;\n        return new __WEBPACK_IMPORTED_MODULE_1__flash__[\"a\" /* default */]('An error occurred while saving assignees');\n      });\n    }\n  },\n  created: function created() {\n    // Get events from glDropdown\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$on('sidebar.removeAssignee', this.removeAssignee);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$on('sidebar.addAssignee', this.addAssignee);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$on('sidebar.removeAllAssignees', this.removeAllAssignees);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$on('sidebar.saveAssignees', this.saveAssignees);\n  },\n  beforeDestroy: function beforeDestroy() {\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$off('sidebar.removeAssignee', this.removeAssignee);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$off('sidebar.addAssignee', this.addAssignee);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$off('sidebar.removeAllAssignees', this.removeAllAssignees);\n    __WEBPACK_IMPORTED_MODULE_2__sidebar_event_hub__[\"a\" /* default */].$off('sidebar.saveAssignees', this.saveAssignees);\n  },\n  mounted: function mounted() {\n    new __WEBPACK_IMPORTED_MODULE_7__issuable_context__[\"a\" /* default */](this.currentUser);\n    new MilestoneSelect();\n    new __WEBPACK_IMPORTED_MODULE_5__due_date_select__[\"a\" /* default */]();\n    new __WEBPACK_IMPORTED_MODULE_8__labels_select__[\"a\" /* default */]();\n    new Sidebar();\n  },\n\n  components: {\n    assigneeTitle: __WEBPACK_IMPORTED_MODULE_3__sidebar_components_assignees_assignee_title__[\"a\" /* default */],\n    assignees: __WEBPACK_IMPORTED_MODULE_4__sidebar_components_assignees_assignees__[\"a\" /* default */],\n    removeBtn: gl.issueBoards.RemoveIssueBtn,\n    subscriptions: __WEBPACK_IMPORTED_MODULE_9__sidebar_components_subscriptions_subscriptions_vue__[\"a\" /* default */]\n  }\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/issue_card_inner.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__vue_shared_components_user_avatar_user_avatar_link_vue__ = __webpack_require__(\"./vue_shared/components/user_avatar/user_avatar_link.vue\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__eventhub__ = __webpack_require__(\"./boards/eventhub.js\");\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.IssueCardInner = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].extend({\n  props: {\n    issue: {\n      type: Object,\n      required: true\n    },\n    issueLinkBase: {\n      type: String,\n      required: true\n    },\n    list: {\n      type: Object,\n      required: false,\n      default: function _default() {\n        return {};\n      }\n    },\n    rootPath: {\n      type: String,\n      required: true\n    },\n    updateFilters: {\n      type: Boolean,\n      required: false,\n      default: false\n    }\n  },\n  data: function data() {\n    return {\n      limitBeforeCounter: 3,\n      maxRender: 4,\n      maxCounter: 99\n    };\n  },\n\n  components: {\n    userAvatarLink: __WEBPACK_IMPORTED_MODULE_1__vue_shared_components_user_avatar_user_avatar_link_vue__[\"a\" /* default */]\n  },\n  computed: {\n    numberOverLimit: function numberOverLimit() {\n      return this.issue.assignees.length - this.limitBeforeCounter;\n    },\n    assigneeCounterTooltip: function assigneeCounterTooltip() {\n      return this.assigneeCounterLabel + ' more';\n    },\n    assigneeCounterLabel: function assigneeCounterLabel() {\n      if (this.numberOverLimit > this.maxCounter) {\n        return this.maxCounter + '+';\n      }\n\n      return '+' + this.numberOverLimit;\n    },\n    shouldRenderCounter: function shouldRenderCounter() {\n      if (this.issue.assignees.length <= this.maxRender) {\n        return false;\n      }\n\n      return this.issue.assignees.length > this.numberOverLimit;\n    },\n    cardUrl: function cardUrl() {\n      return this.issueLinkBase + '/' + this.issue.iid;\n    },\n    issueId: function issueId() {\n      if (this.issue.iid) {\n        return '#' + this.issue.iid;\n      }\n      return false;\n    },\n    showLabelFooter: function showLabelFooter() {\n      var _this = this;\n\n      return this.issue.labels.find(function (l) {\n        return _this.showLabel(l);\n      }) !== undefined;\n    }\n  },\n  methods: {\n    isIndexLessThanlimit: function isIndexLessThanlimit(index) {\n      return index < this.limitBeforeCounter;\n    },\n    shouldRenderAssignee: function shouldRenderAssignee(index) {\n      // Eg. maxRender is 4,\n      // Render up to all 4 assignees if there are only 4 assigness\n      // Otherwise render up to the limitBeforeCounter\n      if (this.issue.assignees.length <= this.maxRender) {\n        return index < this.maxRender;\n      }\n\n      return index < this.limitBeforeCounter;\n    },\n    assigneeUrl: function assigneeUrl(assignee) {\n      return '' + this.rootPath + assignee.username;\n    },\n    assigneeUrlTitle: function assigneeUrlTitle(assignee) {\n      return 'Assigned to ' + assignee.name;\n    },\n    avatarUrlTitle: function avatarUrlTitle(assignee) {\n      return 'Avatar for ' + assignee.name;\n    },\n    showLabel: function showLabel(label) {\n      if (!label.id) return false;\n      return true;\n    },\n    filterByLabel: function filterByLabel(label, e) {\n      if (!this.updateFilters) return;\n\n      var filterPath = gl.issueBoards.BoardsStore.filter.path.split('&');\n      var labelTitle = encodeURIComponent(label.title);\n      var param = 'label_name[]=' + labelTitle;\n      var labelIndex = filterPath.indexOf(param);\n      $(e.currentTarget).tooltip('hide');\n\n      if (labelIndex === -1) {\n        filterPath.push(param);\n      } else {\n        filterPath.splice(labelIndex, 1);\n      }\n\n      gl.issueBoards.BoardsStore.filter.path = filterPath.join('&');\n\n      Store.updateFiltersUrl();\n\n      __WEBPACK_IMPORTED_MODULE_2__eventhub__[\"a\" /* default */].$emit('updateTokens');\n    },\n    labelStyle: function labelStyle(label) {\n      return {\n        backgroundColor: label.color,\n        color: label.textColor\n      };\n    }\n  },\n  template: '\\n    <div>\\n      <div class=\"card-header\">\\n        <h4 class=\"card-title\">\\n          <i\\n            class=\"fa fa-eye-slash confidential-icon\"\\n            v-if=\"issue.confidential\"\\n            aria-hidden=\"true\"\\n          />\\n          <a\\n            class=\"js-no-trigger\"\\n            :href=\"cardUrl\"\\n            :title=\"issue.title\">{{ issue.title }}</a>\\n          <span\\n            class=\"card-number\"\\n            v-if=\"issueId\"\\n          >\\n            {{ issueId }}\\n          </span>\\n        </h4>\\n        <div class=\"card-assignee\">\\n          <user-avatar-link\\n            v-for=\"(assignee, index) in issue.assignees\"\\n            :key=\"assignee.id\"\\n            v-if=\"shouldRenderAssignee(index)\"\\n            class=\"js-no-trigger\"\\n            :link-href=\"assigneeUrl(assignee)\"\\n            :img-alt=\"avatarUrlTitle(assignee)\"\\n            :img-src=\"assignee.avatar\"\\n            :tooltip-text=\"assigneeUrlTitle(assignee)\"\\n            tooltip-placement=\"bottom\"\\n          />\\n          <span\\n            class=\"avatar-counter has-tooltip\"\\n            :title=\"assigneeCounterTooltip\"\\n            v-if=\"shouldRenderCounter\"\\n          >\\n           {{ assigneeCounterLabel }}\\n          </span>\\n        </div>\\n      </div>\\n      <div\\n        class=\"card-footer\"\\n        v-if=\"showLabelFooter\"\\n      >\\n        <button\\n          class=\"label color-label has-tooltip\"\\n          v-for=\"label in issue.labels\"\\n          type=\"button\"\\n          v-if=\"showLabel(label)\"\\n          @click=\"filterByLabel(label, $event)\"\\n          :style=\"labelStyle(label)\"\\n          :title=\"label.description\"\\n          data-container=\"body\">\\n          {{ label.title }}\\n        </button>\\n      </div>\\n    </div>\\n  '\n});\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/modal/index.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: /opt/gitlab/embedded/service/gitlab-rails/node_modules/vue/dist/vue.esm.js\nvar vue_esm = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n\n// EXTERNAL MODULE: ./boards/utils/query_data.js\nvar query_data = __webpack_require__(\"./boards/utils/query_data.js\");\n\n// EXTERNAL MODULE: ./vue_shared/components/loading_icon.vue + 2 modules\nvar loading_icon = __webpack_require__(\"./vue_shared/components/loading_icon.vue\");\n\n// EXTERNAL MODULE: ./boards/filtered_search_boards.js\nvar filtered_search_boards = __webpack_require__(\"./boards/filtered_search_boards.js\");\n\n// EXTERNAL MODULE: ./filtered_search/container.js\nvar container = __webpack_require__(\"./filtered_search/container.js\");\n\n// CONCATENATED MODULE: ./boards/components/modal/filters.js\n\n\n\n/* harmony default export */ var filters = ({\n  name: 'modal-filters',\n  props: {\n    store: {\n      type: Object,\n      required: true\n    }\n  },\n  mounted: function mounted() {\n    container[\"a\" /* default */].container = this.$el;\n\n    this.filteredSearch = new filtered_search_boards[\"a\" /* default */](this.store);\n    this.filteredSearch.setup();\n    this.filteredSearch.removeTokens();\n    this.filteredSearch.handleInputPlaceholder();\n    this.filteredSearch.toggleClearSearchButton();\n  },\n  destroyed: function destroyed() {\n    this.filteredSearch.cleanup();\n    container[\"a\" /* default */].container = document;\n    this.store.path = '';\n  },\n\n  template: '#js-board-modal-filter'\n});\n// CONCATENATED MODULE: ./boards/components/modal/tabs.js\n\n\nvar ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalTabs = vue_esm[\"a\" /* default */].extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data: function data() {\n    return ModalStore.store;\n  },\n\n  computed: {\n    selectedCount: function selectedCount() {\n      return ModalStore.selectedCount();\n    }\n  },\n  destroyed: function destroyed() {\n    this.activeTab = 'all';\n  },\n\n  template: '\\n    <div class=\"top-area prepend-top-10 append-bottom-10\">\\n      <ul class=\"nav-links issues-state-filters\">\\n        <li :class=\"{ \\'active\\': activeTab == \\'all\\' }\">\\n          <a\\n            href=\"#\"\\n            role=\"button\"\\n            @click.prevent=\"changeTab(\\'all\\')\">\\n            Open issues\\n            <span class=\"badge\">\\n              {{ issuesCount }}\\n            </span>\\n          </a>\\n        </li>\\n        <li :class=\"{ \\'active\\': activeTab == \\'selected\\' }\">\\n          <a\\n            href=\"#\"\\n            role=\"button\"\\n            @click.prevent=\"changeTab(\\'selected\\')\">\\n            Selected issues\\n            <span class=\"badge\">\\n              {{ selectedCount }}\\n            </span>\\n          </a>\\n        </li>\\n      </ul>\\n    </div>\\n  '\n});\n// CONCATENATED MODULE: ./boards/components/modal/header.js\n\n\n\n\nvar header_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalHeader = vue_esm[\"a\" /* default */].extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  props: {\n    projectId: {\n      type: Number,\n      required: true\n    },\n    milestonePath: {\n      type: String,\n      required: true\n    },\n    labelPath: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return header_ModalStore.store;\n  },\n\n  computed: {\n    selectAllText: function selectAllText() {\n      if (header_ModalStore.selectedCount() !== this.issues.length || this.issues.length === 0) {\n        return '全选';\n      }\n\n      return '取消全选';\n    },\n    showSearch: function showSearch() {\n      return this.activeTab === 'all' && !this.loading && this.issuesCount > 0;\n    }\n  },\n  methods: {\n    toggleAll: function toggleAll() {\n      this.$refs.selectAllBtn.blur();\n\n      header_ModalStore.toggleAll();\n    }\n  },\n  components: {\n    'modal-tabs': gl.issueBoards.ModalTabs,\n    modalFilters: filters\n  },\n  template: '\\n    <div>\\n      <header class=\"add-issues-header form-actions\">\\n        <h2>\\n          \\u6DFB\\u52A0\\u95EE\\u9898\\n          <button\\n            type=\"button\"\\n            class=\"close\"\\n            data-dismiss=\"modal\"\\n            aria-label=\"\\u5173\\u95ED\"\\n            @click=\"toggleModal(false)\">\\n            <span aria-hidden=\"true\">\\xD7</span>\\n          </button>\\n        </h2>\\n      </header>\\n      <modal-tabs v-if=\"!loading && issuesCount > 0\"></modal-tabs>\\n      <div\\n        class=\"add-issues-search append-bottom-10\"\\n        v-if=\"showSearch\">\\n        <modal-filters :store=\"filter\" />\\n        <button\\n          type=\"button\"\\n          class=\"btn btn-success btn-inverted prepend-left-10\"\\n          ref=\"selectAllBtn\"\\n          @click=\"toggleAll\">\\n          {{ selectAllText }}\\n        </button>\\n      </div>\\n    </div>\\n  '\n});\n// EXTERNAL MODULE: ./breakpoints.js\nvar breakpoints = __webpack_require__(\"./breakpoints.js\");\n\n// CONCATENATED MODULE: ./boards/components/modal/list.js\n/* global ListIssue */\n\n\n\n\nvar list_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalList = vue_esm[\"a\" /* default */].extend({\n  props: {\n    issueLinkBase: {\n      type: String,\n      required: true\n    },\n    rootPath: {\n      type: String,\n      required: true\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return list_ModalStore.store;\n  },\n\n  watch: {\n    activeTab: function activeTab() {\n      if (this.activeTab === 'all') {\n        list_ModalStore.purgeUnselectedIssues();\n      }\n    }\n  },\n  computed: {\n    loopIssues: function loopIssues() {\n      if (this.activeTab === 'all') {\n        return this.issues;\n      }\n\n      return this.selectedIssues;\n    },\n    groupedIssues: function groupedIssues() {\n      var _this = this;\n\n      var groups = [];\n      this.loopIssues.forEach(function (issue, i) {\n        var index = i % _this.columns;\n\n        if (!groups[index]) {\n          groups.push([]);\n        }\n\n        groups[index].push(issue);\n      });\n\n      return groups;\n    }\n  },\n  methods: {\n    scrollHandler: function scrollHandler() {\n      var currentPage = Math.floor(this.issues.length / this.perPage);\n\n      if (this.scrollTop() > this.scrollHeight() - 100 && !this.loadingNewPage && currentPage === this.page) {\n        this.loadingNewPage = true;\n        this.page += 1;\n      }\n    },\n    toggleIssue: function toggleIssue(e, issue) {\n      if (e.target.tagName !== 'A') {\n        list_ModalStore.toggleIssue(issue);\n      }\n    },\n    listHeight: function listHeight() {\n      return this.$refs.list.getBoundingClientRect().height;\n    },\n    scrollHeight: function scrollHeight() {\n      return this.$refs.list.scrollHeight;\n    },\n    scrollTop: function scrollTop() {\n      return this.$refs.list.scrollTop + this.listHeight();\n    },\n    showIssue: function showIssue(issue) {\n      if (this.activeTab === 'all') return true;\n\n      var index = list_ModalStore.selectedIssueIndex(issue);\n\n      return index !== -1;\n    },\n    setColumnCount: function setColumnCount() {\n      var breakpoint = breakpoints[\"a\" /* default */].getBreakpointSize();\n\n      if (breakpoint === 'lg' || breakpoint === 'md') {\n        this.columns = 3;\n      } else if (breakpoint === 'sm') {\n        this.columns = 2;\n      } else {\n        this.columns = 1;\n      }\n    }\n  },\n  mounted: function mounted() {\n    this.scrollHandlerWrapper = this.scrollHandler.bind(this);\n    this.setColumnCountWrapper = this.setColumnCount.bind(this);\n    this.setColumnCount();\n\n    this.$refs.list.addEventListener('scroll', this.scrollHandlerWrapper);\n    window.addEventListener('resize', this.setColumnCountWrapper);\n  },\n  beforeDestroy: function beforeDestroy() {\n    this.$refs.list.removeEventListener('scroll', this.scrollHandlerWrapper);\n    window.removeEventListener('resize', this.setColumnCountWrapper);\n  },\n\n  components: {\n    'issue-card-inner': gl.issueBoards.IssueCardInner\n  },\n  template: '\\n    <section\\n      class=\"add-issues-list add-issues-list-columns\"\\n      ref=\"list\">\\n      <div\\n        class=\"empty-state add-issues-empty-state-filter text-center\"\\n        v-if=\"issuesCount > 0 && issues.length === 0\">\\n        <div\\n          class=\"svg-content\">\\n          <img :src=\"emptyStateSvg\"/>\\n        </div>\\n        <div class=\"text-content\">\\n          <h4>\\n            There are no issues to show.\\n          </h4>\\n        </div>\\n      </div>\\n      <div\\n        v-for=\"group in groupedIssues\"\\n        class=\"add-issues-list-column\">\\n        <div\\n          v-for=\"issue in group\"\\n          v-if=\"showIssue(issue)\"\\n          class=\"card-parent\">\\n          <div\\n            class=\"card\"\\n            :class=\"{ \\'is-active\\': issue.selected }\"\\n            @click=\"toggleIssue($event, issue)\">\\n            <issue-card-inner\\n              :issue=\"issue\"\\n              :issue-link-base=\"issueLinkBase\"\\n              :root-path=\"rootPath\">\\n            </issue-card-inner>\\n            <span\\n              :aria-label=\"\\'Issue #\\' + issue.id + \\' selected\\'\"\\n              aria-checked=\"true\"\\n              v-if=\"issue.selected\"\\n              class=\"issue-card-selected text-center\">\\n              <i class=\"fa fa-check\"></i>\\n            </span>\\n          </div>\\n        </div>\\n      </div>\\n    </section>\\n  '\n});\n// EXTERNAL MODULE: ./flash.js\nvar flash = __webpack_require__(\"./flash.js\");\n\n// CONCATENATED MODULE: ./boards/components/modal/lists_dropdown.js\n\n\nvar lists_dropdown_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalFooterListsDropdown = vue_esm[\"a\" /* default */].extend({\n  data: function data() {\n    return {\n      modal: lists_dropdown_ModalStore.store,\n      state: gl.issueBoards.BoardsStore.state\n    };\n  },\n\n  computed: {\n    selected: function selected() {\n      return this.modal.selectedList || this.state.lists[1];\n    }\n  },\n  destroyed: function destroyed() {\n    this.modal.selectedList = null;\n  },\n\n  template: '\\n    <div class=\"dropdown inline\">\\n      <button\\n        class=\"dropdown-menu-toggle\"\\n        type=\"button\"\\n        data-toggle=\"dropdown\"\\n        aria-expanded=\"false\">\\n        <span\\n          class=\"dropdown-label-box\"\\n          :style=\"{ backgroundColor: selected.label.color }\">\\n        </span>\\n        {{ selected.title }}\\n        <i class=\"fa fa-chevron-down\"></i>\\n      </button>\\n      <div class=\"dropdown-menu dropdown-menu-selectable dropdown-menu-drop-up\">\\n        <ul>\\n          <li\\n            v-for=\"list in state.lists\"\\n            v-if=\"list.type == \\'label\\'\">\\n            <a\\n              href=\"#\"\\n              role=\"button\"\\n              :class=\"{ \\'is-active\\': list.id == selected.id }\"\\n              @click.prevent=\"modal.selectedList = list\">\\n              <span\\n                class=\"dropdown-label-box\"\\n                :style=\"{ backgroundColor: list.label.color }\">\\n              </span>\\n              {{ list.title }}\\n            </a>\\n          </li>\\n        </ul>\\n      </div>\\n    </div>\\n  '\n});\n// EXTERNAL MODULE: ./lib/utils/text_utility.js\nvar text_utility = __webpack_require__(\"./lib/utils/text_utility.js\");\n\n// CONCATENATED MODULE: ./boards/components/modal/footer.js\n/* eslint-disable no-new */\n\n\n\n\n\n\nvar footer_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalFooter = vue_esm[\"a\" /* default */].extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data: function data() {\n    return {\n      modal: footer_ModalStore.store,\n      state: gl.issueBoards.BoardsStore.state\n    };\n  },\n\n  computed: {\n    submitDisabled: function submitDisabled() {\n      return !footer_ModalStore.selectedCount();\n    },\n    submitText: function submitText() {\n      var count = footer_ModalStore.selectedCount();\n\n      return '\\u6DFB\\u52A0 ' + (count > 0 ? count : '') + ' ' + Object(text_utility[\"e\" /* pluralize */])('问题', count);\n    }\n  },\n  methods: {\n    addIssues: function addIssues() {\n      var firstListIndex = 1;\n      var list = this.modal.selectedList || this.state.lists[firstListIndex];\n      var selectedIssues = footer_ModalStore.getSelectedIssues();\n      var issueIds = selectedIssues.map(function (issue) {\n        return issue.id;\n      });\n\n      // Post the data to the backend\n      gl.boardService.bulkUpdate(issueIds, {\n        add_label_ids: [list.label.id]\n      }).catch(function () {\n        new flash[\"a\" /* default */]('问题更新失败,请重试。', 'alert');\n\n        selectedIssues.forEach(function (issue) {\n          list.removeIssue(issue);\n          list.issuesSize -= 1;\n        });\n      });\n\n      // Add the issues on the frontend\n      selectedIssues.forEach(function (issue) {\n        list.addIssue(issue);\n        list.issuesSize += 1;\n      });\n\n      this.toggleModal(false);\n    }\n  },\n  components: {\n    'lists-dropdown': gl.issueBoards.ModalFooterListsDropdown\n  },\n  template: '\\n    <footer\\n      class=\"form-actions add-issues-footer\">\\n      <div class=\"pull-left\">\\n        <button\\n          class=\"btn btn-success\"\\n          type=\"button\"\\n          :disabled=\"submitDisabled\"\\n          @click=\"addIssues\">\\n          {{ submitText }}\\n        </button>\\n        <span class=\"inline add-issues-footer-to-list\">\\n          \\u5230\\u5217\\u8868\\n        </span>\\n        <lists-dropdown></lists-dropdown>\\n      </div>\\n      <button\\n        class=\"btn btn-default pull-right\"\\n        type=\"button\"\\n        @click=\"toggleModal(false)\">\\n        \\u53D6\\u6D88\\n      </button>\\n    </footer>\\n  '\n});\n// CONCATENATED MODULE: ./boards/components/modal/empty_state.js\n\n\nvar empty_state_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalEmptyState = vue_esm[\"a\" /* default */].extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data: function data() {\n    return empty_state_ModalStore.store;\n  },\n\n  props: {\n    newIssuePath: {\n      type: String,\n      required: true\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true\n    }\n  },\n  computed: {\n    contents: function contents() {\n      var obj = {\n        title: '您的项目还没有添加任何的问题。',\n        content: '\\n          \\u95EE\\u9898\\u53EF\\u4EE5\\u662F\\u8981\\u8BA8\\u8BBA\\u7684Bug\\uFF0C\\u4EFB\\u52A1\\u6216\\u6982\\u5FF5\\u3002\\n          \\u6B64\\u5916\\uFF0C\\u95EE\\u9898\\u662F\\u53EF\\u641C\\u7D22\\u3001\\u53EF\\u8FC7\\u6EE4\\u7684\\u3002\\n        '\n      };\n\n      if (this.activeTab === 'selected') {\n        obj.title = '您还没有选择一个问题';\n        obj.content = '\\n          \\u8FD4\\u56DE <strong>\\u672A\\u5173\\u95ED\\u95EE\\u9898</strong> \\u5E76\\u9009\\u62E9\\u4E00\\u4E9B\\u95EE\\u9898\\n          \\u6765\\u589E\\u52A0\\u5230\\u770B\\u677F\\u3002\\n        ';\n      }\n\n      return obj;\n    }\n  },\n  template: '\\n    <section class=\"empty-state\">\\n      <div class=\"row\">\\n        <div class=\"col-xs-12 col-sm-6 col-sm-push-6\">\\n          <aside class=\"svg-content\"><img :src=\"emptyStateSvg\"/></aside>\\n        </div>\\n        <div class=\"col-xs-12 col-sm-6 col-sm-pull-6\">\\n          <div class=\"text-content\">\\n            <h4>{{ contents.title }}</h4>\\n            <p v-html=\"contents.content\"></p>\\n            <a\\n              :href=\"newIssuePath\"\\n              class=\"btn btn-success btn-inverted\"\\n              v-if=\"activeTab === \\'all\\'\">\\n              \\u65B0\\u5EFA\\u95EE\\u9898\\n            </a>\\n            <button\\n              type=\"button\"\\n              class=\"btn btn-default\"\\n              @click=\"changeTab(\\'all\\')\"\\n              v-if=\"activeTab === \\'selected\\'\">\\n              \\u672A\\u5173\\u95ED\\u95EE\\u9898\\n            </button>\\n          </div>\\n        </div>\\n      </div>\\n    </section>\\n  '\n});\n// CONCATENATED MODULE: ./boards/components/modal/index.js\n/* global ListIssue */\n\n\n\n\n\n\n\n\n\nvar modal_ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.IssuesModal = vue_esm[\"a\" /* default */].extend({\n  props: {\n    newIssuePath: {\n      type: String,\n      required: true\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true\n    },\n    issueLinkBase: {\n      type: String,\n      required: true\n    },\n    rootPath: {\n      type: String,\n      required: true\n    },\n    projectId: {\n      type: Number,\n      required: true\n    },\n    milestonePath: {\n      type: String,\n      required: true\n    },\n    labelPath: {\n      type: String,\n      required: true\n    }\n  },\n  data: function data() {\n    return modal_ModalStore.store;\n  },\n\n  watch: {\n    page: function page() {\n      this.loadIssues();\n    },\n    showAddIssuesModal: function showAddIssuesModal() {\n      var _this = this;\n\n      if (this.showAddIssuesModal && !this.issues.length) {\n        this.loading = true;\n        var loadingDone = function loadingDone() {\n          _this.loading = false;\n        };\n\n        this.loadIssues().then(loadingDone).catch(loadingDone);\n      } else if (!this.showAddIssuesModal) {\n        this.issues = [];\n        this.selectedIssues = [];\n        this.issuesCount = false;\n      }\n    },\n\n    filter: {\n      handler: function handler() {\n        var _this2 = this;\n\n        if (this.$el.tagName) {\n          this.page = 1;\n          this.filterLoading = true;\n          var loadingDone = function loadingDone() {\n            _this2.filterLoading = false;\n          };\n\n          this.loadIssues(true).then(loadingDone).catch(loadingDone);\n        }\n      },\n\n      deep: true\n    }\n  },\n  methods: {\n    loadIssues: function loadIssues() {\n      var _this3 = this;\n\n      var clearIssues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (!this.showAddIssuesModal) return false;\n\n      return gl.boardService.getBacklog(Object(query_data[\"a\" /* default */])(this.filter.path, {\n        page: this.page,\n        per: this.perPage\n      })).then(function (resp) {\n        return resp.json();\n      }).then(function (data) {\n        if (clearIssues) {\n          _this3.issues = [];\n        }\n\n        data.issues.forEach(function (issueObj) {\n          var issue = new ListIssue(issueObj);\n          var foundSelectedIssue = modal_ModalStore.findSelectedIssue(issue);\n          issue.selected = !!foundSelectedIssue;\n\n          _this3.issues.push(issue);\n        });\n\n        _this3.loadingNewPage = false;\n\n        if (!_this3.issuesCount) {\n          _this3.issuesCount = data.size;\n        }\n      }).catch(function () {\n        // TODO: handle request error\n      });\n    }\n  },\n  computed: {\n    showList: function showList() {\n      if (this.activeTab === 'selected') {\n        return this.selectedIssues.length > 0;\n      }\n\n      return this.issuesCount > 0;\n    },\n    showEmptyState: function showEmptyState() {\n      if (!this.loading && this.issuesCount === 0) {\n        return true;\n      }\n\n      return this.activeTab === 'selected' && this.selectedIssues.length === 0;\n    }\n  },\n  created: function created() {\n    this.page = 1;\n  },\n\n  components: {\n    'modal-header': gl.issueBoards.ModalHeader,\n    'modal-list': gl.issueBoards.ModalList,\n    'modal-footer': gl.issueBoards.ModalFooter,\n    'empty-state': gl.issueBoards.ModalEmptyState,\n    loadingIcon: loading_icon[\"a\" /* default */]\n  },\n  template: '\\n    <div\\n      class=\"add-issues-modal\"\\n      v-if=\"showAddIssuesModal\">\\n      <div class=\"add-issues-container\">\\n        <modal-header\\n          :project-id=\"projectId\"\\n          :milestone-path=\"milestonePath\"\\n          :label-path=\"labelPath\">\\n        </modal-header>\\n        <modal-list\\n          :issue-link-base=\"issueLinkBase\"\\n          :root-path=\"rootPath\"\\n          :empty-state-svg=\"emptyStateSvg\"\\n          v-if=\"!loading && showList && !filterLoading\"></modal-list>\\n        <empty-state\\n          v-if=\"showEmptyState\"\\n          :new-issue-path=\"newIssuePath\"\\n          :empty-state-svg=\"emptyStateSvg\"></empty-state>\\n        <section\\n          class=\"add-issues-list text-center\"\\n          v-if=\"loading || filterLoading\">\\n          <div class=\"add-issues-list-loading\">\\n            <loading-icon />\\n          </div>\\n        </section>\\n        <modal-footer></modal-footer>\\n      </div>\\n    </div>\\n  '\n});\n\n/***/ }),\n\n/***/ \"./boards/components/new_list_dropdown.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore__ = __webpack_require__(\"../../../node_modules/underscore/underscore.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_underscore__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__create_label__ = __webpack_require__(\"./create_label.js\");\n/* eslint-disable func-names, no-new, space-before-function-paren, one-var,\n   promise/catch-or-return */\n\n\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\nvar Store = gl.issueBoards.BoardsStore;\n\n$(document).off('created.label').on('created.label', function (e, label) {\n  Store.new({\n    title: label.title,\n    position: Store.state.lists.length - 2,\n    list_type: 'label',\n    label: {\n      id: label.id,\n      title: label.title,\n      color: label.color\n    }\n  });\n});\n\ngl.issueBoards.newListDropdownInit = function () {\n  $('.js-new-board-list').each(function () {\n    var $this = $(this);\n    new __WEBPACK_IMPORTED_MODULE_1__create_label__[\"a\" /* default */]($this.closest('.dropdown').find('.dropdown-new-label'), $this.data('namespace-path'), $this.data('project-path'));\n\n    $this.glDropdown({\n      data: function data(term, callback) {\n        $.get($this.attr('data-list-labels-path')).then(function (resp) {\n          callback(resp);\n        });\n      },\n      renderRow: function renderRow(label) {\n        var active = Store.findList('title', label.title);\n        var $li = $('<li />');\n        var $a = $('<a />', {\n          class: active ? 'is-active js-board-list-' + active.id : '',\n          text: label.title,\n          href: '#'\n        });\n        var $labelColor = $('<span />', {\n          class: 'dropdown-label-box',\n          style: 'background-color: ' + label.color\n        });\n\n        return $li.append($a.prepend($labelColor));\n      },\n\n      search: {\n        fields: ['title']\n      },\n      filterable: true,\n      selectable: true,\n      multiSelect: true,\n      clicked: function clicked(options) {\n        var e = options.e;\n\n        var label = options.selectedObj;\n        e.preventDefault();\n\n        if (!Store.findList('title', label.title)) {\n          Store.new({\n            title: label.title,\n            position: Store.state.lists.length - 2,\n            list_type: 'label',\n            label: {\n              id: label.id,\n              title: label.title,\n              color: label.color\n            }\n          });\n\n          Store.state.lists = __WEBPACK_IMPORTED_MODULE_0_underscore___default.a.sortBy(Store.state.lists, 'position');\n        }\n      }\n    });\n  });\n};\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/components/sidebar/remove_issue.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__flash__ = __webpack_require__(\"./flash.js\");\n/* eslint-disable no-new */\n\n\n\n\nvar Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.RemoveIssueBtn = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].extend({\n  props: {\n    issue: {\n      type: Object,\n      required: true\n    },\n    list: {\n      type: Object,\n      required: true\n    },\n    issueUpdate: {\n      type: String,\n      required: true\n    }\n  },\n  computed: {\n    updateUrl: function updateUrl() {\n      return this.issueUpdate;\n    }\n  },\n  methods: {\n    removeIssue: function removeIssue() {\n      var issue = this.issue;\n      var lists = issue.getLists();\n      var listLabelIds = lists.map(function (list) {\n        return list.label.id;\n      });\n      var labelIds = this.issue.labels.map(function (label) {\n        return label.id;\n      }).filter(function (id) {\n        return !listLabelIds.includes(id);\n      });\n      if (labelIds.length === 0) {\n        labelIds = [''];\n      }\n      var data = {\n        issue: {\n          label_ids: labelIds\n        }\n      };\n      __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].http.patch(this.updateUrl, data).catch(function () {\n        new __WEBPACK_IMPORTED_MODULE_1__flash__[\"a\" /* default */]('Failed to remove issue from board, please try again.', 'alert');\n\n        lists.forEach(function (list) {\n          list.addIssue(issue);\n        });\n      });\n\n      // Remove from the frontend store\n      lists.forEach(function (list) {\n        list.removeIssue(issue);\n      });\n\n      Store.detail.issue = {};\n    }\n  },\n  template: '\\n    <div\\n      class=\"block list\">\\n      <button\\n        class=\"btn btn-default btn-block\"\\n        type=\"button\"\\n        @click=\"removeIssue\">\\n        Remove from board\\n      </button>\\n    </div>\\n  '\n});\n\n/***/ }),\n\n/***/ \"./boards/eventhub.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (new __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */]());\n\n/***/ }),\n\n/***/ \"./boards/filtered_search_boards.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__filtered_search_container__ = __webpack_require__(\"./filtered_search/container.js\");\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable class-methods-use-this */\n\n\nvar FilteredSearchBoards = function (_gl$FilteredSearchMan) {\n  _inherits(FilteredSearchBoards, _gl$FilteredSearchMan);\n\n  function FilteredSearchBoards(store) {\n    var updateUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    var cantEdit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n    _classCallCheck(this, FilteredSearchBoards);\n\n    var _this = _possibleConstructorReturn(this, (FilteredSearchBoards.__proto__ || Object.getPrototypeOf(FilteredSearchBoards)).call(this, 'boards'));\n\n    _this.store = store;\n    _this.updateUrl = updateUrl;\n\n    // Issue boards is slightly different, we handle all the requests async\n    // instead or reloading the page, we just re-fire the list ajax requests\n    _this.isHandledAsync = true;\n    _this.cantEdit = cantEdit.filter(function (i) {\n      return typeof i === 'string';\n    });\n    _this.cantEditWithValue = cantEdit.filter(function (i) {\n      return (typeof i === 'undefined' ? 'undefined' : _typeof(i)) === 'object';\n    });\n    return _this;\n  }\n\n  _createClass(FilteredSearchBoards, [{\n    key: 'updateObject',\n    value: function updateObject(path) {\n      this.store.path = path.substr(1);\n\n      if (this.updateUrl) {\n        gl.issueBoards.BoardsStore.updateFiltersUrl();\n      }\n    }\n  }, {\n    key: 'removeTokens',\n    value: function removeTokens() {\n      var tokens = __WEBPACK_IMPORTED_MODULE_0__filtered_search_container__[\"a\" /* default */].container.querySelectorAll('.js-visual-token');\n\n      // Remove all the tokens as they will be replaced by the search manager\n      [].forEach.call(tokens, function (el) {\n        el.parentNode.removeChild(el);\n      });\n\n      this.filteredSearchInput.value = '';\n    }\n  }, {\n    key: 'updateTokens',\n    value: function updateTokens() {\n      this.removeTokens();\n\n      this.loadSearchParamsFromURL();\n\n      // Get the placeholder back if search is empty\n      this.filteredSearchInput.dispatchEvent(new Event('input'));\n    }\n  }, {\n    key: 'canEdit',\n    value: function canEdit(tokenName, tokenValue) {\n      if (this.cantEdit.includes(tokenName)) return false;\n      return this.cantEditWithValue.findIndex(function (token) {\n        return token.name === tokenName && token.value === tokenValue;\n      }) === -1;\n    }\n  }]);\n\n  return FilteredSearchBoards;\n}(gl.FilteredSearchManager);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (FilteredSearchBoards);\n\n/***/ }),\n\n/***/ \"./boards/filters/due_date_filters.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n/* global dateFormat */\n\n\n\n__WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].filter('due-date', function (value) {\n  var date = new Date(value);\n  return dateFormat(date, 'mmm d, yyyy', true);\n});\n\n/***/ }),\n\n/***/ \"./boards/mixins/modal_mixins.js\":\n/***/ (function(module, exports) {\n\nvar ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalMixins = {\n  methods: {\n    toggleModal: function toggleModal(toggle) {\n      ModalStore.store.showAddIssuesModal = toggle;\n    },\n    changeTab: function changeTab(tab) {\n      ModalStore.store.activeTab = tab;\n    }\n  }\n};\n\n/***/ }),\n\n/***/ \"./boards/mixins/sortable_default_options.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function($) {/* eslint-disable no-unused-vars, no-mixed-operators, comma-dangle */\n/* global DocumentTouch */\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.onStart = function () {\n  $('.has-tooltip').tooltip('hide').tooltip('disable');\n  document.body.classList.add('is-dragging');\n};\n\ngl.issueBoards.onEnd = function () {\n  $('.has-tooltip').tooltip('enable');\n  document.body.classList.remove('is-dragging');\n};\n\ngl.issueBoards.touchEnabled = 'ontouchstart' in window || window.DocumentTouch && document instanceof DocumentTouch;\n\ngl.issueBoards.getBoardSortableDefaultOptions = function (obj) {\n  var defaultSortOptions = {\n    animation: 200,\n    forceFallback: true,\n    fallbackClass: 'is-dragging',\n    fallbackOnBody: true,\n    ghostClass: 'is-ghost',\n    filter: '.board-delete, .btn',\n    delay: gl.issueBoards.touchEnabled ? 100 : 0,\n    scrollSensitivity: gl.issueBoards.touchEnabled ? 60 : 100,\n    scrollSpeed: 20,\n    onStart: gl.issueBoards.onStart,\n    onEnd: gl.issueBoards.onEnd\n  };\n\n  Object.keys(obj).forEach(function (key) {\n    defaultSortOptions[key] = obj[key];\n  });\n  return defaultSortOptions;\n};\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/models/assignee.js\":\n/***/ (function(module, exports) {\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable no-unused-vars */\n\nvar ListAssignee = function ListAssignee(user, defaultAvatar) {\n  _classCallCheck(this, ListAssignee);\n\n  this.id = user.id;\n  this.name = user.name;\n  this.username = user.username;\n  this.avatar = user.avatar_url || defaultAvatar;\n};\n\nwindow.ListAssignee = ListAssignee;\n\n/***/ }),\n\n/***/ \"./boards/models/issue.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable no-unused-vars, space-before-function-paren, arrow-body-style, arrow-parens, comma-dangle, max-len */\n/* global ListLabel */\n/* global ListMilestone */\n/* global ListAssignee */\n\n\n\nvar ListIssue = function () {\n  function ListIssue(obj, defaultAvatar) {\n    var _this = this;\n\n    _classCallCheck(this, ListIssue);\n\n    this.id = obj.id;\n    this.iid = obj.iid;\n    this.title = obj.title;\n    this.confidential = obj.confidential;\n    this.dueDate = obj.due_date;\n    this.subscribed = obj.subscribed;\n    this.labels = [];\n    this.assignees = [];\n    this.selected = false;\n    this.position = obj.relative_position || Infinity;\n    this.isFetching = {\n      subscriptions: true\n    };\n    this.isLoading = {};\n    this.sidebarInfoEndpoint = obj.issue_sidebar_endpoint;\n    this.toggleSubscriptionEndpoint = obj.toggle_subscription_endpoint;\n\n    if (obj.milestone) {\n      this.milestone = new ListMilestone(obj.milestone);\n    }\n\n    obj.labels.forEach(function (label) {\n      _this.labels.push(new ListLabel(label));\n    });\n\n    this.assignees = obj.assignees.map(function (a) {\n      return new ListAssignee(a, defaultAvatar);\n    });\n  }\n\n  _createClass(ListIssue, [{\n    key: 'addLabel',\n    value: function addLabel(label) {\n      if (!this.findLabel(label)) {\n        this.labels.push(new ListLabel(label));\n      }\n    }\n  }, {\n    key: 'findLabel',\n    value: function findLabel(_findLabel) {\n      return this.labels.filter(function (label) {\n        return label.title === _findLabel.title;\n      })[0];\n    }\n  }, {\n    key: 'removeLabel',\n    value: function removeLabel(_removeLabel) {\n      if (_removeLabel) {\n        this.labels = this.labels.filter(function (label) {\n          return _removeLabel.title !== label.title;\n        });\n      }\n    }\n  }, {\n    key: 'removeLabels',\n    value: function removeLabels(labels) {\n      labels.forEach(this.removeLabel.bind(this));\n    }\n  }, {\n    key: 'addAssignee',\n    value: function addAssignee(assignee) {\n      if (!this.findAssignee(assignee)) {\n        this.assignees.push(new ListAssignee(assignee));\n      }\n    }\n  }, {\n    key: 'findAssignee',\n    value: function findAssignee(_findAssignee) {\n      return this.assignees.filter(function (assignee) {\n        return assignee.id === _findAssignee.id;\n      })[0];\n    }\n  }, {\n    key: 'removeAssignee',\n    value: function removeAssignee(_removeAssignee) {\n      if (_removeAssignee) {\n        this.assignees = this.assignees.filter(function (assignee) {\n          return assignee.id !== _removeAssignee.id;\n        });\n      }\n    }\n  }, {\n    key: 'removeAllAssignees',\n    value: function removeAllAssignees() {\n      this.assignees = [];\n    }\n  }, {\n    key: 'getLists',\n    value: function getLists() {\n      var _this2 = this;\n\n      return gl.issueBoards.BoardsStore.state.lists.filter(function (list) {\n        return list.findIssue(_this2.id);\n      });\n    }\n  }, {\n    key: 'updateData',\n    value: function updateData(newData) {\n      Object.assign(this, newData);\n    }\n  }, {\n    key: 'setFetchingState',\n    value: function setFetchingState(key, value) {\n      this.isFetching[key] = value;\n    }\n  }, {\n    key: 'setLoadingState',\n    value: function setLoadingState(key, value) {\n      this.isLoading[key] = value;\n    }\n  }, {\n    key: 'update',\n    value: function update(url) {\n      var data = {\n        issue: {\n          milestone_id: this.milestone ? this.milestone.id : null,\n          due_date: this.dueDate,\n          assignee_ids: this.assignees.length > 0 ? this.assignees.map(function (u) {\n            return u.id;\n          }) : [0],\n          label_ids: this.labels.map(function (label) {\n            return label.id;\n          })\n        }\n      };\n\n      if (!data.issue.label_ids.length) {\n        data.issue.label_ids = [''];\n      }\n\n      return __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].http.patch(url, data);\n    }\n  }]);\n\n  return ListIssue;\n}();\n\nwindow.ListIssue = ListIssue;\n\n/***/ }),\n\n/***/ \"./boards/models/label.js\":\n/***/ (function(module, exports) {\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable no-unused-vars, space-before-function-paren */\n\nvar ListLabel = function ListLabel(obj) {\n  _classCallCheck(this, ListLabel);\n\n  this.id = obj.id;\n  this.title = obj.title;\n  this.type = obj.type;\n  this.color = obj.color;\n  this.textColor = obj.text_color;\n  this.description = obj.description;\n  this.priority = obj.priority !== null ? obj.priority : Infinity;\n};\n\nwindow.ListLabel = ListLabel;\n\n/***/ }),\n\n/***/ \"./boards/models/list.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_query_data__ = __webpack_require__(\"./boards/utils/query_data.js\");\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable space-before-function-paren, no-underscore-dangle, class-methods-use-this, consistent-return, no-shadow, no-param-reassign, max-len, no-unused-vars */\n/* global ListIssue */\n/* global ListLabel */\n\n\nvar PER_PAGE = 20;\n\nvar List = function () {\n  function List(obj, defaultAvatar) {\n    _classCallCheck(this, List);\n\n    this.id = obj.id;\n    this._uid = this.guid();\n    this.position = obj.position;\n    this.title = obj.title;\n    this.type = obj.list_type;\n    this.preset = ['backlog', 'closed', 'blank'].indexOf(this.type) > -1;\n    this.isExpandable = ['backlog', 'closed'].indexOf(this.type) > -1;\n    this.isExpanded = true;\n    this.page = 1;\n    this.loading = true;\n    this.loadingMore = false;\n    this.issues = [];\n    this.issuesSize = 0;\n    this.defaultAvatar = defaultAvatar;\n\n    if (obj.label) {\n      this.label = new ListLabel(obj.label);\n    }\n\n    if (this.type !== 'blank' && this.id) {\n      this.getIssues().catch(function () {\n        // TODO: handle request error\n      });\n    }\n  }\n\n  _createClass(List, [{\n    key: 'guid',\n    value: function guid() {\n      var s4 = function s4() {\n        return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n      };\n      return '' + s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n    }\n  }, {\n    key: 'save',\n    value: function save() {\n      var _this = this;\n\n      return gl.boardService.createList(this.label.id).then(function (resp) {\n        return resp.json();\n      }).then(function (data) {\n        _this.id = data.id;\n        _this.type = data.list_type;\n        _this.position = data.position;\n\n        return _this.getIssues();\n      });\n    }\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      var index = gl.issueBoards.BoardsStore.state.lists.indexOf(this);\n      gl.issueBoards.BoardsStore.state.lists.splice(index, 1);\n      gl.issueBoards.BoardsStore.updateNewListDropdown(this.id);\n\n      gl.boardService.destroyList(this.id).catch(function () {\n        // TODO: handle request error\n      });\n    }\n  }, {\n    key: 'update',\n    value: function update() {\n      gl.boardService.updateList(this.id, this.position).catch(function () {\n        // TODO: handle request error\n      });\n    }\n  }, {\n    key: 'nextPage',\n    value: function nextPage() {\n      if (this.issuesSize > this.issues.length) {\n        if (this.issues.length / PER_PAGE >= 1) {\n          this.page += 1;\n        }\n\n        return this.getIssues(false);\n      }\n    }\n  }, {\n    key: 'getIssues',\n    value: function getIssues() {\n      var _this2 = this;\n\n      var emptyIssues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      var data = Object(__WEBPACK_IMPORTED_MODULE_0__utils_query_data__[\"a\" /* default */])(gl.issueBoards.BoardsStore.filter.path, { page: this.page });\n\n      if (this.label && data.label_name) {\n        data.label_name = data.label_name.filter(function (label) {\n          return label !== _this2.label.title;\n        });\n      }\n\n      if (emptyIssues) {\n        this.loading = true;\n      }\n\n      return gl.boardService.getIssuesForList(this.id, data).then(function (resp) {\n        return resp.json();\n      }).then(function (data) {\n        _this2.loading = false;\n        _this2.issuesSize = data.size;\n\n        if (emptyIssues) {\n          _this2.issues = [];\n        }\n\n        _this2.createIssues(data.issues);\n      });\n    }\n  }, {\n    key: 'newIssue',\n    value: function newIssue(issue) {\n      var _this3 = this;\n\n      this.addIssue(issue, null, 0);\n      this.issuesSize += 1;\n\n      return gl.boardService.newIssue(this.id, issue).then(function (resp) {\n        return resp.json();\n      }).then(function (data) {\n        issue.id = data.id;\n        issue.iid = data.iid;\n        issue.project = data.project;\n\n        if (_this3.issuesSize > 1) {\n          var moveBeforeId = _this3.issues[1].id;\n          gl.boardService.moveIssue(issue.id, null, null, null, moveBeforeId);\n        }\n      });\n    }\n  }, {\n    key: 'createIssues',\n    value: function createIssues(data) {\n      var _this4 = this;\n\n      data.forEach(function (issueObj) {\n        _this4.addIssue(new ListIssue(issueObj, _this4.defaultAvatar));\n      });\n    }\n  }, {\n    key: 'addIssue',\n    value: function addIssue(issue, listFrom, newIndex) {\n      var moveBeforeId = null;\n      var moveAfterId = null;\n\n      if (!this.findIssue(issue.id)) {\n        if (newIndex !== undefined) {\n          this.issues.splice(newIndex, 0, issue);\n\n          if (this.issues[newIndex - 1]) {\n            moveBeforeId = this.issues[newIndex - 1].id;\n          }\n\n          if (this.issues[newIndex + 1]) {\n            moveAfterId = this.issues[newIndex + 1].id;\n          }\n        } else {\n          this.issues.push(issue);\n        }\n\n        if (this.label) {\n          issue.addLabel(this.label);\n        }\n\n        if (listFrom) {\n          this.issuesSize += 1;\n\n          this.updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId);\n        }\n      }\n    }\n  }, {\n    key: 'moveIssue',\n    value: function moveIssue(issue, oldIndex, newIndex, moveBeforeId, moveAfterId) {\n      this.issues.splice(oldIndex, 1);\n      this.issues.splice(newIndex, 0, issue);\n\n      gl.boardService.moveIssue(issue.id, null, null, moveBeforeId, moveAfterId).catch(function () {\n        // TODO: handle request error\n      });\n    }\n  }, {\n    key: 'updateIssueLabel',\n    value: function updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId) {\n      gl.boardService.moveIssue(issue.id, listFrom.id, this.id, moveBeforeId, moveAfterId).catch(function () {\n        // TODO: handle request error\n      });\n    }\n  }, {\n    key: 'findIssue',\n    value: function findIssue(id) {\n      return this.issues.find(function (issue) {\n        return issue.id === id;\n      });\n    }\n  }, {\n    key: 'removeIssue',\n    value: function removeIssue(_removeIssue) {\n      var _this5 = this;\n\n      this.issues = this.issues.filter(function (issue) {\n        var matchesRemove = _removeIssue.id === issue.id;\n\n        if (matchesRemove) {\n          _this5.issuesSize -= 1;\n          issue.removeLabel(_this5.label);\n        }\n\n        return !matchesRemove;\n      });\n    }\n  }]);\n\n  return List;\n}();\n\nwindow.List = List;\n\n/***/ }),\n\n/***/ \"./boards/models/milestone.js\":\n/***/ (function(module, exports) {\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable no-unused-vars */\n\nvar ListMilestone = function ListMilestone(obj) {\n  _classCallCheck(this, ListMilestone);\n\n  this.id = obj.id;\n  this.title = obj.title;\n};\n\nwindow.ListMilestone = ListMilestone;\n\n/***/ }),\n\n/***/ \"./boards/services/board_service.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint-disable space-before-function-paren, comma-dangle, no-param-reassign, camelcase, max-len, no-unused-vars */\n\n\n\nvar BoardService = function () {\n  function BoardService(_ref) {\n    var boardsEndpoint = _ref.boardsEndpoint,\n        listsEndpoint = _ref.listsEndpoint,\n        bulkUpdatePath = _ref.bulkUpdatePath,\n        boardId = _ref.boardId;\n\n    _classCallCheck(this, BoardService);\n\n    this.boards = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].resource(boardsEndpoint + '{/id}.json', {}, {\n      issues: {\n        method: 'GET',\n        url: gon.relative_url_root + '/-/boards/' + boardId + '/issues.json'\n      }\n    });\n    this.lists = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].resource(listsEndpoint + '{/id}', {}, {\n      generate: {\n        method: 'POST',\n        url: listsEndpoint + '/generate.json'\n      }\n    });\n    this.issue = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].resource(gon.relative_url_root + '/-/boards/' + boardId + '/issues{/id}', {});\n    this.issues = __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].resource(listsEndpoint + '{/id}/issues', {}, {\n      bulkUpdate: {\n        method: 'POST',\n        url: bulkUpdatePath\n      }\n    });\n  }\n\n  _createClass(BoardService, [{\n    key: 'all',\n    value: function all() {\n      return this.lists.get();\n    }\n  }, {\n    key: 'generateDefaultLists',\n    value: function generateDefaultLists() {\n      return this.lists.generate({});\n    }\n  }, {\n    key: 'createList',\n    value: function createList(label_id) {\n      return this.lists.save({}, {\n        list: {\n          label_id: label_id\n        }\n      });\n    }\n  }, {\n    key: 'updateList',\n    value: function updateList(id, position) {\n      return this.lists.update({ id: id }, {\n        list: {\n          position: position\n        }\n      });\n    }\n  }, {\n    key: 'destroyList',\n    value: function destroyList(id) {\n      return this.lists.delete({ id: id });\n    }\n  }, {\n    key: 'getIssuesForList',\n    value: function getIssuesForList(id) {\n      var filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var data = { id: id };\n      Object.keys(filter).forEach(function (key) {\n        data[key] = filter[key];\n      });\n\n      return this.issues.get(data);\n    }\n  }, {\n    key: 'moveIssue',\n    value: function moveIssue(id) {\n      var from_list_id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      var to_list_id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n      var move_before_id = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n      var move_after_id = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n      return this.issue.update({ id: id }, {\n        from_list_id: from_list_id,\n        to_list_id: to_list_id,\n        move_before_id: move_before_id,\n        move_after_id: move_after_id\n      });\n    }\n  }, {\n    key: 'newIssue',\n    value: function newIssue(id, issue) {\n      return this.issues.save({ id: id }, {\n        issue: issue\n      });\n    }\n  }, {\n    key: 'getBacklog',\n    value: function getBacklog(data) {\n      return this.boards.issues(data);\n    }\n  }, {\n    key: 'bulkUpdate',\n    value: function bulkUpdate(issueIds) {\n      var extraData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var data = {\n        update: Object.assign(extraData, {\n          issuable_ids: issueIds.join(',')\n        })\n      };\n\n      return this.issues.bulkUpdate(data);\n    }\n  }], [{\n    key: 'getIssueInfo',\n    value: function getIssueInfo(endpoint) {\n      return __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].http.get(endpoint);\n    }\n  }, {\n    key: 'toggleIssueSubscription',\n    value: function toggleIssueSubscription(endpoint) {\n      return __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */].http.post(endpoint);\n    }\n  }]);\n\n  return BoardService;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (BoardService);\n\n\nwindow.BoardService = BoardService;\n\n/***/ }),\n\n/***/ \"./boards/stores/boards_store.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore__ = __webpack_require__(\"../../../node_modules/underscore/underscore.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_underscore___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_underscore__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_js_cookie__ = __webpack_require__(\"../../../node_modules/js-cookie/src/js.cookie.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_js_cookie___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_js_cookie__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__lib_utils_common_utils__ = __webpack_require__(\"./lib/utils/common_utils.js\");\n/* eslint-disable comma-dangle, space-before-function-paren, one-var, no-shadow, dot-notation, max-len */\n/* global List */\n\n\n\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.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: function create() {\n    this.state.lists = [];\n    this.filter.path = Object(__WEBPACK_IMPORTED_MODULE_2__lib_utils_common_utils__[\"k\" /* getUrlParamsArray */])().join('&');\n    this.detail = {\n      issue: {}\n    };\n  },\n  addList: function addList(listObj, defaultAvatar) {\n    var list = new List(listObj, defaultAvatar);\n    this.state.lists.push(list);\n\n    return list;\n  },\n  new: function _new(listObj) {\n    var _this = this;\n\n    var list = this.addList(listObj);\n    var backlogList = this.findList('type', 'backlog', 'backlog');\n\n    list.save().then(function () {\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 = __WEBPACK_IMPORTED_MODULE_0_underscore___default.a.sortBy(_this.state.lists, 'position');\n    }).catch(function () {\n      // https://gitlab.com/gitlab-org/gitlab-ce/issues/30821\n    });\n    this.removeBlankState();\n  },\n  updateNewListDropdown: function updateNewListDropdown(listId) {\n    $('.js-board-list-' + listId).removeClass('is-active');\n  },\n  shouldAddBlankState: function shouldAddBlankState() {\n    // Decide whether to add the blank state\n    return !this.state.lists.filter(function (list) {\n      return list.type !== 'backlog' && list.type !== 'closed';\n    })[0];\n  },\n  addBlankState: function addBlankState() {\n    if (!this.shouldAddBlankState() || this.welcomeIsHidden() || this.disabled) return;\n\n    this.addList({\n      id: 'blank',\n      list_type: 'blank',\n      title: '欢迎来到您的问题看板!',\n      position: 0\n    });\n\n    this.state.lists = __WEBPACK_IMPORTED_MODULE_0_underscore___default.a.sortBy(this.state.lists, 'position');\n  },\n  removeBlankState: function removeBlankState() {\n    this.removeList('blank');\n\n    __WEBPACK_IMPORTED_MODULE_1_js_cookie___default.a.set('issue_board_welcome_hidden', 'true', {\n      expires: 365 * 10,\n      path: ''\n    });\n  },\n  welcomeIsHidden: function welcomeIsHidden() {\n    return __WEBPACK_IMPORTED_MODULE_1_js_cookie___default.a.get('issue_board_welcome_hidden') === 'true';\n  },\n  removeList: function removeList(id) {\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'blank';\n\n    var list = this.findList('id', id, type);\n\n    if (!list) return;\n\n    this.state.lists = this.state.lists.filter(function (list) {\n      return list.id !== id;\n    });\n  },\n  moveList: function moveList(listFrom, orderLists) {\n    var _this2 = this;\n\n    orderLists.forEach(function (id, i) {\n      var list = _this2.findList('id', parseInt(id, 10));\n\n      list.position = i;\n    });\n    listFrom.update();\n  },\n  moveIssueToList: function moveIssueToList(listFrom, listTo, issue, newIndex) {\n    var issueTo = listTo.findIssue(issue.id);\n    var issueLists = issue.getLists();\n    var listLabels = issueLists.map(function (listIssue) {\n      return listIssue.label;\n    });\n\n    if (!issueTo) {\n      // Add to new lists issues if it doesn't already exist\n      listTo.addIssue(issue, listFrom, newIndex);\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(function (list) {\n        list.removeIssue(issue);\n      });\n      issue.removeLabels(listLabels);\n    } else {\n      listFrom.removeIssue(issue);\n    }\n  },\n  moveIssueInList: function moveIssueInList(list, issue, oldIndex, newIndex, idArray) {\n    var beforeId = parseInt(idArray[newIndex - 1], 10) || null;\n    var afterId = parseInt(idArray[newIndex + 1], 10) || null;\n\n    list.moveIssue(issue, oldIndex, newIndex, beforeId, afterId);\n  },\n  findList: function findList(key, val) {\n    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'label';\n\n    return this.state.lists.filter(function (list) {\n      var byType = type ? list['type'] === type : true;\n\n      return list[key] === val && byType;\n    })[0];\n  },\n  updateFiltersUrl: function updateFiltersUrl() {\n    history.pushState(null, null, '?' + this.filter.path);\n  }\n};\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(\"../../../node_modules/jquery/dist/jquery.js\")))\n\n/***/ }),\n\n/***/ \"./boards/stores/modal_store.js\":\n/***/ (function(module, exports) {\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\nvar ModalStore = function () {\n  function ModalStore() {\n    _classCallCheck(this, ModalStore);\n\n    this.store = {\n      columns: 3,\n      issues: [],\n      issuesCount: false,\n      selectedIssues: [],\n      showAddIssuesModal: false,\n      activeTab: 'all',\n      selectedList: null,\n      searchTerm: '',\n      loading: false,\n      loadingNewPage: false,\n      filterLoading: false,\n      page: 1,\n      perPage: 50,\n      filter: {\n        path: ''\n      }\n    };\n  }\n\n  _createClass(ModalStore, [{\n    key: 'selectedCount',\n    value: function selectedCount() {\n      return this.getSelectedIssues().length;\n    }\n  }, {\n    key: 'toggleIssue',\n    value: function toggleIssue(issueObj) {\n      var issue = issueObj;\n      var selected = issue.selected;\n\n      issue.selected = !selected;\n\n      if (!selected) {\n        this.addSelectedIssue(issue);\n      } else {\n        this.removeSelectedIssue(issue);\n      }\n    }\n  }, {\n    key: 'toggleAll',\n    value: function toggleAll() {\n      var _this = this;\n\n      var select = this.selectedCount() !== this.store.issues.length;\n\n      this.store.issues.forEach(function (issue) {\n        var issueUpdate = issue;\n\n        if (issueUpdate.selected !== select) {\n          issueUpdate.selected = select;\n\n          if (select) {\n            _this.addSelectedIssue(issue);\n          } else {\n            _this.removeSelectedIssue(issue);\n          }\n        }\n      });\n    }\n  }, {\n    key: 'getSelectedIssues',\n    value: function getSelectedIssues() {\n      return this.store.selectedIssues.filter(function (issue) {\n        return issue.selected;\n      });\n    }\n  }, {\n    key: 'addSelectedIssue',\n    value: function addSelectedIssue(issue) {\n      var index = this.selectedIssueIndex(issue);\n\n      if (index === -1) {\n        this.store.selectedIssues.push(issue);\n      }\n    }\n  }, {\n    key: 'removeSelectedIssue',\n    value: function removeSelectedIssue(issue) {\n      var forcePurge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (this.store.activeTab === 'all' || forcePurge) {\n        this.store.selectedIssues = this.store.selectedIssues.filter(function (fIssue) {\n          return fIssue.id !== issue.id;\n        });\n      }\n    }\n  }, {\n    key: 'purgeUnselectedIssues',\n    value: function purgeUnselectedIssues() {\n      var _this2 = this;\n\n      this.store.selectedIssues.forEach(function (issue) {\n        if (!issue.selected) {\n          _this2.removeSelectedIssue(issue, true);\n        }\n      });\n    }\n  }, {\n    key: 'selectedIssueIndex',\n    value: function selectedIssueIndex(issue) {\n      return this.store.selectedIssues.indexOf(issue);\n    }\n  }, {\n    key: 'findSelectedIssue',\n    value: function findSelectedIssue(issue) {\n      return this.store.selectedIssues.filter(function (filteredIssue) {\n        return filteredIssue.id === issue.id;\n      })[0];\n    }\n  }]);\n\n  return ModalStore;\n}();\n\ngl.issueBoards.ModalStore = new ModalStore();\n\n/***/ }),\n\n/***/ \"./boards/utils/query_data.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (path, extraData) {\n  return path.split('&').reduce(function (dataParam, filterParam) {\n    if (filterParam === '') return dataParam;\n\n    var data = dataParam;\n    var paramSplit = filterParam.split('=');\n    var paramKeyNormalized = paramSplit[0].replace('[]', '');\n    var isArray = paramSplit[0].indexOf('[]');\n    var value = decodeURIComponent(paramSplit[1]).replace(/\\+/g, ' ');\n\n    if (isArray !== -1) {\n      if (!data[paramKeyNormalized]) {\n        data[paramKeyNormalized] = [];\n      }\n\n      data[paramKeyNormalized].push(value);\n    } else {\n      data[paramKeyNormalized] = value;\n    }\n\n    return data;\n  }, extraData);\n});\n\n/***/ }),\n\n/***/ \"./sidebar/components/assignees/assignee_title.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n  name: 'AssigneeTitle',\n  props: {\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    numberOfAssignees: {\n      type: Number,\n      required: true\n    },\n    editable: {\n      type: Boolean,\n      required: true\n    },\n    showToggle: {\n      type: Boolean,\n      required: false,\n      default: false\n    }\n  },\n  computed: {\n    assigneeTitle: function assigneeTitle() {\n      var assignees = this.numberOfAssignees;\n      return assignees > 1 ? assignees + ' \\u4E2A\\u6307\\u6D3E' : '个指派';\n    }\n  },\n  template: '\\n    <div class=\"title hide-collapsed\">\\n      {{assigneeTitle}}\\n      <i\\n        v-if=\"loading\"\\n        aria-hidden=\"true\"\\n        class=\"fa fa-spinner fa-spin block-loading\"\\n      />\\n      <a\\n        v-if=\"editable\"\\n        class=\"js-sidebar-dropdown-toggle edit-link pull-right\"\\n        href=\"#\"\\n      >\\n        \\u7F16\\u8F91\\n      </a>\\n      <a\\n        v-if=\"showToggle\"\\n        aria-label=\"Toggle sidebar\"\\n        class=\"gutter-toggle pull-right js-sidebar-toggle\"\\n        href=\"#\"\\n        role=\"button\"\\n      >\\n        <i\\n          aria-hidden=\"true\"\\n          data-hidden=\"true\"\\n          class=\"fa fa-angle-double-right\"\\n        />\\n      </a>\\n    </div>\\n  '\n});\n\n/***/ }),\n\n/***/ \"./sidebar/components/assignees/assignees.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n  name: 'Assignees',\n  data: function data() {\n    return {\n      defaultRenderCount: 5,\n      defaultMaxCounter: 99,\n      showLess: true\n    };\n  },\n\n  props: {\n    rootPath: {\n      type: String,\n      required: true\n    },\n    users: {\n      type: Array,\n      required: true\n    },\n    editable: {\n      type: Boolean,\n      required: true\n    }\n  },\n  computed: {\n    firstUser: function firstUser() {\n      return this.users[0];\n    },\n    hasMoreThanTwoAssignees: function hasMoreThanTwoAssignees() {\n      return this.users.length > 2;\n    },\n    hasMoreThanOneAssignee: function hasMoreThanOneAssignee() {\n      return this.users.length > 1;\n    },\n    hasAssignees: function hasAssignees() {\n      return this.users.length > 0;\n    },\n    hasNoUsers: function hasNoUsers() {\n      return !this.users.length;\n    },\n    hasOneUser: function hasOneUser() {\n      return this.users.length === 1;\n    },\n    renderShowMoreSection: function renderShowMoreSection() {\n      return this.users.length > this.defaultRenderCount;\n    },\n    numberOfHiddenAssignees: function numberOfHiddenAssignees() {\n      return this.users.length - this.defaultRenderCount;\n    },\n    isHiddenAssignees: function isHiddenAssignees() {\n      return this.numberOfHiddenAssignees > 0;\n    },\n    hiddenAssigneesLabel: function hiddenAssigneesLabel() {\n      return '+ ' + this.numberOfHiddenAssignees + ' more';\n    },\n    collapsedTooltipTitle: function collapsedTooltipTitle() {\n      var maxRender = Math.min(this.defaultRenderCount, this.users.length);\n      var renderUsers = this.users.slice(0, maxRender);\n      var names = renderUsers.map(function (u) {\n        return u.name;\n      });\n\n      if (this.users.length > maxRender) {\n        names.push('+ ' + (this.users.length - maxRender) + ' more');\n      }\n\n      return names.join(', ');\n    },\n    sidebarAvatarCounter: function sidebarAvatarCounter() {\n      var counter = '+' + (this.users.length - 1);\n\n      if (this.users.length > this.defaultMaxCounter) {\n        counter = this.defaultMaxCounter + '+';\n      }\n\n      return counter;\n    }\n  },\n  methods: {\n    assignSelf: function assignSelf() {\n      this.$emit('assign-self');\n    },\n    toggleShowLess: function toggleShowLess() {\n      this.showLess = !this.showLess;\n    },\n    renderAssignee: function renderAssignee(index) {\n      return !this.showLess || index < this.defaultRenderCount && this.showLess;\n    },\n    avatarUrl: function avatarUrl(user) {\n      return user.avatar || user.avatar_url;\n    },\n    assigneeUrl: function assigneeUrl(user) {\n      return '' + this.rootPath + user.username;\n    },\n    assigneeAlt: function assigneeAlt(user) {\n      return user.name + '\\'s avatar';\n    },\n    assigneeUsername: function assigneeUsername(user) {\n      return '@' + user.username;\n    },\n    shouldRenderCollapsedAssignee: function shouldRenderCollapsedAssignee(index) {\n      var firstTwo = this.users.length <= 2 && index <= 2;\n\n      return index === 0 || firstTwo;\n    }\n  },\n  template: '\\n    <div>\\n      <div\\n        class=\"sidebar-collapsed-icon sidebar-collapsed-user\"\\n        :class=\"{ \\'multiple-users\\': hasMoreThanOneAssignee, \\'has-tooltip\\': hasAssignees }\"\\n        data-container=\"body\"\\n        data-placement=\"left\"\\n        :title=\"collapsedTooltipTitle\"\\n      >\\n        <i\\n          v-if=\"hasNoUsers\"\\n          aria-label=\"\\u672A\\u6307\\u6D3E\"\\n          class=\"fa fa-user\"\\n        />\\n        <button\\n          type=\"button\"\\n          class=\"btn-link\"\\n          v-for=\"(user, index) in users\"\\n          v-if=\"shouldRenderCollapsedAssignee(index)\"\\n        >\\n          <img\\n            width=\"24\"\\n            class=\"avatar avatar-inline s24\"\\n            :alt=\"assigneeAlt(user)\"\\n            :src=\"avatarUrl(user)\"\\n          />\\n          <span class=\"author\">\\n            {{ user.name }}\\n          </span>\\n        </button>\\n        <button\\n          v-if=\"hasMoreThanTwoAssignees\"\\n          class=\"btn-link\"\\n          type=\"button\"\\n        >\\n          <span\\n            class=\"avatar-counter sidebar-avatar-counter\"\\n          >\\n            {{ sidebarAvatarCounter }}\\n          </span>\\n        </button>\\n      </div>\\n      <div class=\"value hide-collapsed\">\\n        <template v-if=\"hasNoUsers\">\\n          <span class=\"assign-yourself no-value\">\\n            \\u672A\\u6307\\u6D3E\\n            <template v-if=\"editable\">\\n             -\\n              <button\\n                type=\"button\"\\n                class=\"btn-link\"\\n                @click=\"assignSelf\"\\n              >\\n                \\u6307\\u6D3E\\u7ED9\\u60A8\\u81EA\\u5DF1\\n              </button>\\n            </template>\\n          </span>\\n        </template>\\n        <template v-else-if=\"hasOneUser\">\\n          <a\\n            class=\"author_link bold\"\\n            :href=\"assigneeUrl(firstUser)\"\\n          >\\n            <img\\n              width=\"32\"\\n              class=\"avatar avatar-inline s32\"\\n              :alt=\"assigneeAlt(firstUser)\"\\n              :src=\"avatarUrl(firstUser)\"\\n            />\\n            <span class=\"author\">\\n              {{ firstUser.name }}\\n            </span>\\n            <span class=\"username\">\\n              {{ assigneeUsername(firstUser) }}\\n            </span>\\n          </a>\\n        </template>\\n        <template v-else>\\n          <div class=\"user-list\">\\n            <div\\n              class=\"user-item\"\\n              v-for=\"(user, index) in users\"\\n              v-if=\"renderAssignee(index)\"\\n            >\\n              <a\\n                class=\"user-link has-tooltip\"\\n                data-placement=\"bottom\"\\n                :href=\"assigneeUrl(user)\"\\n                :data-title=\"user.name\"\\n              >\\n                <img\\n                  width=\"32\"\\n                  class=\"avatar avatar-inline s32\"\\n                  :alt=\"assigneeAlt(user)\"\\n                  :src=\"avatarUrl(user)\"\\n                />\\n              </a>\\n            </div>\\n          </div>\\n          <div\\n            v-if=\"renderShowMoreSection\"\\n            class=\"user-list-more\"\\n          >\\n            <button\\n              type=\"button\"\\n              class=\"btn-link\"\\n              @click=\"toggleShowLess\"\\n            >\\n              <template v-if=\"showLess\">\\n                {{ hiddenAssigneesLabel }}\\n              </template>\\n              <template v-else>\\n                - show less\\n              </template>\\n            </button>\\n          </div>\\n        </template>\\n      </div>\\n    </div>\\n  '\n});\n\n/***/ }),\n\n/***/ \"./sidebar/components/subscriptions/subscriptions.vue\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./locale/index.js + 1 modules\nvar locale = __webpack_require__(\"./locale/index.js\");\n\n// EXTERNAL MODULE: ./sidebar/event_hub.js\nvar event_hub = __webpack_require__(\"./sidebar/event_hub.js\");\n\n// EXTERNAL MODULE: ./vue_shared/components/loading_button.vue + 2 modules\nvar loading_button = __webpack_require__(\"./vue_shared/components/loading_button.vue\");\n\n// CONCATENATED MODULE: /opt/gitlab/embedded/service/gitlab-rails/node_modules/babel-loader/lib!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=script&index=0!./sidebar/components/subscriptions/subscriptions.vue\n\n\n\n\n\n/* harmony default export */ var subscriptions = ({\n  props: {\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false\n    },\n    subscribed: {\n      type: Boolean,\n      required: false\n    },\n    id: {\n      type: Number,\n      required: false\n    }\n  },\n  components: {\n    loadingButton: loading_button[\"a\" /* default */]\n  },\n  computed: {\n    buttonLabel: function buttonLabel() {\n      var label = void 0;\n      if (this.subscribed === false) {\n        label = Object(locale[\"__\"])('Subscribe');\n      } else if (this.subscribed === true) {\n        label = Object(locale[\"__\"])('Unsubscribe');\n      }\n\n      return label;\n    }\n  },\n  methods: {\n    toggleSubscription: function toggleSubscription() {\n      event_hub[\"a\" /* default */].$emit('toggleSubscription', this.id);\n    }\n  }\n});\n// CONCATENATED MODULE: /opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-331fd250\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=template&index=0!./sidebar/components/subscriptions/subscriptions.vue\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._m(0,false,false),_vm._v(\" \"),_c('span',{staticClass:\"issuable-header-text hide-collapsed pull-left\"},[_vm._v(\"\\n    \"+_vm._s(_vm.__('Notifications'))+\"\\n  \")]),_vm._v(\" \"),_c('loading-button',{ref:\"loadingButton\",staticClass:\"btn btn-default pull-right hide-collapsed js-issuable-subscribe-button\",attrs:{\"loading\":_vm.loading,\"label\":_vm.buttonLabel},on:{\"click\":_vm.toggleSubscription}})],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sidebar-collapsed-icon\"},[_c('i',{staticClass:\"fa fa-rss\",attrs:{\"aria-hidden\":\"true\"}})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ var subscriptions_subscriptions = (esExports);\n// CONCATENATED MODULE: ./sidebar/components/subscriptions/subscriptions.vue\nvar normalizeComponent = __webpack_require__(\"../../../node_modules/vue-loader/lib/component-normalizer.js\")\n/* script */\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n  subscriptions,\n  subscriptions_subscriptions,\n  __vue_template_functional__,\n  __vue_styles__,\n  __vue_scopeId__,\n  __vue_module_identifier__\n)\n\n/* harmony default export */ var components_subscriptions_subscriptions = __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n\n/***/ \"./sidebar/event_hub.js\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(\"../../../node_modules/vue/dist/vue.esm.js\");\n\n\nvar eventHub = new __WEBPACK_IMPORTED_MODULE_0_vue__[\"a\" /* default */]();\n\n// TODO: remove eventHub hack after code splitting refactor\nwindow.emitSidebarEvent = function () {\n  return eventHub.$emit.apply(eventHub, arguments);\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (eventHub);\n\n/***/ })\n\n},[\"./boards/boards_bundle.js\"]);\n\n\n// WEBPACK FOOTER //\n// boards.24eba708768ebdc67ff6.bundle.js","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAAAAAAdJSU2AAACNElEQVR4AdXYBa7jMBCA4b3/JZahzIkjp2qt+BWUWnG5ln2XxaJJb2b5F2ukL4wvzK/rP7bUcbf92u6oftLSe1ldk8efsfaVeEjusZZeC6e1RllaCk/yG6ag1lZ4WwPX69uyD6tAe/g2ipAlNMRS37awDLaFrpcMWxXQOi0jnWCWjFkSZomYJWDWKmatYNZyEWkJsvQimoZYah5NgdaLxagCtF6GRy0DshZPkeYwS/KIJWGWYjwYUzDLxCwDtJ54OKglimBLqHWahii2g1pmHLLGBmwVoRjcKlmgOdw65H5qKuGWCVi5Qlhs6m1sENZi4q3AWNvca5UYy2RjT/SAsiZey6CsIvc0wVlV5lJ0ibPMyLUGCmlxQq0IM0hLdWyro7CWEc3sXsqaK4O2zLxOsmtpfW5Q1u68ZrVmepaaNXEewawtI9X5Xl3U3n1qND6+rfPzvqoIWz/fklNCSLY153YV53J/XUxGCJnKZ1lajsn3/Ffegf6Y5pV2LUsSNL2UHzxUfh3TlYpZqqTpXZm0KZk9zJcqaEmaWPHDw0pxe05K7bWOLHFLWXVetqpYmrjle4+1y0aBaF4UOQ1NU+lYezJClkjLUnSEjqhH6zjAW4OjtY39Ibq+sawUb6W2RQfoqG0VeKuwrRJvlba17faRdbe2pTtYq6Nty/S7yAbGsQjWIq41wVoT1+IdZNy1djUcVdu5lklQWC0xHkt1X31qNEE1Pr3qKv/9XiSNj6Aaifj3/69+AYujsR/MvkpZAAAAAElFTkSuQmCC\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../images/no_avatar.png\n// module id = ../images/no_avatar.png\n// module chunks = boards sidebar commit_pipelines diff_notes environments cycle_analytics job_details notes pipelines pipelines_details environments_folder","/* eslint-disable one-var, quote-props, comma-dangle, space-before-function-paren */\n\nimport _ from 'underscore';\nimport Vue from 'vue';\nimport VueResource from 'vue-resource';\nimport Flash from '../flash';\nimport { __ } from '../locale';\nimport FilteredSearchBoards from './filtered_search_boards';\nimport eventHub from './eventhub';\nimport sidebarEventHub from '../sidebar/event_hub';\nimport './models/issue';\nimport './models/label';\nimport './models/list';\nimport './models/milestone';\nimport './models/assignee';\nimport './stores/boards_store';\nimport './stores/modal_store';\nimport BoardService from './services/board_service';\nimport './mixins/modal_mixins';\nimport './mixins/sortable_default_options';\nimport './filters/due_date_filters';\nimport './components/board';\nimport './components/board_sidebar';\nimport './components/new_list_dropdown';\nimport './components/modal/index';\nimport '../vue_shared/vue_resource_interceptor';\n\nVue.use(VueResource);\n\n$(() => {\n  const $boardApp = document.getElementById('board-app');\n  const Store = gl.issueBoards.BoardsStore;\n  const ModalStore = gl.issueBoards.ModalStore;\n\n  window.gl = window.gl || {};\n\n  if (gl.IssueBoardsApp) {\n    gl.IssueBoardsApp.$destroy(true);\n  }\n\n  Store.create();\n\n  // hack to allow sidebar scripts like milestone_select manipulate the BoardsStore\n  gl.issueBoards.boardStoreIssueSet = (...args) => Vue.set(Store.detail.issue, ...args);\n  gl.issueBoards.boardStoreIssueDelete = (...args) => Vue.delete(Store.detail.issue, ...args);\n\n  gl.IssueBoardsApp = new Vue({\n    el: $boardApp,\n    components: {\n      'board': gl.issueBoards.Board,\n      'board-sidebar': gl.issueBoards.BoardSidebar,\n      'board-add-issues-modal': gl.issueBoards.IssuesModal,\n    },\n    data: {\n      state: Store.state,\n      loading: true,\n      boardsEndpoint: $boardApp.dataset.boardsEndpoint,\n      listsEndpoint: $boardApp.dataset.listsEndpoint,\n      boardId: $boardApp.dataset.boardId,\n      disabled: $boardApp.dataset.disabled === 'true',\n      issueLinkBase: $boardApp.dataset.issueLinkBase,\n      rootPath: $boardApp.dataset.rootPath,\n      bulkUpdatePath: $boardApp.dataset.bulkUpdatePath,\n      detailIssue: Store.detail,\n      defaultAvatar: $boardApp.dataset.defaultAvatar,\n    },\n    computed: {\n      detailIssueVisible () {\n        return Object.keys(this.detailIssue.issue).length;\n      },\n    },\n    created () {\n      gl.boardService = new BoardService({\n        boardsEndpoint: this.boardsEndpoint,\n        listsEndpoint: this.listsEndpoint,\n        bulkUpdatePath: this.bulkUpdatePath,\n        boardId: this.boardId,\n      });\n      Store.rootPath = this.boardsEndpoint;\n\n      eventHub.$on('updateTokens', this.updateTokens);\n      eventHub.$on('newDetailIssue', this.updateDetailIssue);\n      eventHub.$on('clearDetailIssue', this.clearDetailIssue);\n      sidebarEventHub.$on('toggleSubscription', this.toggleSubscription);\n    },\n    beforeDestroy() {\n      eventHub.$off('updateTokens', this.updateTokens);\n      eventHub.$off('newDetailIssue', this.updateDetailIssue);\n      eventHub.$off('clearDetailIssue', this.clearDetailIssue);\n      sidebarEventHub.$off('toggleSubscription', this.toggleSubscription);\n    },\n    mounted () {\n      this.filterManager = new FilteredSearchBoards(Store.filter, true);\n      this.filterManager.setup();\n\n      Store.disabled = this.disabled;\n      gl.boardService.all()\n        .then(response => response.json())\n        .then((resp) => {\n          resp.forEach((board) => {\n            const list = Store.addList(board, this.defaultAvatar);\n\n            if (list.type === 'closed') {\n              list.position = Infinity;\n              list.label = { description: 'Shows all closed issues. Moving an issue to this list closes it' };\n            } else if (list.type === 'backlog') {\n              list.position = -1;\n            }\n          });\n\n          this.state.lists = _.sortBy(this.state.lists, 'position');\n\n          Store.addBlankState();\n          this.loading = false;\n        })\n        .catch(() => new Flash('An error occurred. Please try again.'));\n    },\n    methods: {\n      updateTokens() {\n        this.filterManager.updateTokens();\n      },\n      updateDetailIssue(newIssue) {\n        const sidebarInfoEndpoint = newIssue.sidebarInfoEndpoint;\n        if (sidebarInfoEndpoint && newIssue.subscribed === undefined) {\n          newIssue.setFetchingState('subscriptions', true);\n          BoardService.getIssueInfo(sidebarInfoEndpoint)\n            .then(res => res.json())\n            .then((data) => {\n              newIssue.setFetchingState('subscriptions', false);\n              newIssue.updateData({\n                subscribed: data.subscribed,\n              });\n            })\n            .catch(() => {\n              newIssue.setFetchingState('subscriptions', false);\n              Flash(__('An error occurred while fetching sidebar data'));\n            });\n        }\n\n        Store.detail.issue = newIssue;\n      },\n      clearDetailIssue() {\n        Store.detail.issue = {};\n      },\n      toggleSubscription(id) {\n        const issue = Store.detail.issue;\n        if (issue.id === id && issue.toggleSubscriptionEndpoint) {\n          issue.setFetchingState('subscriptions', true);\n          BoardService.toggleIssueSubscription(issue.toggleSubscriptionEndpoint)\n            .then(() => {\n              issue.setFetchingState('subscriptions', false);\n              issue.updateData({\n                subscribed: !issue.subscribed,\n              });\n            })\n            .catch(() => {\n              issue.setFetchingState('subscriptions', false);\n              Flash(__('An error occurred when toggling the notification subscription'));\n            });\n        }\n      }\n    },\n  });\n\n  gl.IssueBoardsSearch = new Vue({\n    el: document.getElementById('js-add-list'),\n    data: {\n      filters: Store.state.filters,\n    },\n    mounted () {\n      gl.issueBoards.newListDropdownInit();\n    },\n  });\n\n  gl.IssueBoardsModalAddBtn = new Vue({\n    mixins: [gl.issueBoards.ModalMixins],\n    el: document.getElementById('js-add-issues-btn'),\n    data() {\n      return {\n        modal: ModalStore.store,\n        store: Store.state,\n      };\n    },\n    watch: {\n      disabled() {\n        this.updateTooltip();\n      },\n    },\n    computed: {\n      disabled() {\n        if (!this.store) {\n          return true;\n        }\n        return !this.store.lists.filter(list => !list.preset).length;\n      },\n      tooltipTitle() {\n        if (this.disabled) {\n          return 'Please add a list to your board first';\n        }\n\n        return '';\n      },\n    },\n    methods: {\n      updateTooltip() {\n        const $tooltip = $(this.$refs.addIssuesButton);\n\n        this.$nextTick(() => {\n          if (this.disabled) {\n            $tooltip.tooltip();\n          } else {\n            $tooltip.tooltip('destroy');\n          }\n        });\n      },\n      openModal() {\n        if (!this.disabled) {\n          this.toggleModal(true);\n        }\n      },\n    },\n    mounted() {\n      this.updateTooltip();\n    },\n    template: `\n      <div class=\"board-extra-actions\">\n        <button\n          class=\"btn btn-create prepend-left-10\"\n          type=\"button\"\n          data-placement=\"bottom\"\n          ref=\"addIssuesButton\"\n          :class=\"{ 'disabled': disabled }\"\n          :title=\"tooltipTitle\"\n          :aria-disabled=\"disabled\"\n          @click=\"openModal\">\n          添加问题\n        </button>\n      </div>\n    `,\n  });\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/boards_bundle.js","/* eslint-disable comma-dangle, space-before-function-paren, one-var */\n/* global Sortable */\nimport Vue from 'vue';\nimport AccessorUtilities from '../../lib/utils/accessor';\nimport boardList from './board_list';\nimport boardBlankState from './board_blank_state';\nimport './board_delete';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.Board = Vue.extend({\n  template: '#js-board-template',\n  components: {\n    boardList,\n    'board-delete': gl.issueBoards.BoardDelete,\n    boardBlankState,\n  },\n  props: {\n    list: Object,\n    disabled: Boolean,\n    issueLinkBase: String,\n    rootPath: String,\n    boardId: {\n      type: String,\n      required: true,\n    },\n  },\n  data () {\n    return {\n      detailIssue: Store.detail,\n      filter: Store.filter,\n    };\n  },\n  watch: {\n    filter: {\n      handler() {\n        this.list.page = 1;\n        this.list.getIssues(true)\n          .catch(() => {\n            // TODO: handle request error\n          });\n      },\n      deep: true,\n    },\n    detailIssue: {\n      handler () {\n        if (!Object.keys(this.detailIssue.issue).length) return;\n\n        const issue = this.list.findIssue(this.detailIssue.issue.id);\n\n        if (issue) {\n          const offsetLeft = this.$el.offsetLeft;\n          const boardsList = document.querySelectorAll('.boards-list')[0];\n          const left = boardsList.scrollLeft - offsetLeft;\n          let right = (offsetLeft + this.$el.offsetWidth);\n\n          if (window.innerWidth > 768 && boardsList.classList.contains('is-compact')) {\n            // -290 here because width of boardsList is animating so therefore\n            // getting the width here is incorrect\n            // 290 is the width of the sidebar\n            right -= (boardsList.offsetWidth - 290);\n          } else {\n            right -= boardsList.offsetWidth;\n          }\n\n          if (right - boardsList.scrollLeft > 0) {\n            $(boardsList).animate({\n              scrollLeft: right\n            }, this.sortableOptions.animation);\n          } else if (left > 0) {\n            $(boardsList).animate({\n              scrollLeft: offsetLeft\n            }, this.sortableOptions.animation);\n          }\n        }\n      },\n      deep: true\n    }\n  },\n  methods: {\n    showNewIssueForm() {\n      this.$refs['board-list'].showIssueForm = !this.$refs['board-list'].showIssueForm;\n    },\n    toggleExpanded(e) {\n      if (this.list.isExpandable && !e.target.classList.contains('js-no-trigger-collapse')) {\n        this.list.isExpanded = !this.list.isExpanded;\n\n        if (AccessorUtilities.isLocalStorageAccessSafe()) {\n          localStorage.setItem(`boards.${this.boardId}.${this.list.type}.expanded`, this.list.isExpanded);\n        }\n      }\n    },\n  },\n  mounted () {\n    this.sortableOptions = gl.issueBoards.getBoardSortableDefaultOptions({\n      disabled: this.disabled,\n      group: 'boards',\n      draggable: '.is-draggable',\n      handle: '.js-board-handle',\n      onEnd: (e) => {\n        gl.issueBoards.onEnd();\n\n        if (e.newIndex !== undefined && e.oldIndex !== e.newIndex) {\n          const order = this.sortable.toArray();\n          const list = Store.findList('id', parseInt(e.item.dataset.id, 10));\n\n          this.$nextTick(() => {\n            Store.moveList(list, order);\n          });\n        }\n      }\n    });\n\n    this.sortable = Sortable.create(this.$el.parentNode, this.sortableOptions);\n  },\n  created() {\n    if (this.list.isExpandable && AccessorUtilities.isLocalStorageAccessSafe()) {\n      const isCollapsed = localStorage.getItem(`boards.${this.boardId}.${this.list.type}.expanded`) === 'false';\n\n      this.list.isExpanded = !isCollapsed;\n    }\n  },\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board.js","/* global ListLabel */\n\nimport _ from 'underscore';\nimport Cookies from 'js-cookie';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nexport default {\n  template: `\n    <div class=\"board-blank-state\">\n      <p>\n        只需点击一下,即可将以下默认列表添加到问题看板:\n      </p>\n      <ul class=\"board-blank-state-list\">\n        <li v-for=\"label in predefinedLabels\">\n          <span\n            class=\"label-color\"\n            :style=\"{ backgroundColor: label.color }\">\n          </span>\n          {{ label.title }}\n        </li>\n      </ul>\n      <p>\n        使用默认列表将让您能正确并充分地利用您的的问题看板。\n      </p>\n      <button\n        class=\"btn btn-create btn-inverted btn-block\"\n        type=\"button\"\n        @click.stop=\"addDefaultLists\">\n        添加默认列表\n      </button>\n      <button\n        class=\"btn btn-default btn-block\"\n        type=\"button\"\n        @click.stop=\"clearBlankState\">\n        没关系,我将自己创建列表\n      </button>\n    </div>\n  `,\n  data() {\n    return {\n      predefinedLabels: [\n        new ListLabel({ title: 'To Do', color: '#F0AD4E' }),\n        new ListLabel({ title: 'Doing', color: '#5CB85C' }),\n      ],\n    };\n  },\n  methods: {\n    addDefaultLists() {\n      this.clearBlankState();\n\n      this.predefinedLabels.forEach((label, i) => {\n        Store.addList({\n          title: label.title,\n          position: i,\n          list_type: 'label',\n          label: {\n            title: label.title,\n            color: label.color,\n          },\n        });\n      });\n\n      Store.state.lists = _.sortBy(Store.state.lists, 'position');\n\n      // Save the labels\n      gl.boardService.generateDefaultLists()\n        .then(resp => resp.json())\n        .then((data) => {\n          data.forEach((listObj) => {\n            const list = Store.findList('title', listObj.title);\n\n            list.id = listObj.id;\n            list.label.id = listObj.label.id;\n            list.getIssues()\n              .catch(() => {\n                // TODO: handle request error\n              });\n          });\n        })\n        .catch(() => {\n          Store.removeList(undefined, 'label');\n          Cookies.remove('issue_board_welcome_hidden', {\n            path: '',\n          });\n          Store.addBlankState();\n        });\n    },\n    clearBlankState: Store.removeBlankState.bind(Store),\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board_blank_state.js","/* eslint-disable comma-dangle, space-before-function-paren, no-alert */\n\nimport Vue from 'vue';\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.BoardDelete = Vue.extend({\n  props: {\n    list: Object\n  },\n  methods: {\n    deleteBoard () {\n      $(this.$el).tooltip('hide');\n\n      if (confirm('您确定要删除这个列表?')) {\n        this.list.destroy();\n      }\n    }\n  }\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board_delete.js","<script>\nimport './issue_card_inner';\nimport eventHub from '../eventhub';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nexport default {\n  name: 'BoardsIssueCard',\n  components: {\n    'issue-card-inner': gl.issueBoards.IssueCardInner,\n  },\n  props: {\n    list: Object,\n    issue: Object,\n    issueLinkBase: String,\n    disabled: Boolean,\n    index: Number,\n    rootPath: String,\n  },\n  data() {\n    return {\n      showDetail: false,\n      detailIssue: Store.detail,\n    };\n  },\n  computed: {\n    issueDetailVisible() {\n      return this.detailIssue.issue && this.detailIssue.issue.id === this.issue.id;\n    },\n  },\n  methods: {\n    mouseDown() {\n      this.showDetail = true;\n    },\n    mouseMove() {\n      this.showDetail = false;\n    },\n    showIssue(e) {\n      if (e.target.classList.contains('js-no-trigger')) return;\n\n      if (this.showDetail) {\n        this.showDetail = false;\n\n        if (Store.detail.issue && Store.detail.issue.id === this.issue.id) {\n          eventHub.$emit('clearDetailIssue');\n        } else {\n          eventHub.$emit('newDetailIssue', this.issue);\n          Store.detail.list = this.list;\n        }\n      }\n    },\n  },\n};\n</script>\n\n<template>\n  <li class=\"card\"\n    :class=\"{ 'user-can-drag': !disabled && issue.id, 'is-disabled': disabled || !issue.id, 'is-active': issueDetailVisible }\"\n    :index=\"index\"\n    :data-issue-id=\"issue.id\"\n    @mousedown=\"mouseDown\"\n    @mousemove=\"mouseMove\"\n    @mouseup=\"showIssue($event)\">\n    <issue-card-inner\n      :list=\"list\"\n      :issue=\"issue\"\n      :issue-link-base=\"issueLinkBase\"\n      :root-path=\"rootPath\"\n      :update-filters=\"true\" />\n  </li>\n</template>\n\n\n\n// WEBPACK FOOTER //\n// boards/components/board_card.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{staticClass:\"card\",class:{ 'user-can-drag': !_vm.disabled && _vm.issue.id, 'is-disabled': _vm.disabled || !_vm.issue.id, 'is-active': _vm.issueDetailVisible },attrs:{\"index\":_vm.index,\"data-issue-id\":_vm.issue.id},on:{\"mousedown\":_vm.mouseDown,\"mousemove\":_vm.mouseMove,\"mouseup\":function($event){_vm.showIssue($event)}}},[_c('issue-card-inner',{attrs:{\"list\":_vm.list,\"issue\":_vm.issue,\"issue-link-base\":_vm.issueLinkBase,\"root-path\":_vm.rootPath,\"update-filters\":true}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// /opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ffbf4286\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=template&index=0!./boards/components/board_card.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!babel-loader!../../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./board_card.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ffbf4286\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./board_card.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n  __vue_script__,\n  __vue_template__,\n  __vue_template_functional__,\n  __vue_styles__,\n  __vue_scopeId__,\n  __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./boards/components/board_card.vue\n// module id = null\n// module chunks = ","/* global Sortable */\nimport boardNewIssue from './board_new_issue';\nimport boardCard from './board_card.vue';\nimport eventHub from '../eventhub';\nimport loadingIcon from '../../vue_shared/components/loading_icon.vue';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nexport default {\n  name: 'BoardList',\n  props: {\n    disabled: {\n      type: Boolean,\n      required: true,\n    },\n    list: {\n      type: Object,\n      required: true,\n    },\n    issues: {\n      type: Array,\n      required: true,\n    },\n    loading: {\n      type: Boolean,\n      required: true,\n    },\n    issueLinkBase: {\n      type: String,\n      required: true,\n    },\n    rootPath: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      scrollOffset: 250,\n      filters: Store.state.filters,\n      showCount: false,\n      showIssueForm: false,\n    };\n  },\n  components: {\n    boardCard,\n    boardNewIssue,\n    loadingIcon,\n  },\n  methods: {\n    listHeight() {\n      return this.$refs.list.getBoundingClientRect().height;\n    },\n    scrollHeight() {\n      return this.$refs.list.scrollHeight;\n    },\n    scrollTop() {\n      return this.$refs.list.scrollTop + this.listHeight();\n    },\n    scrollToTop() {\n      this.$refs.list.scrollTop = 0;\n    },\n    loadNextPage() {\n      const getIssues = this.list.nextPage();\n      const loadingDone = () => {\n        this.list.loadingMore = false;\n      };\n\n      if (getIssues) {\n        this.list.loadingMore = true;\n        getIssues\n          .then(loadingDone)\n          .catch(loadingDone);\n      }\n    },\n    toggleForm() {\n      this.showIssueForm = !this.showIssueForm;\n    },\n    onScroll() {\n      if (!this.loadingMore && (this.scrollTop() > this.scrollHeight() - this.scrollOffset)) {\n        this.loadNextPage();\n      }\n    },\n  },\n  watch: {\n    filters: {\n      handler() {\n        this.list.loadingMore = false;\n        this.$refs.list.scrollTop = 0;\n      },\n      deep: true,\n    },\n    issues() {\n      this.$nextTick(() => {\n        if (this.scrollHeight() <= this.listHeight() &&\n          this.list.issuesSize > this.list.issues.length) {\n          this.list.page += 1;\n          this.list.getIssues(false)\n            .catch(() => {\n              // TODO: handle request error\n            });\n        }\n\n        if (this.scrollHeight() > Math.ceil(this.listHeight())) {\n          this.showCount = true;\n        } else {\n          this.showCount = false;\n        }\n      });\n    },\n  },\n  created() {\n    eventHub.$on(`hide-issue-form-${this.list.id}`, this.toggleForm);\n    eventHub.$on(`scroll-board-list-${this.list.id}`, this.scrollToTop);\n  },\n  mounted() {\n    const options = gl.issueBoards.getBoardSortableDefaultOptions({\n      scroll: document.querySelectorAll('.boards-list')[0],\n      group: 'issues',\n      disabled: this.disabled,\n      filter: '.board-list-count, .is-disabled',\n      dataIdAttr: 'data-issue-id',\n      onStart: (e) => {\n        const card = this.$refs.issue[e.oldIndex];\n\n        card.showDetail = false;\n        Store.moving.list = card.list;\n        Store.moving.issue = Store.moving.list.findIssue(+e.item.dataset.issueId);\n\n        gl.issueBoards.onStart();\n      },\n      onAdd: (e) => {\n        gl.issueBoards.BoardsStore\n          .moveIssueToList(Store.moving.list, this.list, Store.moving.issue, e.newIndex);\n\n        this.$nextTick(() => {\n          e.item.remove();\n        });\n      },\n      onUpdate: (e) => {\n        const sortedArray = this.sortable.toArray().filter(id => id !== '-1');\n        gl.issueBoards.BoardsStore\n          .moveIssueInList(this.list, Store.moving.issue, e.oldIndex, e.newIndex, sortedArray);\n      },\n      onMove(e) {\n        return !e.related.classList.contains('board-list-count');\n      },\n    });\n\n    this.sortable = Sortable.create(this.$refs.list, options);\n\n    // Scroll event on list to load more\n    this.$refs.list.addEventListener('scroll', this.onScroll);\n  },\n  beforeDestroy() {\n    eventHub.$off(`hide-issue-form-${this.list.id}`, this.toggleForm);\n    eventHub.$off(`scroll-board-list-${this.list.id}`, this.scrollToTop);\n    this.$refs.list.removeEventListener('scroll', this.onScroll);\n  },\n  template: `\n    <div class=\"board-list-component\">\n      <div\n        class=\"board-list-loading text-center\"\n        aria-label=\"Loading issues\"\n        v-if=\"loading\">\n        <loading-icon />\n      </div>\n      <board-new-issue\n        :list=\"list\"\n        v-if=\"list.type !== 'closed' && showIssueForm\"/>\n      <ul\n        class=\"board-list\"\n        v-show=\"!loading\"\n        ref=\"list\"\n        :data-board=\"list.id\"\n        :class=\"{ 'is-smaller': showIssueForm }\">\n        <board-card\n          v-for=\"(issue, index) in issues\"\n          ref=\"issue\"\n          :index=\"index\"\n          :list=\"list\"\n          :issue=\"issue\"\n          :issue-link-base=\"issueLinkBase\"\n          :root-path=\"rootPath\"\n          :disabled=\"disabled\"\n          :key=\"issue.id\" />\n        <li\n          class=\"board-list-count text-center\"\n          v-if=\"showCount\"\n          data-id=\"-1\">\n\n          <loading-icon\n            v-show=\"list.loadingMore\"\n            label=\"Loading more issues\"\n            />\n\n          <span v-if=\"list.issues.length === list.issuesSize\">\n            Showing all issues\n          </span>\n          <span v-else>\n            Showing {{ list.issues.length }} of {{ list.issuesSize }} issues\n          </span>\n        </li>\n      </ul>\n    </div>\n  `,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board_list.js","/* global ListIssue */\nimport eventHub from '../eventhub';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nexport default {\n  name: 'BoardNewIssue',\n  props: {\n    list: {\n      type: Object,\n      required: true,\n    },\n  },\n  data() {\n    return {\n      title: '',\n      error: false,\n    };\n  },\n  methods: {\n    submit(e) {\n      e.preventDefault();\n      if (this.title.trim() === '') return Promise.resolve();\n\n      this.error = false;\n\n      const labels = this.list.label ? [this.list.label] : [];\n      const issue = new ListIssue({\n        title: this.title,\n        labels,\n        subscribed: true,\n        assignees: [],\n      });\n\n      eventHub.$emit(`scroll-board-list-${this.list.id}`);\n      this.cancel();\n\n      return this.list.newIssue(issue)\n        .then(() => {\n          // Need this because our jQuery very kindly disables buttons on ALL form submissions\n          $(this.$refs.submitButton).enable();\n\n          Store.detail.issue = issue;\n          Store.detail.list = this.list;\n        })\n        .catch(() => {\n          // Need this because our jQuery very kindly disables buttons on ALL form submissions\n          $(this.$refs.submitButton).enable();\n\n          // Remove the issue\n          this.list.removeIssue(issue);\n\n          // Show error message\n          this.error = true;\n        });\n    },\n    cancel() {\n      this.title = '';\n      eventHub.$emit(`hide-issue-form-${this.list.id}`);\n    },\n  },\n  mounted() {\n    this.$refs.input.focus();\n  },\n  template: `\n    <div class=\"card board-new-issue-form\">\n      <form @submit=\"submit($event)\">\n        <div class=\"flash-container\"\n          v-if=\"error\">\n          <div class=\"flash-alert\">\n            出现错误,请重试。\n          </div>\n        </div>\n        <label class=\"label-light\"\n          :for=\"list.id + '-title'\">\n          标题\n        </label>\n        <input class=\"form-control\"\n          type=\"text\"\n          v-model=\"title\"\n          ref=\"input\"\n          autocomplete=\"off\"\n          :id=\"list.id + '-title'\" />\n        <div class=\"clearfix prepend-top-10\">\n          <button class=\"btn btn-success pull-left\"\n            type=\"submit\"\n            :disabled=\"title === ''\"\n            ref=\"submit-button\">\n            提交问题\n          </button>\n          <button class=\"btn btn-default pull-right\"\n            type=\"button\"\n            @click=\"cancel\">\n            取消\n          </button>\n        </div>\n      </form>\n    </div>\n  `,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board_new_issue.js","/* eslint-disable comma-dangle, space-before-function-paren, no-new */\n/* global MilestoneSelect */\n/* global Sidebar */\n\nimport Vue from 'vue';\nimport Flash from '../../flash';\nimport eventHub from '../../sidebar/event_hub';\nimport assigneeTitle from '../../sidebar/components/assignees/assignee_title';\nimport assignees from '../../sidebar/components/assignees/assignees';\nimport DueDateSelectors from '../../due_date_select';\nimport './sidebar/remove_issue';\nimport IssuableContext from '../../issuable_context';\nimport LabelsSelect from '../../labels_select';\nimport subscriptions from '../../sidebar/components/subscriptions/subscriptions.vue';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.BoardSidebar = Vue.extend({\n  props: {\n    currentUser: Object\n  },\n  data() {\n    return {\n      detail: Store.detail,\n      issue: {},\n      list: {},\n      loadingAssignees: false,\n    };\n  },\n  computed: {\n    showSidebar () {\n      return Object.keys(this.issue).length;\n    },\n    milestoneTitle() {\n      return this.issue.milestone ? this.issue.milestone.title : 'No Milestone';\n    },\n    canRemove() {\n      return !this.list.preset;\n    },\n  },\n  watch: {\n    detail: {\n      handler () {\n        if (this.issue.id !== this.detail.issue.id) {\n          $('.block.assignee')\n            .find('input:not(.js-vue)[name=\"issue[assignee_ids][]\"]')\n            .each((i, el) => {\n              $(el).remove();\n            });\n\n          $('.js-issue-board-sidebar', this.$el).each((i, el) => {\n            $(el).data('glDropdown').clearMenu();\n          });\n        }\n\n        this.issue = this.detail.issue;\n        this.list = this.detail.list;\n\n        this.$nextTick(() => {\n          this.endpoint = this.$refs.assigneeDropdown.dataset.issueUpdate;\n        });\n      },\n      deep: true\n    },\n  },\n  methods: {\n    closeSidebar () {\n      this.detail.issue = {};\n    },\n    assignSelf () {\n      // Notify gl dropdown that we are now assigning to current user\n      this.$refs.assigneeBlock.dispatchEvent(new Event('assignYourself'));\n\n      this.addAssignee(this.currentUser);\n      this.saveAssignees();\n    },\n    removeAssignee (a) {\n      gl.issueBoards.BoardsStore.detail.issue.removeAssignee(a);\n    },\n    addAssignee (a) {\n      gl.issueBoards.BoardsStore.detail.issue.addAssignee(a);\n    },\n    removeAllAssignees () {\n      gl.issueBoards.BoardsStore.detail.issue.removeAllAssignees();\n    },\n    saveAssignees () {\n      this.loadingAssignees = true;\n\n      gl.issueBoards.BoardsStore.detail.issue.update(this.endpoint)\n        .then(() => {\n          this.loadingAssignees = false;\n        })\n        .catch(() => {\n          this.loadingAssignees = false;\n          return new Flash('An error occurred while saving assignees');\n        });\n    },\n  },\n  created () {\n    // Get events from glDropdown\n    eventHub.$on('sidebar.removeAssignee', this.removeAssignee);\n    eventHub.$on('sidebar.addAssignee', this.addAssignee);\n    eventHub.$on('sidebar.removeAllAssignees', this.removeAllAssignees);\n    eventHub.$on('sidebar.saveAssignees', this.saveAssignees);\n  },\n  beforeDestroy() {\n    eventHub.$off('sidebar.removeAssignee', this.removeAssignee);\n    eventHub.$off('sidebar.addAssignee', this.addAssignee);\n    eventHub.$off('sidebar.removeAllAssignees', this.removeAllAssignees);\n    eventHub.$off('sidebar.saveAssignees', this.saveAssignees);\n  },\n  mounted () {\n    new IssuableContext(this.currentUser);\n    new MilestoneSelect();\n    new DueDateSelectors();\n    new LabelsSelect();\n    new Sidebar();\n  },\n  components: {\n    assigneeTitle,\n    assignees,\n    removeBtn: gl.issueBoards.RemoveIssueBtn,\n    subscriptions,\n  },\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/board_sidebar.js","import Vue from 'vue';\nimport userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';\nimport eventHub from '../eventhub';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.IssueCardInner = Vue.extend({\n  props: {\n    issue: {\n      type: Object,\n      required: true,\n    },\n    issueLinkBase: {\n      type: String,\n      required: true,\n    },\n    list: {\n      type: Object,\n      required: false,\n      default: () => ({}),\n    },\n    rootPath: {\n      type: String,\n      required: true,\n    },\n    updateFilters: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n  },\n  data() {\n    return {\n      limitBeforeCounter: 3,\n      maxRender: 4,\n      maxCounter: 99,\n    };\n  },\n  components: {\n    userAvatarLink,\n  },\n  computed: {\n    numberOverLimit() {\n      return this.issue.assignees.length - this.limitBeforeCounter;\n    },\n    assigneeCounterTooltip() {\n      return `${this.assigneeCounterLabel} more`;\n    },\n    assigneeCounterLabel() {\n      if (this.numberOverLimit > this.maxCounter) {\n        return `${this.maxCounter}+`;\n      }\n\n      return `+${this.numberOverLimit}`;\n    },\n    shouldRenderCounter() {\n      if (this.issue.assignees.length <= this.maxRender) {\n        return false;\n      }\n\n      return this.issue.assignees.length > this.numberOverLimit;\n    },\n    cardUrl() {\n      return `${this.issueLinkBase}/${this.issue.iid}`;\n    },\n    issueId() {\n      if (this.issue.iid) {\n        return `#${this.issue.iid}`;\n      }\n      return false;\n    },\n    showLabelFooter() {\n      return this.issue.labels.find(l => this.showLabel(l)) !== undefined;\n    },\n  },\n  methods: {\n    isIndexLessThanlimit(index) {\n      return index < this.limitBeforeCounter;\n    },\n    shouldRenderAssignee(index) {\n      // Eg. maxRender is 4,\n      // Render up to all 4 assignees if there are only 4 assigness\n      // Otherwise render up to the limitBeforeCounter\n      if (this.issue.assignees.length <= this.maxRender) {\n        return index < this.maxRender;\n      }\n\n      return index < this.limitBeforeCounter;\n    },\n    assigneeUrl(assignee) {\n      return `${this.rootPath}${assignee.username}`;\n    },\n    assigneeUrlTitle(assignee) {\n      return `Assigned to ${assignee.name}`;\n    },\n    avatarUrlTitle(assignee) {\n      return `Avatar for ${assignee.name}`;\n    },\n    showLabel(label) {\n      if (!label.id) return false;\n      return true;\n    },\n    filterByLabel(label, e) {\n      if (!this.updateFilters) return;\n\n      const filterPath = gl.issueBoards.BoardsStore.filter.path.split('&');\n      const labelTitle = encodeURIComponent(label.title);\n      const param = `label_name[]=${labelTitle}`;\n      const labelIndex = filterPath.indexOf(param);\n      $(e.currentTarget).tooltip('hide');\n\n      if (labelIndex === -1) {\n        filterPath.push(param);\n      } else {\n        filterPath.splice(labelIndex, 1);\n      }\n\n      gl.issueBoards.BoardsStore.filter.path = filterPath.join('&');\n\n      Store.updateFiltersUrl();\n\n      eventHub.$emit('updateTokens');\n    },\n    labelStyle(label) {\n      return {\n        backgroundColor: label.color,\n        color: label.textColor,\n      };\n    },\n  },\n  template: `\n    <div>\n      <div class=\"card-header\">\n        <h4 class=\"card-title\">\n          <i\n            class=\"fa fa-eye-slash confidential-icon\"\n            v-if=\"issue.confidential\"\n            aria-hidden=\"true\"\n          />\n          <a\n            class=\"js-no-trigger\"\n            :href=\"cardUrl\"\n            :title=\"issue.title\">{{ issue.title }}</a>\n          <span\n            class=\"card-number\"\n            v-if=\"issueId\"\n          >\n            {{ issueId }}\n          </span>\n        </h4>\n        <div class=\"card-assignee\">\n          <user-avatar-link\n            v-for=\"(assignee, index) in issue.assignees\"\n            :key=\"assignee.id\"\n            v-if=\"shouldRenderAssignee(index)\"\n            class=\"js-no-trigger\"\n            :link-href=\"assigneeUrl(assignee)\"\n            :img-alt=\"avatarUrlTitle(assignee)\"\n            :img-src=\"assignee.avatar\"\n            :tooltip-text=\"assigneeUrlTitle(assignee)\"\n            tooltip-placement=\"bottom\"\n          />\n          <span\n            class=\"avatar-counter has-tooltip\"\n            :title=\"assigneeCounterTooltip\"\n            v-if=\"shouldRenderCounter\"\n          >\n           {{ assigneeCounterLabel }}\n          </span>\n        </div>\n      </div>\n      <div\n        class=\"card-footer\"\n        v-if=\"showLabelFooter\"\n      >\n        <button\n          class=\"label color-label has-tooltip\"\n          v-for=\"label in issue.labels\"\n          type=\"button\"\n          v-if=\"showLabel(label)\"\n          @click=\"filterByLabel(label, $event)\"\n          :style=\"labelStyle(label)\"\n          :title=\"label.description\"\n          data-container=\"body\">\n          {{ label.title }}\n        </button>\n      </div>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/issue_card_inner.js","import FilteredSearchBoards from '../../filtered_search_boards';\nimport FilteredSearchContainer from '../../../filtered_search/container';\n\nexport default {\n  name: 'modal-filters',\n  props: {\n    store: {\n      type: Object,\n      required: true,\n    },\n  },\n  mounted() {\n    FilteredSearchContainer.container = this.$el;\n\n    this.filteredSearch = new FilteredSearchBoards(this.store);\n    this.filteredSearch.setup();\n    this.filteredSearch.removeTokens();\n    this.filteredSearch.handleInputPlaceholder();\n    this.filteredSearch.toggleClearSearchButton();\n  },\n  destroyed() {\n    this.filteredSearch.cleanup();\n    FilteredSearchContainer.container = document;\n    this.store.path = '';\n  },\n  template: '#js-board-modal-filter',\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/filters.js","import Vue from 'vue';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalTabs = Vue.extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data() {\n    return ModalStore.store;\n  },\n  computed: {\n    selectedCount() {\n      return ModalStore.selectedCount();\n    },\n  },\n  destroyed() {\n    this.activeTab = 'all';\n  },\n  template: `\n    <div class=\"top-area prepend-top-10 append-bottom-10\">\n      <ul class=\"nav-links issues-state-filters\">\n        <li :class=\"{ 'active': activeTab == 'all' }\">\n          <a\n            href=\"#\"\n            role=\"button\"\n            @click.prevent=\"changeTab('all')\">\n            Open issues\n            <span class=\"badge\">\n              {{ issuesCount }}\n            </span>\n          </a>\n        </li>\n        <li :class=\"{ 'active': activeTab == 'selected' }\">\n          <a\n            href=\"#\"\n            role=\"button\"\n            @click.prevent=\"changeTab('selected')\">\n            Selected issues\n            <span class=\"badge\">\n              {{ selectedCount }}\n            </span>\n          </a>\n        </li>\n      </ul>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/tabs.js","import Vue from 'vue';\nimport modalFilters from './filters';\nimport './tabs';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalHeader = Vue.extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  props: {\n    projectId: {\n      type: Number,\n      required: true,\n    },\n    milestonePath: {\n      type: String,\n      required: true,\n    },\n    labelPath: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return ModalStore.store;\n  },\n  computed: {\n    selectAllText() {\n      if (ModalStore.selectedCount() !== this.issues.length || this.issues.length === 0) {\n        return '全选';\n      }\n\n      return '取消全选';\n    },\n    showSearch() {\n      return this.activeTab === 'all' && !this.loading && this.issuesCount > 0;\n    },\n  },\n  methods: {\n    toggleAll() {\n      this.$refs.selectAllBtn.blur();\n\n      ModalStore.toggleAll();\n    },\n  },\n  components: {\n    'modal-tabs': gl.issueBoards.ModalTabs,\n    modalFilters,\n  },\n  template: `\n    <div>\n      <header class=\"add-issues-header form-actions\">\n        <h2>\n          添加问题\n          <button\n            type=\"button\"\n            class=\"close\"\n            data-dismiss=\"modal\"\n            aria-label=\"关闭\"\n            @click=\"toggleModal(false)\">\n            <span aria-hidden=\"true\">×</span>\n          </button>\n        </h2>\n      </header>\n      <modal-tabs v-if=\"!loading && issuesCount > 0\"></modal-tabs>\n      <div\n        class=\"add-issues-search append-bottom-10\"\n        v-if=\"showSearch\">\n        <modal-filters :store=\"filter\" />\n        <button\n          type=\"button\"\n          class=\"btn btn-success btn-inverted prepend-left-10\"\n          ref=\"selectAllBtn\"\n          @click=\"toggleAll\">\n          {{ selectAllText }}\n        </button>\n      </div>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/header.js","/* global ListIssue */\n\nimport Vue from 'vue';\nimport bp from '../../../breakpoints';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalList = Vue.extend({\n  props: {\n    issueLinkBase: {\n      type: String,\n      required: true,\n    },\n    rootPath: {\n      type: String,\n      required: true,\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return ModalStore.store;\n  },\n  watch: {\n    activeTab() {\n      if (this.activeTab === 'all') {\n        ModalStore.purgeUnselectedIssues();\n      }\n    },\n  },\n  computed: {\n    loopIssues() {\n      if (this.activeTab === 'all') {\n        return this.issues;\n      }\n\n      return this.selectedIssues;\n    },\n    groupedIssues() {\n      const groups = [];\n      this.loopIssues.forEach((issue, i) => {\n        const index = i % this.columns;\n\n        if (!groups[index]) {\n          groups.push([]);\n        }\n\n        groups[index].push(issue);\n      });\n\n      return groups;\n    },\n  },\n  methods: {\n    scrollHandler() {\n      const currentPage = Math.floor(this.issues.length / this.perPage);\n\n      if ((this.scrollTop() > this.scrollHeight() - 100) && !this.loadingNewPage\n        && currentPage === this.page) {\n        this.loadingNewPage = true;\n        this.page += 1;\n      }\n    },\n    toggleIssue(e, issue) {\n      if (e.target.tagName !== 'A') {\n        ModalStore.toggleIssue(issue);\n      }\n    },\n    listHeight() {\n      return this.$refs.list.getBoundingClientRect().height;\n    },\n    scrollHeight() {\n      return this.$refs.list.scrollHeight;\n    },\n    scrollTop() {\n      return this.$refs.list.scrollTop + this.listHeight();\n    },\n    showIssue(issue) {\n      if (this.activeTab === 'all') return true;\n\n      const index = ModalStore.selectedIssueIndex(issue);\n\n      return index !== -1;\n    },\n    setColumnCount() {\n      const breakpoint = bp.getBreakpointSize();\n\n      if (breakpoint === 'lg' || breakpoint === 'md') {\n        this.columns = 3;\n      } else if (breakpoint === 'sm') {\n        this.columns = 2;\n      } else {\n        this.columns = 1;\n      }\n    },\n  },\n  mounted() {\n    this.scrollHandlerWrapper = this.scrollHandler.bind(this);\n    this.setColumnCountWrapper = this.setColumnCount.bind(this);\n    this.setColumnCount();\n\n    this.$refs.list.addEventListener('scroll', this.scrollHandlerWrapper);\n    window.addEventListener('resize', this.setColumnCountWrapper);\n  },\n  beforeDestroy() {\n    this.$refs.list.removeEventListener('scroll', this.scrollHandlerWrapper);\n    window.removeEventListener('resize', this.setColumnCountWrapper);\n  },\n  components: {\n    'issue-card-inner': gl.issueBoards.IssueCardInner,\n  },\n  template: `\n    <section\n      class=\"add-issues-list add-issues-list-columns\"\n      ref=\"list\">\n      <div\n        class=\"empty-state add-issues-empty-state-filter text-center\"\n        v-if=\"issuesCount > 0 && issues.length === 0\">\n        <div\n          class=\"svg-content\">\n          <img :src=\"emptyStateSvg\"/>\n        </div>\n        <div class=\"text-content\">\n          <h4>\n            There are no issues to show.\n          </h4>\n        </div>\n      </div>\n      <div\n        v-for=\"group in groupedIssues\"\n        class=\"add-issues-list-column\">\n        <div\n          v-for=\"issue in group\"\n          v-if=\"showIssue(issue)\"\n          class=\"card-parent\">\n          <div\n            class=\"card\"\n            :class=\"{ 'is-active': issue.selected }\"\n            @click=\"toggleIssue($event, issue)\">\n            <issue-card-inner\n              :issue=\"issue\"\n              :issue-link-base=\"issueLinkBase\"\n              :root-path=\"rootPath\">\n            </issue-card-inner>\n            <span\n              :aria-label=\"'Issue #' + issue.id + ' selected'\"\n              aria-checked=\"true\"\n              v-if=\"issue.selected\"\n              class=\"issue-card-selected text-center\">\n              <i class=\"fa fa-check\"></i>\n            </span>\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/list.js","import Vue from 'vue';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalFooterListsDropdown = Vue.extend({\n  data() {\n    return {\n      modal: ModalStore.store,\n      state: gl.issueBoards.BoardsStore.state,\n    };\n  },\n  computed: {\n    selected() {\n      return this.modal.selectedList || this.state.lists[1];\n    },\n  },\n  destroyed() {\n    this.modal.selectedList = null;\n  },\n  template: `\n    <div class=\"dropdown inline\">\n      <button\n        class=\"dropdown-menu-toggle\"\n        type=\"button\"\n        data-toggle=\"dropdown\"\n        aria-expanded=\"false\">\n        <span\n          class=\"dropdown-label-box\"\n          :style=\"{ backgroundColor: selected.label.color }\">\n        </span>\n        {{ selected.title }}\n        <i class=\"fa fa-chevron-down\"></i>\n      </button>\n      <div class=\"dropdown-menu dropdown-menu-selectable dropdown-menu-drop-up\">\n        <ul>\n          <li\n            v-for=\"list in state.lists\"\n            v-if=\"list.type == 'label'\">\n            <a\n              href=\"#\"\n              role=\"button\"\n              :class=\"{ 'is-active': list.id == selected.id }\"\n              @click.prevent=\"modal.selectedList = list\">\n              <span\n                class=\"dropdown-label-box\"\n                :style=\"{ backgroundColor: list.label.color }\">\n              </span>\n              {{ list.title }}\n            </a>\n          </li>\n        </ul>\n      </div>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/lists_dropdown.js","/* eslint-disable no-new */\n\nimport Vue from 'vue';\nimport Flash from '../../../flash';\nimport './lists_dropdown';\nimport { pluralize } from '../../../lib/utils/text_utility';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalFooter = Vue.extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data() {\n    return {\n      modal: ModalStore.store,\n      state: gl.issueBoards.BoardsStore.state,\n    };\n  },\n  computed: {\n    submitDisabled() {\n      return !ModalStore.selectedCount();\n    },\n    submitText() {\n      const count = ModalStore.selectedCount();\n\n      return `添加 ${count > 0 ? count : ''} ${pluralize('问题', count)}`;\n    },\n  },\n  methods: {\n    addIssues() {\n      const firstListIndex = 1;\n      const list = this.modal.selectedList || this.state.lists[firstListIndex];\n      const selectedIssues = ModalStore.getSelectedIssues();\n      const issueIds = selectedIssues.map(issue => issue.id);\n\n      // Post the data to the backend\n      gl.boardService.bulkUpdate(issueIds, {\n        add_label_ids: [list.label.id],\n      }).catch(() => {\n        new Flash('问题更新失败,请重试。', 'alert');\n\n        selectedIssues.forEach((issue) => {\n          list.removeIssue(issue);\n          list.issuesSize -= 1;\n        });\n      });\n\n      // Add the issues on the frontend\n      selectedIssues.forEach((issue) => {\n        list.addIssue(issue);\n        list.issuesSize += 1;\n      });\n\n      this.toggleModal(false);\n    },\n  },\n  components: {\n    'lists-dropdown': gl.issueBoards.ModalFooterListsDropdown,\n  },\n  template: `\n    <footer\n      class=\"form-actions add-issues-footer\">\n      <div class=\"pull-left\">\n        <button\n          class=\"btn btn-success\"\n          type=\"button\"\n          :disabled=\"submitDisabled\"\n          @click=\"addIssues\">\n          {{ submitText }}\n        </button>\n        <span class=\"inline add-issues-footer-to-list\">\n          到列表\n        </span>\n        <lists-dropdown></lists-dropdown>\n      </div>\n      <button\n        class=\"btn btn-default pull-right\"\n        type=\"button\"\n        @click=\"toggleModal(false)\">\n        取消\n      </button>\n    </footer>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/footer.js","import Vue from 'vue';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalEmptyState = Vue.extend({\n  mixins: [gl.issueBoards.ModalMixins],\n  data() {\n    return ModalStore.store;\n  },\n  props: {\n    newIssuePath: {\n      type: String,\n      required: true,\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true,\n    },\n  },\n  computed: {\n    contents() {\n      const obj = {\n        title: '您的项目还没有添加任何的问题。',\n        content: `\n          问题可以是要讨论的Bug,任务或概念。\n          此外,问题是可搜索、可过滤的。\n        `,\n      };\n\n      if (this.activeTab === 'selected') {\n        obj.title = '您还没有选择一个问题';\n        obj.content = `\n          返回 <strong>未关闭问题</strong> 并选择一些问题\n          来增加到看板。\n        `;\n      }\n\n      return obj;\n    },\n  },\n  template: `\n    <section class=\"empty-state\">\n      <div class=\"row\">\n        <div class=\"col-xs-12 col-sm-6 col-sm-push-6\">\n          <aside class=\"svg-content\"><img :src=\"emptyStateSvg\"/></aside>\n        </div>\n        <div class=\"col-xs-12 col-sm-6 col-sm-pull-6\">\n          <div class=\"text-content\">\n            <h4>{{ contents.title }}</h4>\n            <p v-html=\"contents.content\"></p>\n            <a\n              :href=\"newIssuePath\"\n              class=\"btn btn-success btn-inverted\"\n              v-if=\"activeTab === 'all'\">\n              新建问题\n            </a>\n            <button\n              type=\"button\"\n              class=\"btn btn-default\"\n              @click=\"changeTab('all')\"\n              v-if=\"activeTab === 'selected'\">\n              未关闭问题\n            </button>\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/empty_state.js","/* global ListIssue */\n\nimport Vue from 'vue';\nimport queryData from '~/boards/utils/query_data';\nimport loadingIcon from '~/vue_shared/components/loading_icon.vue';\nimport './header';\nimport './list';\nimport './footer';\nimport './empty_state';\n\nconst ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.IssuesModal = Vue.extend({\n  props: {\n    newIssuePath: {\n      type: String,\n      required: true,\n    },\n    emptyStateSvg: {\n      type: String,\n      required: true,\n    },\n    issueLinkBase: {\n      type: String,\n      required: true,\n    },\n    rootPath: {\n      type: String,\n      required: true,\n    },\n    projectId: {\n      type: Number,\n      required: true,\n    },\n    milestonePath: {\n      type: String,\n      required: true,\n    },\n    labelPath: {\n      type: String,\n      required: true,\n    },\n  },\n  data() {\n    return ModalStore.store;\n  },\n  watch: {\n    page() {\n      this.loadIssues();\n    },\n    showAddIssuesModal() {\n      if (this.showAddIssuesModal && !this.issues.length) {\n        this.loading = true;\n        const loadingDone = () => {\n          this.loading = false;\n        };\n\n        this.loadIssues()\n          .then(loadingDone)\n          .catch(loadingDone);\n      } else if (!this.showAddIssuesModal) {\n        this.issues = [];\n        this.selectedIssues = [];\n        this.issuesCount = false;\n      }\n    },\n    filter: {\n      handler() {\n        if (this.$el.tagName) {\n          this.page = 1;\n          this.filterLoading = true;\n          const loadingDone = () => {\n            this.filterLoading = false;\n          };\n\n          this.loadIssues(true)\n            .then(loadingDone)\n            .catch(loadingDone);\n        }\n      },\n      deep: true,\n    },\n  },\n  methods: {\n    loadIssues(clearIssues = false) {\n      if (!this.showAddIssuesModal) return false;\n\n      return gl.boardService.getBacklog(queryData(this.filter.path, {\n        page: this.page,\n        per: this.perPage,\n      }))\n      .then(resp => resp.json())\n      .then((data) => {\n        if (clearIssues) {\n          this.issues = [];\n        }\n\n        data.issues.forEach((issueObj) => {\n          const issue = new ListIssue(issueObj);\n          const foundSelectedIssue = ModalStore.findSelectedIssue(issue);\n          issue.selected = !!foundSelectedIssue;\n\n          this.issues.push(issue);\n        });\n\n        this.loadingNewPage = false;\n\n        if (!this.issuesCount) {\n          this.issuesCount = data.size;\n        }\n      }).catch(() => {\n        // TODO: handle request error\n      });\n    },\n  },\n  computed: {\n    showList() {\n      if (this.activeTab === 'selected') {\n        return this.selectedIssues.length > 0;\n      }\n\n      return this.issuesCount > 0;\n    },\n    showEmptyState() {\n      if (!this.loading && this.issuesCount === 0) {\n        return true;\n      }\n\n      return this.activeTab === 'selected' && this.selectedIssues.length === 0;\n    },\n  },\n  created() {\n    this.page = 1;\n  },\n  components: {\n    'modal-header': gl.issueBoards.ModalHeader,\n    'modal-list': gl.issueBoards.ModalList,\n    'modal-footer': gl.issueBoards.ModalFooter,\n    'empty-state': gl.issueBoards.ModalEmptyState,\n    loadingIcon,\n  },\n  template: `\n    <div\n      class=\"add-issues-modal\"\n      v-if=\"showAddIssuesModal\">\n      <div class=\"add-issues-container\">\n        <modal-header\n          :project-id=\"projectId\"\n          :milestone-path=\"milestonePath\"\n          :label-path=\"labelPath\">\n        </modal-header>\n        <modal-list\n          :issue-link-base=\"issueLinkBase\"\n          :root-path=\"rootPath\"\n          :empty-state-svg=\"emptyStateSvg\"\n          v-if=\"!loading && showList && !filterLoading\"></modal-list>\n        <empty-state\n          v-if=\"showEmptyState\"\n          :new-issue-path=\"newIssuePath\"\n          :empty-state-svg=\"emptyStateSvg\"></empty-state>\n        <section\n          class=\"add-issues-list text-center\"\n          v-if=\"loading || filterLoading\">\n          <div class=\"add-issues-list-loading\">\n            <loading-icon />\n          </div>\n        </section>\n        <modal-footer></modal-footer>\n      </div>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/modal/index.js","/* eslint-disable func-names, no-new, space-before-function-paren, one-var,\n   promise/catch-or-return */\nimport _ from 'underscore';\nimport CreateLabelDropdown from '../../create_label';\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\nconst Store = gl.issueBoards.BoardsStore;\n\n$(document).off('created.label').on('created.label', (e, label) => {\n  Store.new({\n    title: label.title,\n    position: Store.state.lists.length - 2,\n    list_type: 'label',\n    label: {\n      id: label.id,\n      title: label.title,\n      color: label.color,\n    },\n  });\n});\n\ngl.issueBoards.newListDropdownInit = () => {\n  $('.js-new-board-list').each(function () {\n    const $this = $(this);\n    new CreateLabelDropdown($this.closest('.dropdown').find('.dropdown-new-label'), $this.data('namespace-path'), $this.data('project-path'));\n\n    $this.glDropdown({\n      data(term, callback) {\n        $.get($this.attr('data-list-labels-path'))\n          .then((resp) => {\n            callback(resp);\n          });\n      },\n      renderRow (label) {\n        const active = Store.findList('title', label.title);\n        const $li = $('<li />');\n        const $a = $('<a />', {\n          class: (active ? `is-active js-board-list-${active.id}` : ''),\n          text: label.title,\n          href: '#',\n        });\n        const $labelColor = $('<span />', {\n          class: 'dropdown-label-box',\n          style: `background-color: ${label.color}`,\n        });\n\n        return $li.append($a.prepend($labelColor));\n      },\n      search: {\n        fields: ['title'],\n      },\n      filterable: true,\n      selectable: true,\n      multiSelect: true,\n      clicked (options) {\n        const { e } = options;\n        const label = options.selectedObj;\n        e.preventDefault();\n\n        if (!Store.findList('title', label.title)) {\n          Store.new({\n            title: label.title,\n            position: Store.state.lists.length - 2,\n            list_type: 'label',\n            label: {\n              id: label.id,\n              title: label.title,\n              color: label.color,\n            },\n          });\n\n          Store.state.lists = _.sortBy(Store.state.lists, 'position');\n        }\n      },\n    });\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/new_list_dropdown.js","/* eslint-disable no-new */\n\nimport Vue from 'vue';\nimport Flash from '../../../flash';\n\nconst Store = gl.issueBoards.BoardsStore;\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.RemoveIssueBtn = Vue.extend({\n  props: {\n    issue: {\n      type: Object,\n      required: true,\n    },\n    list: {\n      type: Object,\n      required: true,\n    },\n    issueUpdate: {\n      type: String,\n      required: true,\n    },\n  },\n  computed: {\n    updateUrl() {\n      return this.issueUpdate;\n    },\n  },\n  methods: {\n    removeIssue() {\n      const issue = this.issue;\n      const lists = issue.getLists();\n      const listLabelIds = lists.map(list => list.label.id);\n      let labelIds = this.issue.labels\n        .map(label => label.id)\n        .filter(id => !listLabelIds.includes(id));\n      if (labelIds.length === 0) {\n        labelIds = [''];\n      }\n      const data = {\n        issue: {\n          label_ids: labelIds,\n        },\n      };\n      Vue.http.patch(this.updateUrl, data).catch(() => {\n        new Flash('Failed to remove issue from board, please try again.', 'alert');\n\n        lists.forEach((list) => {\n          list.addIssue(issue);\n        });\n      });\n\n      // Remove from the frontend store\n      lists.forEach((list) => {\n        list.removeIssue(issue);\n      });\n\n      Store.detail.issue = {};\n    },\n  },\n  template: `\n    <div\n      class=\"block list\">\n      <button\n        class=\"btn btn-default btn-block\"\n        type=\"button\"\n        @click=\"removeIssue\">\n        Remove from board\n      </button>\n    </div>\n  `,\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/components/sidebar/remove_issue.js","import Vue from 'vue';\n\nexport default new Vue();\n\n\n\n// WEBPACK FOOTER //\n// ./boards/eventhub.js","/* eslint-disable class-methods-use-this */\nimport FilteredSearchContainer from '../filtered_search/container';\n\nexport default class FilteredSearchBoards extends gl.FilteredSearchManager {\n  constructor(store, updateUrl = false, cantEdit = []) {\n    super('boards');\n\n    this.store = store;\n    this.updateUrl = updateUrl;\n\n    // Issue boards is slightly different, we handle all the requests async\n    // instead or reloading the page, we just re-fire the list ajax requests\n    this.isHandledAsync = true;\n    this.cantEdit = cantEdit.filter(i => typeof i === 'string');\n    this.cantEditWithValue = cantEdit.filter(i => typeof i === 'object');\n  }\n\n  updateObject(path) {\n    this.store.path = path.substr(1);\n\n    if (this.updateUrl) {\n      gl.issueBoards.BoardsStore.updateFiltersUrl();\n    }\n  }\n\n  removeTokens() {\n    const tokens = FilteredSearchContainer.container.querySelectorAll('.js-visual-token');\n\n    // Remove all the tokens as they will be replaced by the search manager\n    [].forEach.call(tokens, (el) => {\n      el.parentNode.removeChild(el);\n    });\n\n    this.filteredSearchInput.value = '';\n  }\n\n  updateTokens() {\n    this.removeTokens();\n\n    this.loadSearchParamsFromURL();\n\n    // Get the placeholder back if search is empty\n    this.filteredSearchInput.dispatchEvent(new Event('input'));\n  }\n\n  canEdit(tokenName, tokenValue) {\n    if (this.cantEdit.includes(tokenName)) return false;\n    return this.cantEditWithValue.findIndex(token => token.name === tokenName &&\n      token.value === tokenValue) === -1;\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./boards/filtered_search_boards.js","/* global dateFormat */\n\nimport Vue from 'vue';\n\nVue.filter('due-date', (value) => {\n  const date = new Date(value);\n  return dateFormat(date, 'mmm d, yyyy', true);\n});\n\n\n\n// WEBPACK FOOTER //\n// ./boards/filters/due_date_filters.js","const ModalStore = gl.issueBoards.ModalStore;\n\ngl.issueBoards.ModalMixins = {\n  methods: {\n    toggleModal(toggle) {\n      ModalStore.store.showAddIssuesModal = toggle;\n    },\n    changeTab(tab) {\n      ModalStore.store.activeTab = tab;\n    },\n  },\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/mixins/modal_mixins.js","/* eslint-disable no-unused-vars, no-mixed-operators, comma-dangle */\n/* global DocumentTouch */\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.onStart = () => {\n  $('.has-tooltip').tooltip('hide')\n    .tooltip('disable');\n  document.body.classList.add('is-dragging');\n};\n\ngl.issueBoards.onEnd = () => {\n  $('.has-tooltip').tooltip('enable');\n  document.body.classList.remove('is-dragging');\n};\n\ngl.issueBoards.touchEnabled = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;\n\ngl.issueBoards.getBoardSortableDefaultOptions = (obj) => {\n  const defaultSortOptions = {\n    animation: 200,\n    forceFallback: true,\n    fallbackClass: 'is-dragging',\n    fallbackOnBody: true,\n    ghostClass: 'is-ghost',\n    filter: '.board-delete, .btn',\n    delay: gl.issueBoards.touchEnabled ? 100 : 0,\n    scrollSensitivity: gl.issueBoards.touchEnabled ? 60 : 100,\n    scrollSpeed: 20,\n    onStart: gl.issueBoards.onStart,\n    onEnd: gl.issueBoards.onEnd\n  };\n\n  Object.keys(obj).forEach((key) => { defaultSortOptions[key] = obj[key]; });\n  return defaultSortOptions;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/mixins/sortable_default_options.js","/* eslint-disable no-unused-vars */\n\nclass ListAssignee {\n  constructor(user, defaultAvatar) {\n    this.id = user.id;\n    this.name = user.name;\n    this.username = user.username;\n    this.avatar = user.avatar_url || defaultAvatar;\n  }\n}\n\nwindow.ListAssignee = ListAssignee;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/models/assignee.js","/* eslint-disable no-unused-vars, space-before-function-paren, arrow-body-style, arrow-parens, comma-dangle, max-len */\n/* global ListLabel */\n/* global ListMilestone */\n/* global ListAssignee */\n\nimport Vue from 'vue';\n\nclass ListIssue {\n  constructor (obj, defaultAvatar) {\n    this.id = obj.id;\n    this.iid = obj.iid;\n    this.title = obj.title;\n    this.confidential = obj.confidential;\n    this.dueDate = obj.due_date;\n    this.subscribed = obj.subscribed;\n    this.labels = [];\n    this.assignees = [];\n    this.selected = false;\n    this.position = obj.relative_position || Infinity;\n    this.isFetching = {\n      subscriptions: true,\n    };\n    this.isLoading = {};\n    this.sidebarInfoEndpoint = obj.issue_sidebar_endpoint;\n    this.toggleSubscriptionEndpoint = obj.toggle_subscription_endpoint;\n\n    if (obj.milestone) {\n      this.milestone = new ListMilestone(obj.milestone);\n    }\n\n    obj.labels.forEach((label) => {\n      this.labels.push(new ListLabel(label));\n    });\n\n    this.assignees = obj.assignees.map(a => new ListAssignee(a, defaultAvatar));\n  }\n\n  addLabel (label) {\n    if (!this.findLabel(label)) {\n      this.labels.push(new ListLabel(label));\n    }\n  }\n\n  findLabel (findLabel) {\n    return this.labels.filter(label => label.title === findLabel.title)[0];\n  }\n\n  removeLabel (removeLabel) {\n    if (removeLabel) {\n      this.labels = this.labels.filter(label => removeLabel.title !== label.title);\n    }\n  }\n\n  removeLabels (labels) {\n    labels.forEach(this.removeLabel.bind(this));\n  }\n\n  addAssignee (assignee) {\n    if (!this.findAssignee(assignee)) {\n      this.assignees.push(new ListAssignee(assignee));\n    }\n  }\n\n  findAssignee (findAssignee) {\n    return this.assignees.filter(assignee => assignee.id === findAssignee.id)[0];\n  }\n\n  removeAssignee (removeAssignee) {\n    if (removeAssignee) {\n      this.assignees = this.assignees.filter(assignee => assignee.id !== removeAssignee.id);\n    }\n  }\n\n  removeAllAssignees () {\n    this.assignees = [];\n  }\n\n  getLists () {\n    return gl.issueBoards.BoardsStore.state.lists.filter(list => list.findIssue(this.id));\n  }\n\n  updateData(newData) {\n    Object.assign(this, newData);\n  }\n\n  setFetchingState(key, value) {\n    this.isFetching[key] = value;\n  }\n\n  setLoadingState(key, value) {\n    this.isLoading[key] = value;\n  }\n\n  update (url) {\n    const data = {\n      issue: {\n        milestone_id: this.milestone ? this.milestone.id : null,\n        due_date: this.dueDate,\n        assignee_ids: this.assignees.length > 0 ? this.assignees.map((u) => u.id) : [0],\n        label_ids: this.labels.map((label) => label.id)\n      }\n    };\n\n    if (!data.issue.label_ids.length) {\n      data.issue.label_ids = [''];\n    }\n\n    return Vue.http.patch(url, data);\n  }\n}\n\nwindow.ListIssue = ListIssue;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/models/issue.js","/* eslint-disable no-unused-vars, space-before-function-paren */\n\nclass ListLabel {\n  constructor (obj) {\n    this.id = obj.id;\n    this.title = obj.title;\n    this.type = obj.type;\n    this.color = obj.color;\n    this.textColor = obj.text_color;\n    this.description = obj.description;\n    this.priority = (obj.priority !== null) ? obj.priority : Infinity;\n  }\n}\n\nwindow.ListLabel = ListLabel;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/models/label.js","/* eslint-disable space-before-function-paren, no-underscore-dangle, class-methods-use-this, consistent-return, no-shadow, no-param-reassign, max-len, no-unused-vars */\n/* global ListIssue */\n/* global ListLabel */\nimport queryData from '../utils/query_data';\n\nconst PER_PAGE = 20;\n\nclass List {\n  constructor (obj, defaultAvatar) {\n    this.id = obj.id;\n    this._uid = this.guid();\n    this.position = obj.position;\n    this.title = obj.title;\n    this.type = obj.list_type;\n    this.preset = ['backlog', 'closed', 'blank'].indexOf(this.type) > -1;\n    this.isExpandable = ['backlog', 'closed'].indexOf(this.type) > -1;\n    this.isExpanded = true;\n    this.page = 1;\n    this.loading = true;\n    this.loadingMore = false;\n    this.issues = [];\n    this.issuesSize = 0;\n    this.defaultAvatar = defaultAvatar;\n\n    if (obj.label) {\n      this.label = new ListLabel(obj.label);\n    }\n\n    if (this.type !== 'blank' && this.id) {\n      this.getIssues().catch(() => {\n        // TODO: handle request error\n      });\n    }\n  }\n\n  guid() {\n    const s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n    return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n  }\n\n  save () {\n    return gl.boardService.createList(this.label.id)\n      .then(resp => resp.json())\n      .then((data) => {\n        this.id = data.id;\n        this.type = data.list_type;\n        this.position = data.position;\n\n        return this.getIssues();\n      });\n  }\n\n  destroy () {\n    const index = gl.issueBoards.BoardsStore.state.lists.indexOf(this);\n    gl.issueBoards.BoardsStore.state.lists.splice(index, 1);\n    gl.issueBoards.BoardsStore.updateNewListDropdown(this.id);\n\n    gl.boardService.destroyList(this.id)\n      .catch(() => {\n        // TODO: handle request error\n      });\n  }\n\n  update () {\n    gl.boardService.updateList(this.id, this.position)\n      .catch(() => {\n        // TODO: handle request error\n      });\n  }\n\n  nextPage () {\n    if (this.issuesSize > this.issues.length) {\n      if (this.issues.length / PER_PAGE >= 1) {\n        this.page += 1;\n      }\n\n      return this.getIssues(false);\n    }\n  }\n\n  getIssues (emptyIssues = true) {\n    const data = queryData(gl.issueBoards.BoardsStore.filter.path, { page: this.page });\n\n    if (this.label && data.label_name) {\n      data.label_name = data.label_name.filter(label => label !== this.label.title);\n    }\n\n    if (emptyIssues) {\n      this.loading = true;\n    }\n\n    return gl.boardService.getIssuesForList(this.id, data)\n      .then(resp => resp.json())\n      .then((data) => {\n        this.loading = false;\n        this.issuesSize = data.size;\n\n        if (emptyIssues) {\n          this.issues = [];\n        }\n\n        this.createIssues(data.issues);\n      });\n  }\n\n  newIssue (issue) {\n    this.addIssue(issue, null, 0);\n    this.issuesSize += 1;\n\n    return gl.boardService.newIssue(this.id, issue)\n      .then(resp => resp.json())\n      .then((data) => {\n        issue.id = data.id;\n        issue.iid = data.iid;\n        issue.project = data.project;\n\n        if (this.issuesSize > 1) {\n          const moveBeforeId = this.issues[1].id;\n          gl.boardService.moveIssue(issue.id, null, null, null, moveBeforeId);\n        }\n      });\n  }\n\n  createIssues (data) {\n    data.forEach((issueObj) => {\n      this.addIssue(new ListIssue(issueObj, this.defaultAvatar));\n    });\n  }\n\n  addIssue (issue, listFrom, newIndex) {\n    let moveBeforeId = null;\n    let moveAfterId = null;\n\n    if (!this.findIssue(issue.id)) {\n      if (newIndex !== undefined) {\n        this.issues.splice(newIndex, 0, issue);\n\n        if (this.issues[newIndex - 1]) {\n          moveBeforeId = this.issues[newIndex - 1].id;\n        }\n\n        if (this.issues[newIndex + 1]) {\n          moveAfterId = this.issues[newIndex + 1].id;\n        }\n      } else {\n        this.issues.push(issue);\n      }\n\n      if (this.label) {\n        issue.addLabel(this.label);\n      }\n\n      if (listFrom) {\n        this.issuesSize += 1;\n\n        this.updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId);\n      }\n    }\n  }\n\n  moveIssue (issue, oldIndex, newIndex, moveBeforeId, moveAfterId) {\n    this.issues.splice(oldIndex, 1);\n    this.issues.splice(newIndex, 0, issue);\n\n    gl.boardService.moveIssue(issue.id, null, null, moveBeforeId, moveAfterId)\n      .catch(() => {\n        // TODO: handle request error\n      });\n  }\n\n  updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId) {\n    gl.boardService.moveIssue(issue.id, listFrom.id, this.id, moveBeforeId, moveAfterId)\n      .catch(() => {\n        // TODO: handle request error\n      });\n  }\n\n  findIssue (id) {\n    return this.issues.find(issue => issue.id === id);\n  }\n\n  removeIssue (removeIssue) {\n    this.issues = this.issues.filter((issue) => {\n      const matchesRemove = removeIssue.id === issue.id;\n\n      if (matchesRemove) {\n        this.issuesSize -= 1;\n        issue.removeLabel(this.label);\n      }\n\n      return !matchesRemove;\n    });\n  }\n}\n\nwindow.List = List;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/models/list.js","/* eslint-disable no-unused-vars */\n\nclass ListMilestone {\n  constructor(obj) {\n    this.id = obj.id;\n    this.title = obj.title;\n  }\n}\n\nwindow.ListMilestone = ListMilestone;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/models/milestone.js","/* eslint-disable space-before-function-paren, comma-dangle, no-param-reassign, camelcase, max-len, no-unused-vars */\n\nimport Vue from 'vue';\n\nexport default class BoardService {\n  constructor ({ boardsEndpoint, listsEndpoint, bulkUpdatePath, boardId }) {\n    this.boards = Vue.resource(`${boardsEndpoint}{/id}.json`, {}, {\n      issues: {\n        method: 'GET',\n        url: `${gon.relative_url_root}/-/boards/${boardId}/issues.json`,\n      }\n    });\n    this.lists = Vue.resource(`${listsEndpoint}{/id}`, {}, {\n      generate: {\n        method: 'POST',\n        url: `${listsEndpoint}/generate.json`\n      }\n    });\n    this.issue = Vue.resource(`${gon.relative_url_root}/-/boards/${boardId}/issues{/id}`, {});\n    this.issues = Vue.resource(`${listsEndpoint}{/id}/issues`, {}, {\n      bulkUpdate: {\n        method: 'POST',\n        url: bulkUpdatePath,\n      },\n    });\n  }\n\n  all () {\n    return this.lists.get();\n  }\n\n  generateDefaultLists () {\n    return this.lists.generate({});\n  }\n\n  createList (label_id) {\n    return this.lists.save({}, {\n      list: {\n        label_id\n      }\n    });\n  }\n\n  updateList (id, position) {\n    return this.lists.update({ id }, {\n      list: {\n        position\n      }\n    });\n  }\n\n  destroyList (id) {\n    return this.lists.delete({ id });\n  }\n\n  getIssuesForList (id, filter = {}) {\n    const data = { id };\n    Object.keys(filter).forEach((key) => { data[key] = filter[key]; });\n\n    return this.issues.get(data);\n  }\n\n  moveIssue (id, from_list_id = null, to_list_id = null, move_before_id = null, move_after_id = null) {\n    return this.issue.update({ id }, {\n      from_list_id,\n      to_list_id,\n      move_before_id,\n      move_after_id,\n    });\n  }\n\n  newIssue (id, issue) {\n    return this.issues.save({ id }, {\n      issue\n    });\n  }\n\n  getBacklog(data) {\n    return this.boards.issues(data);\n  }\n\n  bulkUpdate(issueIds, extraData = {}) {\n    const data = {\n      update: Object.assign(extraData, {\n        issuable_ids: issueIds.join(','),\n      }),\n    };\n\n    return this.issues.bulkUpdate(data);\n  }\n\n  static getIssueInfo(endpoint) {\n    return Vue.http.get(endpoint);\n  }\n\n  static toggleIssueSubscription(endpoint) {\n    return Vue.http.post(endpoint);\n  }\n}\n\nwindow.BoardService = BoardService;\n\n\n\n// WEBPACK FOOTER //\n// ./boards/services/board_service.js","/* eslint-disable comma-dangle, space-before-function-paren, one-var, no-shadow, dot-notation, max-len */\n/* global List */\nimport _ from 'underscore';\nimport Cookies from 'js-cookie';\nimport { getUrlParamsArray } from '../../lib/utils/common_utils';\n\nwindow.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\ngl.issueBoards.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: '欢迎来到您的问题看板!',\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 Cookies.get('issue_board_welcome_hidden') === 'true';\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      // Add to new lists issues if it doesn't already exist\n      listTo.addIssue(issue, listFrom, newIndex);\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 {\n      listFrom.removeIssue(issue);\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    return this.state.lists.filter((list) => {\n      const byType = type ? list['type'] === type : true;\n\n      return list[key] === val && byType;\n    })[0];\n  },\n  updateFiltersUrl () {\n    history.pushState(null, null, `?${this.filter.path}`);\n  }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./boards/stores/boards_store.js","window.gl = window.gl || {};\nwindow.gl.issueBoards = window.gl.issueBoards || {};\n\nclass ModalStore {\n  constructor() {\n    this.store = {\n      columns: 3,\n      issues: [],\n      issuesCount: false,\n      selectedIssues: [],\n      showAddIssuesModal: false,\n      activeTab: 'all',\n      selectedList: null,\n      searchTerm: '',\n      loading: false,\n      loadingNewPage: false,\n      filterLoading: false,\n      page: 1,\n      perPage: 50,\n      filter: {\n        path: '',\n      },\n    };\n  }\n\n  selectedCount() {\n    return this.getSelectedIssues().length;\n  }\n\n  toggleIssue(issueObj) {\n    const issue = issueObj;\n    const selected = issue.selected;\n\n    issue.selected = !selected;\n\n    if (!selected) {\n      this.addSelectedIssue(issue);\n    } else {\n      this.removeSelectedIssue(issue);\n    }\n  }\n\n  toggleAll() {\n    const select = this.selectedCount() !== this.store.issues.length;\n\n    this.store.issues.forEach((issue) => {\n      const issueUpdate = issue;\n\n      if (issueUpdate.selected !== select) {\n        issueUpdate.selected = select;\n\n        if (select) {\n          this.addSelectedIssue(issue);\n        } else {\n          this.removeSelectedIssue(issue);\n        }\n      }\n    });\n  }\n\n  getSelectedIssues() {\n    return this.store.selectedIssues.filter(issue => issue.selected);\n  }\n\n  addSelectedIssue(issue) {\n    const index = this.selectedIssueIndex(issue);\n\n    if (index === -1) {\n      this.store.selectedIssues.push(issue);\n    }\n  }\n\n  removeSelectedIssue(issue, forcePurge = false) {\n    if (this.store.activeTab === 'all' || forcePurge) {\n      this.store.selectedIssues = this.store.selectedIssues\n        .filter(fIssue => fIssue.id !== issue.id);\n    }\n  }\n\n  purgeUnselectedIssues() {\n    this.store.selectedIssues.forEach((issue) => {\n      if (!issue.selected) {\n        this.removeSelectedIssue(issue, true);\n      }\n    });\n  }\n\n  selectedIssueIndex(issue) {\n    return this.store.selectedIssues.indexOf(issue);\n  }\n\n  findSelectedIssue(issue) {\n    return this.store.selectedIssues\n      .filter(filteredIssue => filteredIssue.id === issue.id)[0];\n  }\n}\n\ngl.issueBoards.ModalStore = new ModalStore();\n\n\n\n// WEBPACK FOOTER //\n// ./boards/stores/modal_store.js","export default (path, extraData) => path.split('&').reduce((dataParam, filterParam) => {\n  if (filterParam === '') return dataParam;\n\n  const data = dataParam;\n  const paramSplit = filterParam.split('=');\n  const paramKeyNormalized = paramSplit[0].replace('[]', '');\n  const isArray = paramSplit[0].indexOf('[]');\n  const value = decodeURIComponent(paramSplit[1]).replace(/\\+/g, ' ');\n\n  if (isArray !== -1) {\n    if (!data[paramKeyNormalized]) {\n      data[paramKeyNormalized] = [];\n    }\n\n    data[paramKeyNormalized].push(value);\n  } else {\n    data[paramKeyNormalized] = value;\n  }\n\n  return data;\n}, extraData);\n\n\n\n// WEBPACK FOOTER //\n// ./boards/utils/query_data.js","export default {\n  name: 'AssigneeTitle',\n  props: {\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    numberOfAssignees: {\n      type: Number,\n      required: true,\n    },\n    editable: {\n      type: Boolean,\n      required: true,\n    },\n    showToggle: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n  },\n  computed: {\n    assigneeTitle() {\n      const assignees = this.numberOfAssignees;\n      return assignees > 1 ? `${assignees} 个指派` : '个指派';\n    },\n  },\n  template: `\n    <div class=\"title hide-collapsed\">\n      {{assigneeTitle}}\n      <i\n        v-if=\"loading\"\n        aria-hidden=\"true\"\n        class=\"fa fa-spinner fa-spin block-loading\"\n      />\n      <a\n        v-if=\"editable\"\n        class=\"js-sidebar-dropdown-toggle edit-link pull-right\"\n        href=\"#\"\n      >\n        编辑\n      </a>\n      <a\n        v-if=\"showToggle\"\n        aria-label=\"Toggle sidebar\"\n        class=\"gutter-toggle pull-right js-sidebar-toggle\"\n        href=\"#\"\n        role=\"button\"\n      >\n        <i\n          aria-hidden=\"true\"\n          data-hidden=\"true\"\n          class=\"fa fa-angle-double-right\"\n        />\n      </a>\n    </div>\n  `,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./sidebar/components/assignees/assignee_title.js","export default {\n  name: 'Assignees',\n  data() {\n    return {\n      defaultRenderCount: 5,\n      defaultMaxCounter: 99,\n      showLess: true,\n    };\n  },\n  props: {\n    rootPath: {\n      type: String,\n      required: true,\n    },\n    users: {\n      type: Array,\n      required: true,\n    },\n    editable: {\n      type: Boolean,\n      required: true,\n    },\n  },\n  computed: {\n    firstUser() {\n      return this.users[0];\n    },\n    hasMoreThanTwoAssignees() {\n      return this.users.length > 2;\n    },\n    hasMoreThanOneAssignee() {\n      return this.users.length > 1;\n    },\n    hasAssignees() {\n      return this.users.length > 0;\n    },\n    hasNoUsers() {\n      return !this.users.length;\n    },\n    hasOneUser() {\n      return this.users.length === 1;\n    },\n    renderShowMoreSection() {\n      return this.users.length > this.defaultRenderCount;\n    },\n    numberOfHiddenAssignees() {\n      return this.users.length - this.defaultRenderCount;\n    },\n    isHiddenAssignees() {\n      return this.numberOfHiddenAssignees > 0;\n    },\n    hiddenAssigneesLabel() {\n      return `+ ${this.numberOfHiddenAssignees} more`;\n    },\n    collapsedTooltipTitle() {\n      const maxRender = Math.min(this.defaultRenderCount, this.users.length);\n      const renderUsers = this.users.slice(0, maxRender);\n      const names = renderUsers.map(u => u.name);\n\n      if (this.users.length > maxRender) {\n        names.push(`+ ${this.users.length - maxRender} more`);\n      }\n\n      return names.join(', ');\n    },\n    sidebarAvatarCounter() {\n      let counter = `+${this.users.length - 1}`;\n\n      if (this.users.length > this.defaultMaxCounter) {\n        counter = `${this.defaultMaxCounter}+`;\n      }\n\n      return counter;\n    },\n  },\n  methods: {\n    assignSelf() {\n      this.$emit('assign-self');\n    },\n    toggleShowLess() {\n      this.showLess = !this.showLess;\n    },\n    renderAssignee(index) {\n      return !this.showLess || (index < this.defaultRenderCount && this.showLess);\n    },\n    avatarUrl(user) {\n      return user.avatar || user.avatar_url;\n    },\n    assigneeUrl(user) {\n      return `${this.rootPath}${user.username}`;\n    },\n    assigneeAlt(user) {\n      return `${user.name}'s avatar`;\n    },\n    assigneeUsername(user) {\n      return `@${user.username}`;\n    },\n    shouldRenderCollapsedAssignee(index) {\n      const firstTwo = this.users.length <= 2 && index <= 2;\n\n      return index === 0 || firstTwo;\n    },\n  },\n  template: `\n    <div>\n      <div\n        class=\"sidebar-collapsed-icon sidebar-collapsed-user\"\n        :class=\"{ 'multiple-users': hasMoreThanOneAssignee, 'has-tooltip': hasAssignees }\"\n        data-container=\"body\"\n        data-placement=\"left\"\n        :title=\"collapsedTooltipTitle\"\n      >\n        <i\n          v-if=\"hasNoUsers\"\n          aria-label=\"未指派\"\n          class=\"fa fa-user\"\n        />\n        <button\n          type=\"button\"\n          class=\"btn-link\"\n          v-for=\"(user, index) in users\"\n          v-if=\"shouldRenderCollapsedAssignee(index)\"\n        >\n          <img\n            width=\"24\"\n            class=\"avatar avatar-inline s24\"\n            :alt=\"assigneeAlt(user)\"\n            :src=\"avatarUrl(user)\"\n          />\n          <span class=\"author\">\n            {{ user.name }}\n          </span>\n        </button>\n        <button\n          v-if=\"hasMoreThanTwoAssignees\"\n          class=\"btn-link\"\n          type=\"button\"\n        >\n          <span\n            class=\"avatar-counter sidebar-avatar-counter\"\n          >\n            {{ sidebarAvatarCounter }}\n          </span>\n        </button>\n      </div>\n      <div class=\"value hide-collapsed\">\n        <template v-if=\"hasNoUsers\">\n          <span class=\"assign-yourself no-value\">\n            未指派\n            <template v-if=\"editable\">\n             -\n              <button\n                type=\"button\"\n                class=\"btn-link\"\n                @click=\"assignSelf\"\n              >\n                指派给您自己\n              </button>\n            </template>\n          </span>\n        </template>\n        <template v-else-if=\"hasOneUser\">\n          <a\n            class=\"author_link bold\"\n            :href=\"assigneeUrl(firstUser)\"\n          >\n            <img\n              width=\"32\"\n              class=\"avatar avatar-inline s32\"\n              :alt=\"assigneeAlt(firstUser)\"\n              :src=\"avatarUrl(firstUser)\"\n            />\n            <span class=\"author\">\n              {{ firstUser.name }}\n            </span>\n            <span class=\"username\">\n              {{ assigneeUsername(firstUser) }}\n            </span>\n          </a>\n        </template>\n        <template v-else>\n          <div class=\"user-list\">\n            <div\n              class=\"user-item\"\n              v-for=\"(user, index) in users\"\n              v-if=\"renderAssignee(index)\"\n            >\n              <a\n                class=\"user-link has-tooltip\"\n                data-placement=\"bottom\"\n                :href=\"assigneeUrl(user)\"\n                :data-title=\"user.name\"\n              >\n                <img\n                  width=\"32\"\n                  class=\"avatar avatar-inline s32\"\n                  :alt=\"assigneeAlt(user)\"\n                  :src=\"avatarUrl(user)\"\n                />\n              </a>\n            </div>\n          </div>\n          <div\n            v-if=\"renderShowMoreSection\"\n            class=\"user-list-more\"\n          >\n            <button\n              type=\"button\"\n              class=\"btn-link\"\n              @click=\"toggleShowLess\"\n            >\n              <template v-if=\"showLess\">\n                {{ hiddenAssigneesLabel }}\n              </template>\n              <template v-else>\n                - show less\n              </template>\n            </button>\n          </div>\n        </template>\n      </div>\n    </div>\n  `,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./sidebar/components/assignees/assignees.js","<script>\nimport { __ } from '../../../locale';\nimport eventHub from '../../event_hub';\nimport loadingButton from '../../../vue_shared/components/loading_button.vue';\n\nexport default {\n  props: {\n    loading: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    subscribed: {\n      type: Boolean,\n      required: false,\n    },\n    id: {\n      type: Number,\n      required: false,\n    },\n  },\n  components: {\n    loadingButton,\n  },\n  computed: {\n    buttonLabel() {\n      let label;\n      if (this.subscribed === false) {\n        label = __('Subscribe');\n      } else if (this.subscribed === true) {\n        label = __('Unsubscribe');\n      }\n\n      return label;\n    },\n  },\n  methods: {\n    toggleSubscription() {\n      eventHub.$emit('toggleSubscription', this.id);\n    },\n  },\n};\n</script>\n\n<template>\n  <div>\n    <div class=\"sidebar-collapsed-icon\">\n      <i\n        class=\"fa fa-rss\"\n        aria-hidden=\"true\">\n      </i>\n    </div>\n    <span class=\"issuable-header-text hide-collapsed pull-left\">\n      {{ __('Notifications') }}\n    </span>\n    <loading-button\n      ref=\"loadingButton\"\n      class=\"btn btn-default pull-right hide-collapsed js-issuable-subscribe-button\"\n      :loading=\"loading\"\n      :label=\"buttonLabel\"\n      @click=\"toggleSubscription\"\n    />\n  </div>\n</template>\n\n\n\n// WEBPACK FOOTER //\n// sidebar/components/subscriptions/subscriptions.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._m(0,false,false),_vm._v(\" \"),_c('span',{staticClass:\"issuable-header-text hide-collapsed pull-left\"},[_vm._v(\"\\n    \"+_vm._s(_vm.__('Notifications'))+\"\\n  \")]),_vm._v(\" \"),_c('loading-button',{ref:\"loadingButton\",staticClass:\"btn btn-default pull-right hide-collapsed js-issuable-subscribe-button\",attrs:{\"loading\":_vm.loading,\"label\":_vm.buttonLabel},on:{\"click\":_vm.toggleSubscription}})],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sidebar-collapsed-icon\"},[_c('i',{staticClass:\"fa fa-rss\",attrs:{\"aria-hidden\":\"true\"}})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// /opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-331fd250\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!/opt/gitlab/embedded/service/gitlab-rails/node_modules/vue-loader/lib/selector.js?type=template&index=0!./sidebar/components/subscriptions/subscriptions.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nimport __vue_script__ from \"!!babel-loader!../../../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./subscriptions.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-331fd250\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./subscriptions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n  __vue_script__,\n  __vue_template__,\n  __vue_template_functional__,\n  __vue_styles__,\n  __vue_scopeId__,\n  __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./sidebar/components/subscriptions/subscriptions.vue\n// module id = null\n// module chunks = ","import Vue from 'vue';\n\nconst eventHub = new Vue();\n\n// TODO: remove eventHub hack after code splitting refactor\nwindow.emitSidebarEvent = (...args) => eventHub.$emit(...args);\n\nexport default eventHub;\n\n\n\n// WEBPACK FOOTER //\n// ./sidebar/event_hub.js"],"sourceRoot":""}