2021-06-23 21:08:33 +00:00
|
|
|
import PortalVue from 'portal-vue';
|
2017-03-17 17:21:25 +00:00
|
|
|
import Vue from 'vue';
|
2021-02-15 21:08:59 +00:00
|
|
|
import VueApollo from 'vue-apollo';
|
2018-02-26 19:43:34 +00:00
|
|
|
|
2021-02-14 18:09:20 +00:00
|
|
|
import toggleEpicsSwimlanes from 'ee_else_ce/boards/toggle_epics_swimlanes';
|
|
|
|
import toggleLabels from 'ee_else_ce/boards/toggle_labels';
|
2021-02-02 15:09:06 +00:00
|
|
|
import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
|
2021-09-09 09:11:16 +00:00
|
|
|
import BoardApp from '~/boards/components/board_app.vue';
|
2021-02-15 21:08:59 +00:00
|
|
|
import '~/boards/filters/due_date_filters';
|
2021-03-05 09:09:07 +00:00
|
|
|
import { issuableTypes } from '~/boards/constants';
|
2021-07-14 03:08:27 +00:00
|
|
|
import initBoardsFilteredSearch from '~/boards/mount_filtered_search_issue_boards';
|
2019-10-28 15:05:58 +00:00
|
|
|
import store from '~/boards/stores';
|
2021-02-15 21:08:59 +00:00
|
|
|
import toggleFocusMode from '~/boards/toggle_focus';
|
2021-11-16 09:13:21 +00:00
|
|
|
import { NavigationType, isLoggedIn, parseBoolean } from '~/lib/utils/common_utils';
|
2021-05-04 09:09:59 +00:00
|
|
|
import { fullBoardId } from './boards_util';
|
2021-02-19 00:11:06 +00:00
|
|
|
import boardConfigToggle from './config_toggle';
|
2021-11-02 12:12:25 +00:00
|
|
|
import initNewBoard from './new_board';
|
2021-09-21 15:12:11 +00:00
|
|
|
import { gqlClient } from './graphql';
|
2019-07-17 20:42:33 +00:00
|
|
|
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
|
2020-04-30 09:09:39 +00:00
|
|
|
|
|
|
|
Vue.use(VueApollo);
|
2021-06-23 21:08:33 +00:00
|
|
|
Vue.use(PortalVue);
|
2020-04-30 09:09:39 +00:00
|
|
|
|
|
|
|
const apolloProvider = new VueApollo({
|
2021-09-21 15:12:11 +00:00
|
|
|
defaultClient: gqlClient,
|
2020-04-30 09:09:39 +00:00
|
|
|
});
|
2016-07-28 11:33:04 +00:00
|
|
|
|
2021-09-09 09:11:16 +00:00
|
|
|
function mountBoardApp(el) {
|
|
|
|
const { boardId, groupId, fullPath, rootPath } = el.dataset;
|
|
|
|
|
|
|
|
store.dispatch('setInitialBoardData', {
|
|
|
|
boardId,
|
|
|
|
fullBoardId: fullBoardId(boardId),
|
|
|
|
fullPath,
|
|
|
|
boardType: el.dataset.parent,
|
|
|
|
disabled: parseBoolean(el.dataset.disabled) || true,
|
|
|
|
issuableType: issuableTypes.issue,
|
|
|
|
boardConfig: {
|
|
|
|
milestoneId: parseInt(el.dataset.boardMilestoneId, 10),
|
|
|
|
milestoneTitle: el.dataset.boardMilestoneTitle || '',
|
|
|
|
iterationId: parseInt(el.dataset.boardIterationId, 10),
|
|
|
|
iterationTitle: el.dataset.boardIterationTitle || '',
|
|
|
|
assigneeId: el.dataset.boardAssigneeId,
|
|
|
|
assigneeUsername: el.dataset.boardAssigneeUsername,
|
|
|
|
labels: el.dataset.labels ? JSON.parse(el.dataset.labels) : [],
|
|
|
|
labelIds: el.dataset.labelIds ? JSON.parse(el.dataset.labelIds) : [],
|
|
|
|
weight: el.dataset.boardWeight ? parseInt(el.dataset.boardWeight, 10) : null,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
// eslint-disable-next-line no-new
|
|
|
|
new Vue({
|
|
|
|
el,
|
2022-02-16 12:13:53 +00:00
|
|
|
name: 'BoardAppRoot',
|
2021-09-09 09:11:16 +00:00
|
|
|
store,
|
|
|
|
apolloProvider,
|
|
|
|
provide: {
|
|
|
|
disabled: parseBoolean(el.dataset.disabled),
|
|
|
|
boardId,
|
|
|
|
groupId: Number(groupId),
|
|
|
|
rootPath,
|
|
|
|
currentUserId: gon.current_user_id || null,
|
|
|
|
canUpdate: parseBoolean(el.dataset.canUpdate),
|
|
|
|
canAdminList: parseBoolean(el.dataset.canAdminList),
|
|
|
|
labelsManagePath: el.dataset.labelsManagePath,
|
|
|
|
labelsFilterBasePath: el.dataset.labelsFilterBasePath,
|
|
|
|
timeTrackingLimitToHours: parseBoolean(el.dataset.timeTrackingLimitToHours),
|
|
|
|
multipleAssigneesFeatureAvailable: parseBoolean(el.dataset.multipleAssigneesFeatureAvailable),
|
|
|
|
epicFeatureAvailable: parseBoolean(el.dataset.epicFeatureAvailable),
|
|
|
|
iterationFeatureAvailable: parseBoolean(el.dataset.iterationFeatureAvailable),
|
|
|
|
weightFeatureAvailable: parseBoolean(el.dataset.weightFeatureAvailable),
|
|
|
|
boardWeight: el.dataset.boardWeight ? parseInt(el.dataset.boardWeight, 10) : null,
|
|
|
|
scopedLabelsAvailable: parseBoolean(el.dataset.scopedLabels),
|
|
|
|
milestoneListsAvailable: parseBoolean(el.dataset.milestoneListsAvailable),
|
|
|
|
assigneeListsAvailable: parseBoolean(el.dataset.assigneeListsAvailable),
|
|
|
|
iterationListsAvailable: parseBoolean(el.dataset.iterationListsAvailable),
|
|
|
|
issuableType: issuableTypes.issue,
|
|
|
|
emailsDisabled: parseBoolean(el.dataset.emailsDisabled),
|
2021-10-13 12:12:20 +00:00
|
|
|
allowLabelCreate: parseBoolean(el.dataset.canUpdate),
|
|
|
|
allowLabelEdit: parseBoolean(el.dataset.canUpdate),
|
|
|
|
allowScopedLabels: parseBoolean(el.dataset.scopedLabels),
|
2021-09-09 09:11:16 +00:00
|
|
|
},
|
|
|
|
render: (createComponent) => createComponent(BoardApp),
|
|
|
|
});
|
|
|
|
}
|
2018-10-10 17:08:43 +00:00
|
|
|
|
2018-02-21 22:28:08 +00:00
|
|
|
export default () => {
|
2021-09-09 09:11:16 +00:00
|
|
|
const $boardApp = document.getElementById('js-issuable-board-app');
|
|
|
|
|
2018-10-02 10:00:58 +00:00
|
|
|
// check for browser back and trigger a hard reload to circumvent browser caching.
|
2020-12-23 21:10:24 +00:00
|
|
|
window.addEventListener('pageshow', (event) => {
|
2018-10-30 20:28:31 +00:00
|
|
|
const isNavTypeBackForward =
|
|
|
|
window.performance && window.performance.navigation.type === NavigationType.TYPE_BACK_FORWARD;
|
2018-10-02 10:00:58 +00:00
|
|
|
|
|
|
|
if (event.persisted || isNavTypeBackForward) {
|
|
|
|
window.location.reload();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-02-18 06:14:34 +00:00
|
|
|
const { releasesFetchPath, epicFeatureAvailable, iterationFeatureAvailable } = $boardApp.dataset;
|
|
|
|
initBoardsFilteredSearch(
|
|
|
|
apolloProvider,
|
|
|
|
isLoggedIn(),
|
|
|
|
releasesFetchPath,
|
|
|
|
parseBoolean(epicFeatureAvailable),
|
|
|
|
parseBoolean(iterationFeatureAvailable),
|
|
|
|
);
|
2021-07-14 03:08:27 +00:00
|
|
|
|
2021-09-09 09:11:16 +00:00
|
|
|
mountBoardApp($boardApp);
|
2016-08-30 09:32:19 +00:00
|
|
|
|
2021-02-02 15:09:06 +00:00
|
|
|
const createColumnTriggerEl = document.querySelector('.js-create-column-trigger');
|
|
|
|
if (createColumnTriggerEl) {
|
|
|
|
// eslint-disable-next-line no-new
|
|
|
|
new Vue({
|
|
|
|
el: createColumnTriggerEl,
|
2022-02-16 12:13:53 +00:00
|
|
|
name: 'BoardAddNewColumnTriggerRoot',
|
2021-02-02 15:09:06 +00:00
|
|
|
components: {
|
|
|
|
BoardAddNewColumnTrigger,
|
|
|
|
},
|
|
|
|
store,
|
|
|
|
render(createElement) {
|
|
|
|
return createElement('board-add-new-column-trigger');
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-09-01 03:11:03 +00:00
|
|
|
boardConfigToggle();
|
2021-11-02 12:12:25 +00:00
|
|
|
initNewBoard();
|
2019-07-10 07:18:14 +00:00
|
|
|
|
2021-03-29 00:09:36 +00:00
|
|
|
toggleFocusMode();
|
2019-10-28 15:05:58 +00:00
|
|
|
toggleLabels();
|
2020-10-15 18:08:43 +00:00
|
|
|
|
2021-03-10 12:09:14 +00:00
|
|
|
if (gon.licensed_features?.swimlanes) {
|
2020-10-15 18:08:43 +00:00
|
|
|
toggleEpicsSwimlanes();
|
|
|
|
}
|
|
|
|
|
2020-12-11 15:10:04 +00:00
|
|
|
mountMultipleBoardsSwitcher({
|
2020-12-23 15:09:54 +00:00
|
|
|
fullPath: $boardApp.dataset.fullPath,
|
2021-01-08 15:10:26 +00:00
|
|
|
rootPath: $boardApp.dataset.boardsEndpoint,
|
2021-11-02 09:09:49 +00:00
|
|
|
allowScopedLabels: $boardApp.dataset.scopedLabels,
|
|
|
|
labelsManagePath: $boardApp.dataset.labelsManagePath,
|
2020-12-11 15:10:04 +00:00
|
|
|
});
|
2018-02-21 22:28:08 +00:00
|
|
|
};
|