{"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":""}