diff options
Diffstat (limited to 'app')
18 files changed, 113 insertions, 100 deletions
diff --git a/app/assets/javascripts/ide/ide_router.js b/app/assets/javascripts/ide/ide_router.js index 0fab3ee0f3b..152f77effa3 100644 --- a/app/assets/javascripts/ide/ide_router.js +++ b/app/assets/javascripts/ide/ide_router.js @@ -2,8 +2,8 @@ import Vue from 'vue'; import IdeRouter from '~/ide/ide_router_extension'; import { joinPaths } from '~/lib/utils/url_utility'; import flash from '~/flash'; -import store from './stores'; import { __ } from '~/locale'; +import { syncRouterAndStore } from './sync_router_and_store'; Vue.use(IdeRouter); @@ -33,80 +33,85 @@ const EmptyRouterComponent = { }, }; -const router = new IdeRouter({ - mode: 'history', - base: joinPaths(gon.relative_url_root || '', '/-/ide/'), - routes: [ - { - path: '/project/:namespace+/:project', - component: EmptyRouterComponent, - children: [ - { - path: ':targetmode(edit|tree|blob)/:branchid+/-/*', - component: EmptyRouterComponent, - }, - { - path: ':targetmode(edit|tree|blob)/:branchid+/', - redirect: to => joinPaths(to.path, '/-/'), - }, - { - path: ':targetmode(edit|tree|blob)', - redirect: to => joinPaths(to.path, '/master/-/'), - }, - { - path: 'merge_requests/:mrid', - component: EmptyRouterComponent, - }, - { - path: '', - redirect: to => joinPaths(to.path, '/edit/master/-/'), - }, - ], - }, - ], -}); +// eslint-disable-next-line import/prefer-default-export +export const createRouter = store => { + const router = new IdeRouter({ + mode: 'history', + base: joinPaths(gon.relative_url_root || '', '/-/ide/'), + routes: [ + { + path: '/project/:namespace+/:project', + component: EmptyRouterComponent, + children: [ + { + path: ':targetmode(edit|tree|blob)/:branchid+/-/*', + component: EmptyRouterComponent, + }, + { + path: ':targetmode(edit|tree|blob)/:branchid+/', + redirect: to => joinPaths(to.path, '/-/'), + }, + { + path: ':targetmode(edit|tree|blob)', + redirect: to => joinPaths(to.path, '/master/-/'), + }, + { + path: 'merge_requests/:mrid', + component: EmptyRouterComponent, + }, + { + path: '', + redirect: to => joinPaths(to.path, '/edit/master/-/'), + }, + ], + }, + ], + }); -router.beforeEach((to, from, next) => { - if (to.params.namespace && to.params.project) { - store - .dispatch('getProjectData', { - namespace: to.params.namespace, - projectId: to.params.project, - }) - .then(() => { - const basePath = to.params.pathMatch || ''; - const projectId = `${to.params.namespace}/${to.params.project}`; - const branchId = to.params.branchid; - const mergeRequestId = to.params.mrid; + router.beforeEach((to, from, next) => { + if (to.params.namespace && to.params.project) { + store + .dispatch('getProjectData', { + namespace: to.params.namespace, + projectId: to.params.project, + }) + .then(() => { + const basePath = to.params.pathMatch || ''; + const projectId = `${to.params.namespace}/${to.params.project}`; + const branchId = to.params.branchid; + const mergeRequestId = to.params.mrid; - if (branchId) { - store.dispatch('openBranch', { - projectId, - branchId, - basePath, - }); - } else if (mergeRequestId) { - store.dispatch('openMergeRequest', { - projectId, - mergeRequestId, - targetProjectId: to.query.target_project, - }); - } - }) - .catch(e => { - flash( - __('Error while loading the project data. Please try again.'), - 'alert', - document, - null, - false, - true, - ); - throw e; - }); - } + if (branchId) { + store.dispatch('openBranch', { + projectId, + branchId, + basePath, + }); + } else if (mergeRequestId) { + store.dispatch('openMergeRequest', { + projectId, + mergeRequestId, + targetProjectId: to.query.target_project, + }); + } + }) + .catch(e => { + flash( + __('Error while loading the project data. Please try again.'), + 'alert', + document, + null, + false, + true, + ); + throw e; + }); + } - next(); -}); + next(); + }); -export default router; + syncRouterAndStore(router, store); + + return router; +}; diff --git a/app/assets/javascripts/ide/index.js b/app/assets/javascripts/ide/index.js index 55a0dd848c8..850cfcb05e3 100644 --- a/app/assets/javascripts/ide/index.js +++ b/app/assets/javascripts/ide/index.js @@ -4,7 +4,7 @@ import Translate from '~/vue_shared/translate'; import { identity } from 'lodash'; import ide from './components/ide.vue'; import store from './stores'; -import router from './ide_router'; +import { createRouter } from './ide_router'; import { parseBoolean } from '../lib/utils/common_utils'; import { resetServiceWorkersPublicPath } from '../lib/utils/webpack'; import { DEFAULT_THEME } from './lib/themes'; @@ -32,6 +32,7 @@ export function initIde(el, options = {}) { if (!el) return null; const { rootComponent = ide, extendStore = identity } = options; + const router = createRouter(store); return new Vue({ el, diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js index 734ae57f46f..966ce397ea5 100644 --- a/app/assets/javascripts/ide/stores/actions.js +++ b/app/assets/javascripts/ide/stores/actions.js @@ -7,7 +7,6 @@ import * as types from './mutation_types'; import { decorateFiles } from '../lib/files'; import { stageKeys } from '../constants'; import service from '../services'; -import router from '../ide_router'; import eventHub from '../eventhub'; export const redirectToUrl = (self, url) => visitUrl(url); @@ -262,7 +261,7 @@ export const renameEntry = ({ dispatch, commit, state, getters }, { path, name, } if (newEntry.opened) { - router.push(`/project${newEntry.url}`); + dispatch('router/push', `/project${newEntry.url}`, { root: true }); } } diff --git a/app/assets/javascripts/ide/stores/actions/file.js b/app/assets/javascripts/ide/stores/actions/file.js index 03146e8a315..397decd479d 100644 --- a/app/assets/javascripts/ide/stores/actions/file.js +++ b/app/assets/javascripts/ide/stores/actions/file.js @@ -3,7 +3,6 @@ import { __ } from '~/locale'; import eventHub from '../../eventhub'; import service from '../../services'; import * as types from '../mutation_types'; -import router from '../../ide_router'; import { setPageTitleForFile } from '../utils'; import { viewerTypes, stageKeys } from '../../constants'; @@ -30,10 +29,10 @@ export const closeFile = ({ commit, state, dispatch }, file) => { keyPrefix: nextFileToOpen.staged ? 'staged' : 'unstaged', }); } else { - router.push(`/project${nextFileToOpen.url}`); + dispatch('router/push', `/project${nextFileToOpen.url}`, { root: true }); } } else if (!state.openFiles.length) { - router.push(`/project/${file.projectId}/tree/${file.branchId}/`); + dispatch('router/push', `/project/${file.projectId}/tree/${file.branchId}/`, { root: true }); } eventHub.$emit(`editor.update.model.dispose.${file.key}`); @@ -226,7 +225,7 @@ export const discardFileChanges = ({ dispatch, state, commit, getters }, path) = if (!isDestructiveDiscard && file.path === getters.activeFile?.path) { dispatch('updateDelayViewerUpdated', true) .then(() => { - router.push(`/project${file.url}`); + dispatch('router/push', `/project${file.url}`, { root: true }); }) .catch(e => { throw e; @@ -275,14 +274,16 @@ export const unstageChange = ({ commit, dispatch, getters }, path) => { } }; -export const openPendingTab = ({ commit, getters, state }, { file, keyPrefix }) => { +export const openPendingTab = ({ commit, dispatch, getters, state }, { file, keyPrefix }) => { if (getters.activeFile && getters.activeFile.key === `${keyPrefix}-${file.key}`) return false; state.openFiles.forEach(f => eventHub.$emit(`editor.update.model.dispose.${f.key}`)); commit(types.ADD_PENDING_TAB, { file, keyPrefix }); - router.push(`/project/${file.projectId}/tree/${state.currentBranchId}/`); + dispatch('router/push', `/project/${file.projectId}/tree/${state.currentBranchId}/`, { + root: true, + }); return true; }; diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js index 6c8fb9f90aa..d172bb31ae5 100644 --- a/app/assets/javascripts/ide/stores/actions/project.js +++ b/app/assets/javascripts/ide/stores/actions/project.js @@ -4,7 +4,6 @@ import { __, sprintf } from '~/locale'; import service from '../../services'; import api from '../../../api'; import * as types from '../mutation_types'; -import router from '../../ide_router'; export const getProjectData = ({ commit, state }, { namespace, projectId, force = false } = {}) => new Promise((resolve, reject) => { @@ -57,7 +56,7 @@ export const createNewBranchFromDefault = ({ state, dispatch, getters }, branch) }) .then(() => { dispatch('setErrorMessage', null); - router.push(`${router.currentRoute.path}?${Date.now()}`); + window.location.reload(); }) .catch(() => { dispatch('setErrorMessage', { diff --git a/app/assets/javascripts/ide/stores/index.js b/app/assets/javascripts/ide/stores/index.js index 85550578e94..b5ae85c95ae 100644 --- a/app/assets/javascripts/ide/stores/index.js +++ b/app/assets/javascripts/ide/stores/index.js @@ -11,6 +11,7 @@ import branches from './modules/branches'; import fileTemplates from './modules/file_templates'; import paneModule from './modules/pane'; import clientsideModule from './modules/clientside'; +import routerModule from './modules/router'; Vue.use(Vuex); @@ -28,6 +29,7 @@ export const createStore = () => fileTemplates: fileTemplates(), rightPane: paneModule(), clientside: clientsideModule(), + router: routerModule, }, }); diff --git a/app/assets/javascripts/ide/stores/modules/branches/index.js b/app/assets/javascripts/ide/stores/modules/branches/index.js index 04e7e0f08f1..deda95cd0c9 100644 --- a/app/assets/javascripts/ide/stores/modules/branches/index.js +++ b/app/assets/javascripts/ide/stores/modules/branches/index.js @@ -4,7 +4,7 @@ import mutations from './mutations'; export default { namespaced: true, - state: state(), + state, actions, mutations, }; diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js index 65e2726a976..005bd0240e2 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/actions.js +++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js @@ -3,7 +3,6 @@ import flash from '~/flash'; import httpStatusCodes from '~/lib/utils/http_status'; import * as rootTypes from '../../mutation_types'; import { createCommitPayload, createNewMergeRequestUrl } from '../../utils'; -import router from '../../../ide_router'; import service from '../../../services'; import * as types from './mutation_types'; import consts from './constants'; @@ -196,8 +195,10 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo dispatch('updateViewer', 'editor', { root: true }); if (rootGetters.activeFile) { - router.push( + dispatch( + 'router/push', `/project/${rootState.currentProjectId}/blob/${branchName}/-/${rootGetters.activeFile.path}`, + { root: true }, ); } } diff --git a/app/assets/javascripts/ide/stores/modules/commit/index.js b/app/assets/javascripts/ide/stores/modules/commit/index.js index 3bf65b02847..5cec73bde2e 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/index.js +++ b/app/assets/javascripts/ide/stores/modules/commit/index.js @@ -5,7 +5,7 @@ import * as getters from './getters'; export default { namespaced: true, - state: state(), + state, mutations, actions, getters, diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js index e5cd1b005aa..a60748215ab 100644 --- a/app/assets/javascripts/lib/utils/common_utils.js +++ b/app/assets/javascripts/lib/utils/common_utils.js @@ -724,6 +724,8 @@ export const convertObjectProps = (conversionFunction, obj = {}, options = {}) = } else { acc[conversionFunction(prop)] = convertObjectProps(conversionFunction, val, options); } + } else if (isObjParameterArray) { + acc[prop] = val; } else { acc[conversionFunction(prop)] = val; } diff --git a/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue index 4f1b1c758b2..63de1e009fd 100644 --- a/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue +++ b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue @@ -85,7 +85,7 @@ export default { class="confidential-icon append-right-4 align-self-baseline align-self-md-auto mt-xl-0" :aria-label="__('Confidential')" /> - <a :href="computedPath" class="sortable-link">{{ title }}</a> + <a :href="computedPath" class="sortable-link gl-font-weight-normal">{{ title }}</a> </div> <!-- Info area: meta, path, and assignees --> diff --git a/app/assets/stylesheets/components/related_items_list.scss b/app/assets/stylesheets/components/related_items_list.scss index fd1108a7305..68b1b796ba6 100644 --- a/app/assets/stylesheets/components/related_items_list.scss +++ b/app/assets/stylesheets/components/related_items_list.scss @@ -73,7 +73,6 @@ $item-remove-button-space: 42px; .sortable-link { color: $gray-900; - font-weight: normal; } } diff --git a/app/helpers/subscribable_banner_helper.rb b/app/helpers/subscribable_banner_helper.rb new file mode 100644 index 00000000000..c9d4370f8ad --- /dev/null +++ b/app/helpers/subscribable_banner_helper.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module SubscribableBannerHelper + # Overridden in EE + def display_subscription_banner! + end +end + +SubscribableBannerHelper.prepend_if_ee('EE::SubscribableBannerHelper') diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 032766327ca..7e5bf6ddde1 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,10 +1,6 @@ - breadcrumb_title _("Details") - @content_class = "limit-container-width" unless fluid_layout -= content_for :flash_message do - - if Feature.enabled?(:subscribable_banner_subscription) - = render_if_exists "layouts/header/ee_subscribable_banner", subscription: true - = content_for :meta_tags do = auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity") diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 57445424b26..d1cf83b2a9f 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -6,8 +6,6 @@ .alert-wrapper = render 'shared/outdated_browser' = render_if_exists 'layouts/header/users_over_license_banner' - - if Feature.enabled?(:subscribable_banner_license, default_enabled: true) - = render_if_exists "layouts/header/ee_subscribable_banner" = render_if_exists "layouts/header/licensed_user_count_threshold" = render "layouts/broadcast" = render "layouts/header/read_only_banner" @@ -15,6 +13,7 @@ = yield :flash_message = render "shared/ping_consent" = render_account_recovery_regular_check + = render_if_exists "layouts/header/ee_subscribable_banner" - unless @hide_breadcrumbs = render "layouts/nav/breadcrumbs" .d-flex diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index 49de821f1c2..36b664e5888 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -2,6 +2,7 @@ - page_description @group.description unless page_description - header_title group_title(@group) unless header_title - nav "group" +- display_subscription_banner! - @left_sidebar = true - content_for :page_specific_javascripts do diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index b8ef38272fc..820cb9eea47 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -2,7 +2,8 @@ - page_description @project.description unless page_description - header_title project_title(@project) unless header_title - nav "project" -- @left_sidebar = true +- display_subscription_banner! +- @left_sidebar = true - content_for :project_javascripts do - project = @target_project || @project diff --git a/app/views/projects/_flash_messages.html.haml b/app/views/projects/_flash_messages.html.haml index 8217608db4e..f9222387e97 100644 --- a/app/views/projects/_flash_messages.html.haml +++ b/app/views/projects/_flash_messages.html.haml @@ -8,6 +8,4 @@ - unless project.empty_repo? = render 'shared/auto_devops_implicitly_enabled_banner', project: project = render_if_exists 'projects/above_size_limit_warning', project: project - - if Feature.enabled?(:subscribable_banner_subscription) - = render_if_exists "layouts/header/ee_subscribable_banner", subscription: true = render_if_exists 'shared/shared_runners_minutes_limit', project: project, classes: [container_class, ("limit-container-width" unless fluid_layout)] |