import PortalVue from 'portal-vue'; import Vue from 'vue'; import VueApollo from 'vue-apollo'; import toggleEpicsSwimlanes from 'ee_else_ce/boards/toggle_epics_swimlanes'; import toggleLabels from 'ee_else_ce/boards/toggle_labels'; import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue'; import BoardApp from '~/boards/components/board_app.vue'; import '~/boards/filters/due_date_filters'; import { issuableTypes } from '~/boards/constants'; import initBoardsFilteredSearch from '~/boards/mount_filtered_search_issue_boards'; import store from '~/boards/stores'; import toggleFocusMode from '~/boards/toggle_focus'; import { NavigationType, isLoggedIn, parseBoolean } from '~/lib/utils/common_utils'; import { fullBoardId } from './boards_util'; import boardConfigToggle from './config_toggle'; import initNewBoard from './new_board'; import { gqlClient } from './graphql'; import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher'; Vue.use(VueApollo); Vue.use(PortalVue); const apolloProvider = new VueApollo({ defaultClient: gqlClient, }); function mountBoardApp(el) { const { boardId, groupId, fullPath, rootPath } = el.dataset; store.dispatch('fetchBoard', { fullPath, fullBoardId: fullBoardId(boardId), boardType: el.dataset.parent, }); store.dispatch('setInitialBoardData', { boardId, fullBoardId: fullBoardId(boardId), fullPath, boardType: el.dataset.parent, disabled: parseBoolean(el.dataset.disabled) || true, issuableType: issuableTypes.issue, }); // eslint-disable-next-line no-new new Vue({ el, name: 'BoardAppRoot', 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), allowLabelCreate: parseBoolean(el.dataset.canUpdate), allowLabelEdit: parseBoolean(el.dataset.canUpdate), allowScopedLabels: parseBoolean(el.dataset.scopedLabels), }, render: (createComponent) => createComponent(BoardApp), }); } export default () => { const $boardApp = document.getElementById('js-issuable-board-app'); // check for browser back and trigger a hard reload to circumvent browser caching. window.addEventListener('pageshow', (event) => { const isNavTypeBackForward = window.performance && window.performance.navigation.type === NavigationType.TYPE_BACK_FORWARD; if (event.persisted || isNavTypeBackForward) { window.location.reload(); } }); const { releasesFetchPath, epicFeatureAvailable, iterationFeatureAvailable } = $boardApp.dataset; initBoardsFilteredSearch( apolloProvider, isLoggedIn(), releasesFetchPath, parseBoolean(epicFeatureAvailable), parseBoolean(iterationFeatureAvailable), ); mountBoardApp($boardApp); const createColumnTriggerEl = document.querySelector('.js-create-column-trigger'); if (createColumnTriggerEl) { // eslint-disable-next-line no-new new Vue({ el: createColumnTriggerEl, name: 'BoardAddNewColumnTriggerRoot', components: { BoardAddNewColumnTrigger, }, store, render(createElement) { return createElement('board-add-new-column-trigger'); }, }); } boardConfigToggle(); initNewBoard(); toggleFocusMode(); toggleLabels(); if (gon.licensed_features?.swimlanes) { toggleEpicsSwimlanes(); } mountMultipleBoardsSwitcher({ fullPath: $boardApp.dataset.fullPath, rootPath: $boardApp.dataset.boardsEndpoint, allowScopedLabels: $boardApp.dataset.scopedLabels, labelsManagePath: $boardApp.dataset.labelsManagePath, }); };