2018-03-09 15:18:59 -05:00
|
|
|
import $ from 'jquery';
|
2017-03-17 13:21:25 -04:00
|
|
|
import Vue from 'vue';
|
2018-02-26 14:43:34 -05:00
|
|
|
|
|
|
|
import Flash from '~/flash';
|
|
|
|
import { __ } from '~/locale';
|
2019-06-07 09:23:10 -04:00
|
|
|
import './models/label';
|
|
|
|
import './models/assignee';
|
2018-02-26 14:43:34 -05:00
|
|
|
|
2019-07-10 03:18:14 -04:00
|
|
|
import FilteredSearchBoards from '~/boards/filtered_search_boards';
|
|
|
|
import eventHub from '~/boards/eventhub';
|
2018-09-19 18:42:20 -04:00
|
|
|
import sidebarEventHub from '~/sidebar/event_hub';
|
2019-07-10 03:18:14 -04:00
|
|
|
import 'ee_else_ce/boards/models/issue';
|
|
|
|
import 'ee_else_ce/boards/models/list';
|
|
|
|
import '~/boards/models/milestone';
|
|
|
|
import '~/boards/models/project';
|
|
|
|
import boardsStore from '~/boards/stores/boards_store';
|
|
|
|
import ModalStore from '~/boards/stores/modal_store';
|
|
|
|
import BoardService from 'ee_else_ce/boards/services/board_service';
|
|
|
|
import modalMixin from '~/boards/mixins/modal_mixins';
|
|
|
|
import '~/boards/filters/due_date_filters';
|
|
|
|
import Board from 'ee_else_ce/boards/components/board';
|
|
|
|
import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar';
|
2019-07-04 10:08:48 -04:00
|
|
|
import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown';
|
2019-07-10 03:18:14 -04:00
|
|
|
import BoardAddIssuesModal from '~/boards/components/modal/index.vue';
|
2018-09-19 18:42:20 -04:00
|
|
|
import '~/vue_shared/vue_resource_interceptor';
|
2019-04-09 06:39:42 -04:00
|
|
|
import {
|
|
|
|
NavigationType,
|
|
|
|
convertObjectPropsToCamelCase,
|
|
|
|
parseBoolean,
|
|
|
|
} from '~/lib/utils/common_utils';
|
2019-07-10 03:18:14 -04:00
|
|
|
import boardConfigToggle from 'ee_else_ce/boards/config_toggle';
|
|
|
|
import toggleFocusMode from 'ee_else_ce/boards/toggle_focus';
|
2019-07-19 03:53:11 -04:00
|
|
|
import {
|
|
|
|
setPromotionState,
|
|
|
|
setWeigthFetchingState,
|
|
|
|
setEpicFetchingState,
|
|
|
|
getMilestoneTitle,
|
|
|
|
getBoardsModalData,
|
|
|
|
} from 'ee_else_ce/boards/ee_functions';
|
2019-07-17 16:42:33 -04:00
|
|
|
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
|
2016-07-28 07:33:04 -04:00
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
let issueBoardsApp;
|
|
|
|
|
2018-02-21 17:28:08 -05:00
|
|
|
export default () => {
|
2017-01-11 22:49:57 -05:00
|
|
|
const $boardApp = document.getElementById('board-app');
|
2016-07-28 07:33:04 -04:00
|
|
|
|
2018-10-02 06:00:58 -04:00
|
|
|
// check for browser back and trigger a hard reload to circumvent browser caching.
|
2018-10-30 16:28:31 -04:00
|
|
|
window.addEventListener('pageshow', event => {
|
|
|
|
const isNavTypeBackForward =
|
|
|
|
window.performance && window.performance.navigation.type === NavigationType.TYPE_BACK_FORWARD;
|
2018-10-02 06:00:58 -04:00
|
|
|
|
|
|
|
if (event.persisted || isNavTypeBackForward) {
|
|
|
|
window.location.reload();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
if (issueBoardsApp) {
|
|
|
|
issueBoardsApp.$destroy(true);
|
2016-08-05 09:00:06 -04:00
|
|
|
}
|
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
boardsStore.create();
|
2019-06-11 06:40:01 -04:00
|
|
|
boardsStore.setTimeTrackingLimitToHours($boardApp.dataset.timeTrackingLimitToHours);
|
2017-04-07 15:36:09 -04:00
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
issueBoardsApp = new Vue({
|
2016-08-16 04:02:45 -04:00
|
|
|
el: $boardApp,
|
2016-08-15 05:07:53 -04:00
|
|
|
components: {
|
2018-10-10 13:08:43 -04:00
|
|
|
Board,
|
|
|
|
BoardSidebar,
|
2018-06-26 08:29:06 -04:00
|
|
|
BoardAddIssuesModal,
|
2016-08-15 05:07:53 -04:00
|
|
|
},
|
2016-07-28 07:33:04 -04:00
|
|
|
data: {
|
2018-10-10 13:08:43 -04:00
|
|
|
state: boardsStore.state,
|
2016-08-11 04:51:52 -04:00
|
|
|
loading: true,
|
2017-09-06 01:02:30 -04:00
|
|
|
boardsEndpoint: $boardApp.dataset.boardsEndpoint,
|
2019-03-01 11:32:05 -05:00
|
|
|
recentBoardsEndpoint: $boardApp.dataset.recentBoardsEndpoint,
|
2017-09-06 01:02:30 -04:00
|
|
|
listsEndpoint: $boardApp.dataset.listsEndpoint,
|
2016-10-11 04:29:47 -04:00
|
|
|
boardId: $boardApp.dataset.boardId,
|
2018-11-21 10:20:32 -05:00
|
|
|
disabled: parseBoolean($boardApp.dataset.disabled),
|
2016-10-19 17:26:51 -04:00
|
|
|
issueLinkBase: $boardApp.dataset.issueLinkBase,
|
2017-01-31 05:39:44 -05:00
|
|
|
rootPath: $boardApp.dataset.rootPath,
|
2017-01-31 09:35:53 -05:00
|
|
|
bulkUpdatePath: $boardApp.dataset.bulkUpdatePath,
|
2018-10-10 13:08:43 -04:00
|
|
|
detailIssue: boardsStore.detail,
|
2017-05-04 11:33:25 -04:00
|
|
|
defaultAvatar: $boardApp.dataset.defaultAvatar,
|
2016-07-28 07:33:04 -04:00
|
|
|
},
|
2016-10-19 17:26:51 -04:00
|
|
|
computed: {
|
2018-07-25 11:38:43 -04:00
|
|
|
detailIssueVisible() {
|
2016-10-19 17:26:51 -04:00
|
|
|
return Object.keys(this.detailIssue.issue).length;
|
2016-11-04 06:24:59 -04:00
|
|
|
},
|
2016-10-19 17:26:51 -04:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
created() {
|
2019-07-04 10:11:03 -04:00
|
|
|
boardsStore.setEndpoints({
|
2017-09-06 01:02:30 -04:00
|
|
|
boardsEndpoint: this.boardsEndpoint,
|
2019-03-01 11:32:05 -05:00
|
|
|
recentBoardsEndpoint: this.recentBoardsEndpoint,
|
2017-09-06 01:02:30 -04:00
|
|
|
listsEndpoint: this.listsEndpoint,
|
|
|
|
bulkUpdatePath: this.bulkUpdatePath,
|
|
|
|
boardId: this.boardId,
|
|
|
|
});
|
2019-07-04 10:11:03 -04:00
|
|
|
gl.boardService = new BoardService();
|
2018-10-10 13:08:43 -04:00
|
|
|
boardsStore.rootPath = this.boardsEndpoint;
|
2017-03-07 06:05:37 -05:00
|
|
|
|
2017-03-14 07:32:58 -04:00
|
|
|
eventHub.$on('updateTokens', this.updateTokens);
|
2017-11-14 01:05:40 -05:00
|
|
|
eventHub.$on('newDetailIssue', this.updateDetailIssue);
|
|
|
|
eventHub.$on('clearDetailIssue', this.clearDetailIssue);
|
|
|
|
sidebarEventHub.$on('toggleSubscription', this.toggleSubscription);
|
2017-03-09 07:32:43 -05:00
|
|
|
},
|
|
|
|
beforeDestroy() {
|
2017-03-14 07:32:58 -04:00
|
|
|
eventHub.$off('updateTokens', this.updateTokens);
|
2017-11-14 01:05:40 -05:00
|
|
|
eventHub.$off('newDetailIssue', this.updateDetailIssue);
|
|
|
|
eventHub.$off('clearDetailIssue', this.clearDetailIssue);
|
|
|
|
sidebarEventHub.$off('toggleSubscription', this.toggleSubscription);
|
2016-08-08 11:15:05 -04:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
mounted() {
|
2018-10-10 13:08:43 -04:00
|
|
|
this.filterManager = new FilteredSearchBoards(boardsStore.filter, true, boardsStore.cantEdit);
|
2017-09-26 17:19:28 -04:00
|
|
|
this.filterManager.setup();
|
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
boardsStore.disabled = this.disabled;
|
2018-07-25 11:38:43 -04:00
|
|
|
gl.boardService
|
|
|
|
.all()
|
2017-12-15 03:31:14 -05:00
|
|
|
.then(res => res.data)
|
2019-05-30 18:15:03 -04:00
|
|
|
.then(lists => {
|
|
|
|
lists.forEach(listObj => {
|
|
|
|
let { position } = listObj;
|
|
|
|
if (listObj.list_type === 'closed') {
|
|
|
|
position = Infinity;
|
|
|
|
} else if (listObj.list_type === 'backlog') {
|
|
|
|
position = -1;
|
2016-08-04 11:16:50 -04:00
|
|
|
}
|
|
|
|
|
2019-05-30 18:15:03 -04:00
|
|
|
boardsStore.addList(
|
|
|
|
{
|
|
|
|
...listObj,
|
|
|
|
position,
|
|
|
|
},
|
|
|
|
this.defaultAvatar,
|
|
|
|
);
|
|
|
|
});
|
2016-11-09 04:23:48 -05:00
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
boardsStore.addBlankState();
|
2019-07-19 03:53:11 -04:00
|
|
|
setPromotionState(boardsStore);
|
2016-08-08 11:15:05 -04:00
|
|
|
this.loading = false;
|
2017-07-12 10:47:09 -04:00
|
|
|
})
|
2017-12-15 03:31:14 -05:00
|
|
|
.catch(() => {
|
2019-05-01 11:02:06 -04:00
|
|
|
Flash(__('An error occurred while fetching the board lists. Please try again.'));
|
2017-12-15 03:31:14 -05:00
|
|
|
});
|
2017-03-09 07:32:43 -05:00
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
updateTokens() {
|
|
|
|
this.filterManager.updateTokens();
|
2017-11-14 01:05:40 -05:00
|
|
|
},
|
|
|
|
updateDetailIssue(newIssue) {
|
2018-06-16 17:50:13 -04:00
|
|
|
const { sidebarInfoEndpoint } = newIssue;
|
2017-11-14 01:05:40 -05:00
|
|
|
if (sidebarInfoEndpoint && newIssue.subscribed === undefined) {
|
|
|
|
newIssue.setFetchingState('subscriptions', true);
|
2019-07-19 03:53:11 -04:00
|
|
|
setWeigthFetchingState(newIssue, true);
|
|
|
|
setEpicFetchingState(newIssue, true);
|
2017-11-14 01:05:40 -05:00
|
|
|
BoardService.getIssueInfo(sidebarInfoEndpoint)
|
2017-12-15 03:31:14 -05:00
|
|
|
.then(res => res.data)
|
2018-07-25 11:38:43 -04:00
|
|
|
.then(data => {
|
2019-04-09 06:39:42 -04:00
|
|
|
const {
|
|
|
|
subscribed,
|
|
|
|
totalTimeSpent,
|
|
|
|
timeEstimate,
|
|
|
|
humanTimeEstimate,
|
|
|
|
humanTotalTimeSpent,
|
|
|
|
weight,
|
|
|
|
epic,
|
|
|
|
} = convertObjectPropsToCamelCase(data);
|
|
|
|
|
2017-11-14 01:05:40 -05:00
|
|
|
newIssue.setFetchingState('subscriptions', false);
|
2019-07-19 03:53:11 -04:00
|
|
|
setWeigthFetchingState(newIssue, false);
|
|
|
|
setEpicFetchingState(newIssue, false);
|
2017-11-14 01:05:40 -05:00
|
|
|
newIssue.updateData({
|
2019-04-09 06:39:42 -04:00
|
|
|
humanTimeSpent: humanTotalTimeSpent,
|
|
|
|
timeSpent: totalTimeSpent,
|
|
|
|
humanTimeEstimate,
|
|
|
|
timeEstimate,
|
|
|
|
subscribed,
|
|
|
|
weight,
|
|
|
|
epic,
|
2017-11-14 01:05:40 -05:00
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
newIssue.setFetchingState('subscriptions', false);
|
2019-07-19 03:53:11 -04:00
|
|
|
setWeigthFetchingState(newIssue, false);
|
2017-11-14 01:05:40 -05:00
|
|
|
Flash(__('An error occurred while fetching sidebar data'));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-06-04 11:34:17 -04:00
|
|
|
boardsStore.setIssueDetail(newIssue);
|
2017-11-14 01:05:40 -05:00
|
|
|
},
|
|
|
|
clearDetailIssue() {
|
2019-05-30 03:31:42 -04:00
|
|
|
boardsStore.clearDetailIssue();
|
2017-11-14 01:05:40 -05:00
|
|
|
},
|
|
|
|
toggleSubscription(id) {
|
2018-10-10 13:08:43 -04:00
|
|
|
const { issue } = boardsStore.detail;
|
2017-11-14 01:05:40 -05:00
|
|
|
if (issue.id === id && issue.toggleSubscriptionEndpoint) {
|
|
|
|
issue.setFetchingState('subscriptions', true);
|
|
|
|
BoardService.toggleIssueSubscription(issue.toggleSubscriptionEndpoint)
|
|
|
|
.then(() => {
|
|
|
|
issue.setFetchingState('subscriptions', false);
|
|
|
|
issue.updateData({
|
|
|
|
subscribed: !issue.subscribed,
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
issue.setFetchingState('subscriptions', false);
|
|
|
|
Flash(__('An error occurred when toggling the notification subscription'));
|
|
|
|
});
|
|
|
|
}
|
2018-07-25 11:38:43 -04:00
|
|
|
},
|
2017-03-09 07:32:43 -05:00
|
|
|
},
|
2016-07-28 07:33:04 -04:00
|
|
|
});
|
2016-08-30 05:32:19 -04:00
|
|
|
|
2018-10-10 13:08:43 -04:00
|
|
|
// eslint-disable-next-line no-new
|
|
|
|
new Vue({
|
2017-03-08 07:17:01 -05:00
|
|
|
el: document.getElementById('js-add-list'),
|
2016-08-30 05:32:19 -04:00
|
|
|
data: {
|
2018-10-10 13:08:43 -04:00
|
|
|
filters: boardsStore.state.filters,
|
2019-07-19 03:53:11 -04:00
|
|
|
...getMilestoneTitle($boardApp),
|
2016-11-04 06:24:59 -04:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
mounted() {
|
2018-10-10 13:08:43 -04:00
|
|
|
initNewListDropdown();
|
2017-09-06 01:02:30 -04:00
|
|
|
},
|
2016-08-30 05:32:19 -04:00
|
|
|
});
|
2017-01-24 05:27:41 -05:00
|
|
|
|
2019-07-10 03:18:14 -04:00
|
|
|
boardConfigToggle(boardsStore);
|
|
|
|
|
2018-07-25 11:38:43 -04:00
|
|
|
const issueBoardsModal = document.getElementById('js-add-issues-btn');
|
|
|
|
|
|
|
|
if (issueBoardsModal) {
|
2018-10-10 13:08:43 -04:00
|
|
|
// eslint-disable-next-line no-new
|
|
|
|
new Vue({
|
2018-07-25 11:38:43 -04:00
|
|
|
el: issueBoardsModal,
|
|
|
|
mixins: [modalMixin],
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
modal: ModalStore.store,
|
2018-10-10 13:08:43 -04:00
|
|
|
store: boardsStore.state,
|
2019-07-19 03:53:11 -04:00
|
|
|
...getBoardsModalData($boardApp),
|
2018-07-25 11:38:43 -04:00
|
|
|
canAdminList: this.$options.el.hasAttribute('data-can-admin-list'),
|
|
|
|
};
|
2017-01-30 10:56:45 -05:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
computed: {
|
|
|
|
disabled() {
|
|
|
|
if (!this.store) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return !this.store.lists.filter(list => !list.preset).length;
|
|
|
|
},
|
|
|
|
tooltipTitle() {
|
|
|
|
if (this.disabled) {
|
2019-05-01 11:02:06 -04:00
|
|
|
return __('Please add a list to your board first');
|
2018-07-25 11:38:43 -04:00
|
|
|
}
|
2017-02-10 11:13:13 -05:00
|
|
|
|
2018-07-25 11:38:43 -04:00
|
|
|
return '';
|
|
|
|
},
|
2017-02-10 11:13:13 -05:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
watch: {
|
|
|
|
disabled() {
|
|
|
|
this.updateTooltip();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
mounted() {
|
2018-01-03 18:14:55 -05:00
|
|
|
this.updateTooltip();
|
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
methods: {
|
|
|
|
updateTooltip() {
|
|
|
|
const $tooltip = $(this.$refs.addIssuesButton);
|
|
|
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
if (this.disabled) {
|
|
|
|
$tooltip.tooltip();
|
|
|
|
} else {
|
|
|
|
$tooltip.tooltip('dispose');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
openModal() {
|
|
|
|
if (!this.disabled) {
|
|
|
|
this.toggleModal(true);
|
2017-02-10 11:13:13 -05:00
|
|
|
}
|
2018-07-25 11:38:43 -04:00
|
|
|
},
|
2017-02-10 11:13:13 -05:00
|
|
|
},
|
2018-07-25 11:38:43 -04:00
|
|
|
template: `
|
|
|
|
<div class="board-extra-actions">
|
|
|
|
<button
|
2018-09-18 05:58:22 -04:00
|
|
|
class="btn btn-success prepend-left-10"
|
2018-07-25 11:38:43 -04:00
|
|
|
type="button"
|
|
|
|
data-placement="bottom"
|
|
|
|
ref="addIssuesButton"
|
|
|
|
:class="{ 'disabled': disabled }"
|
|
|
|
:title="tooltipTitle"
|
|
|
|
:aria-disabled="disabled"
|
|
|
|
v-if="canAdminList"
|
|
|
|
@click="openModal">
|
|
|
|
Add issues
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
`,
|
|
|
|
});
|
|
|
|
}
|
2019-07-04 06:53:09 -04:00
|
|
|
|
2019-07-19 03:53:11 -04:00
|
|
|
toggleFocusMode(ModalStore, boardsStore, $boardApp);
|
2019-07-04 06:53:09 -04:00
|
|
|
mountMultipleBoardsSwitcher();
|
2018-02-21 17:28:08 -05:00
|
|
|
};
|