import Vue from 'vue'; import ChangePasswordView from './views/ChangePasswordView.vue'; import ErrorView from './views/ErrorView.vue'; import ForgotMyPasswordView from './views/ForgotMyPasswordView.vue'; import MainHeader from '@/components/MainHeader/MainHeader.vue'; import MainSidebar from '@/components/MainSidebar.vue'; import NodeView from '@/views/NodeView.vue'; import SettingsPersonalView from './views/SettingsPersonalView.vue'; import SettingsUsersView from './views/SettingsUsersView.vue'; import SettingsCommunityNodesView from './views/SettingsCommunityNodesView.vue'; import SettingsApiView from './views/SettingsApiView.vue'; import SettingsFakeDoorView from './views/SettingsFakeDoorView.vue'; import SetupView from './views/SetupView.vue'; import SigninView from './views/SigninView.vue'; import SignupView from './views/SignupView.vue'; import Router, { Route } from 'vue-router'; import TemplatesCollectionView from '@/views/TemplatesCollectionView.vue'; import TemplatesWorkflowView from '@/views/TemplatesWorkflowView.vue'; import TemplatesSearchView from '@/views/TemplatesSearchView.vue'; import CredentialsView from '@/views/CredentialsView.vue'; import { Store } from 'vuex'; import { IPermissions, IRootState, IWorkflowsState } from './Interface'; import { LOGIN_STATUS, ROLE } from './modules/userHelpers'; import { RouteConfigSingleView } from 'vue-router/types/router'; import { VIEWS } from './constants'; import { store } from './store'; import e from 'express'; Vue.use(Router); interface IRouteConfig extends RouteConfigSingleView { meta: { nodeView?: boolean; templatesEnabled?: boolean; getRedirect?: (store: Store) => {name: string} | false; permissions: IPermissions; telemetry?: { disabled?: true; getProperties: (route: Route, store: Store) => object; }; scrollOffset?: number; }; } function getTemplatesRedirect(store: Store) { const isTemplatesEnabled: boolean = store.getters['settings/isTemplatesEnabled']; if (!isTemplatesEnabled) { return {name: VIEWS.NOT_FOUND}; } return false; } const router = new Router({ mode: 'history', // @ts-ignore base: window.BASE_PATH === '/%BASE_PATH%/' ? '/' : window.BASE_PATH, scrollBehavior(to, from, savedPosition) { // saved position == null means the page is NOT visited from history (back button) if (savedPosition === null && to.name === VIEWS.TEMPLATES && to.meta) { // for templates view, reset scroll position in this case to.meta.setScrollPosition(0); } }, routes: [ { path: '/', name: VIEWS.HOMEPAGE, meta: { getRedirect(store: Store) { return { name: VIEWS.NEW_WORKFLOW }; }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/collections/:id', name: VIEWS.COLLECTION, components: { default: TemplatesCollectionView, sidebar: MainSidebar, }, meta: { templatesEnabled: true, telemetry: { getProperties(route: Route, store: Store) { return { collection_id: route.params.id, wf_template_repo_session_id: store.getters['templates/currentSessionId'], }; }, }, getRedirect: getTemplatesRedirect, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/execution/:id', name: VIEWS.EXECUTION, components: { default: NodeView, header: MainHeader, sidebar: MainSidebar, }, meta: { nodeView: true, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/templates/:id', name: VIEWS.TEMPLATE, components: { default: TemplatesWorkflowView, sidebar: MainSidebar, }, meta: { templatesEnabled: true, getRedirect: getTemplatesRedirect, telemetry: { getProperties(route: Route, store: Store) { return { template_id: route.params.id, wf_template_repo_session_id: store.getters['templates/currentSessionId'], }; }, }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/templates/', name: VIEWS.TEMPLATES, components: { default: TemplatesSearchView, sidebar: MainSidebar, }, meta: { templatesEnabled: true, getRedirect: getTemplatesRedirect, // Templates view remembers it's scroll position on back scrollOffset: 0, telemetry: { getProperties(route: Route, store: Store) { return { wf_template_repo_session_id: store.getters['templates/currentSessionId'], }; }, }, setScrollPosition(pos: number) { this.scrollOffset = pos; }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/credentials', name: VIEWS.CREDENTIALS, components: { default: CredentialsView, sidebar: MainSidebar, }, meta: { permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/workflow', name: VIEWS.NEW_WORKFLOW, components: { default: NodeView, header: MainHeader, sidebar: MainSidebar, }, meta: { nodeView: true, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/workflow/:name', name: VIEWS.WORKFLOW, components: { default: NodeView, header: MainHeader, sidebar: MainSidebar, }, meta: { nodeView: true, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/workflows/demo', name: VIEWS.DEMO, components: { default: NodeView, }, meta: { permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/workflows/templates/:id', name: VIEWS.TEMPLATE_IMPORT, components: { default: NodeView, header: MainHeader, sidebar: MainSidebar, }, meta: { templatesEnabled: true, getRedirect: getTemplatesRedirect, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '/signin', name: VIEWS.SIGNIN, components: { default: SigninView, }, meta: { telemetry: { pageCategory: 'auth', }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedOut], }, }, }, }, { path: '/signup', name: VIEWS.SIGNUP, components: { default: SignupView, }, meta: { telemetry: { pageCategory: 'auth', }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedOut], }, }, }, }, { path: '/setup', name: VIEWS.SETUP, components: { default: SetupView, }, meta: { telemetry: { pageCategory: 'auth', }, permissions: { allow: { role: [ROLE.Default], }, deny: { shouldDeny: () => { return store.getters['settings/isUserManagementEnabled'] === false; }, }, }, }, }, { path: '/forgot-password', name: VIEWS.FORGOT_PASSWORD, components: { default: ForgotMyPasswordView, }, meta: { telemetry: { pageCategory: 'auth', }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedOut], }, }, }, }, { path: '/change-password', name: VIEWS.CHANGE_PASSWORD, components: { default: ChangePasswordView, }, meta: { telemetry: { pageCategory: 'auth', }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedOut], }, }, }, }, { path: '/settings', redirect: '/settings/personal', }, { path: '/settings/users', name: VIEWS.USERS_SETTINGS, components: { default: SettingsUsersView, }, meta: { telemetry: { pageCategory: 'settings', getProperties(route: Route, store: Store) { return { feature: 'users', }; }, }, permissions: { allow: { role: [ROLE.Default, ROLE.Owner], }, deny: { shouldDeny: () => { return store.getters['settings/isUserManagementEnabled'] === false; }, }, }, }, }, { path: '/settings/personal', name: VIEWS.PERSONAL_SETTINGS, components: { default: SettingsPersonalView, }, meta: { telemetry: { pageCategory: 'settings', getProperties(route: Route, store: Store) { return { feature: 'personal', }; }, }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, deny: { role: [ROLE.Default], }, }, }, }, { path: '/settings/api', name: VIEWS.API_SETTINGS, components: { default: SettingsApiView, }, meta: { telemetry: { pageCategory: 'settings', getProperties(route: Route, store: Store) { return { feature: 'api', }; }, }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, deny: { shouldDeny: () => { return store.getters['settings/isPublicApiEnabled'] === false; }, }, }, }, }, { path: '/settings/community-nodes', name: VIEWS.COMMUNITY_NODES, components: { default: SettingsCommunityNodesView, }, meta: { telemetry: { pageCategory: 'settings', }, permissions: { allow: { role: [ROLE.Default, ROLE.Owner], }, deny: { shouldDeny: () => { return store.getters['settings/isCommunityNodesFeatureEnabled'] === false; }, }, }, }, }, { path: '/settings/coming-soon/:featureId', name: VIEWS.FAKE_DOOR, component: SettingsFakeDoorView, props: true, meta: { telemetry: { pageCategory: 'settings', getProperties(route: Route, store: Store) { return { feature: route.params['featureId'], }; }, }, permissions: { allow: { loginStatus: [LOGIN_STATUS.LoggedIn], }, }, }, }, { path: '*', name: VIEWS.NOT_FOUND, component: ErrorView, props: { messageKey: 'error.pageNotFound', errorCode: 404, redirectTextKey: 'error.goBack', redirectPage: VIEWS.HOMEPAGE, }, meta: { nodeView: true, telemetry: { disabled: true, }, permissions: { allow: { // TODO: Once custom permissions are merged, this needs to be updated with index validation loginStatus: [LOGIN_STATUS.LoggedIn, LOGIN_STATUS.LoggedOut], }, }, }, }, ] as IRouteConfig[], }); export default router;