-
-
- {{ s__('BulkImport|Import groups from GitLab') }}
+
+
+ {{ s__('BulkImport|Import groups by direct transfer') }}
{{ s__('BulkImport|History') }}
diff --git a/app/assets/javascripts/issues/show/components/header_actions.vue b/app/assets/javascripts/issues/show/components/header_actions.vue
index c362175a99a..a609e864243 100644
--- a/app/assets/javascripts/issues/show/components/header_actions.vue
+++ b/app/assets/javascripts/issues/show/components/header_actions.vue
@@ -320,7 +320,7 @@ export default {
:loading="isToggleStateButtonLoading"
placement="right"
>
-
+
{
- return Array.isArray(fields)
- ? fields.reduce((acc, key) => Object.assign(acc, { [key]: key }), {})
- : fields;
-};
-
-const mapVuexModuleFields = ({ namespaceSelector, fields, vuexHelper, selector } = {}) => {
- // The `vuexHelper` needs an object which maps keys to field selector functions.
- const map = mapValues(normalizeFieldsToObject(fields), (value) => {
- if (!isString(value)) {
- throw new Error(REQUIRE_STRING_ERROR_MESSAGE);
- }
-
- // We need to use a good ol' function to capture the right "this".
- return function mappedFieldSelector(...args) {
- const namespace = namespaceSelector(this);
-
- return selector(namespace, value, ...args);
- };
- });
-
- return vuexHelper(map);
-};
-
-/**
- * Like `mapState`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * computed: {
- * ...mapVuexModuleState(vm => vm.vuexModule, ['foo']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleState = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- vuexHelper: mapState,
- selector: (namespace, value, state) => state[namespace][value],
- });
-
-/**
- * Like `mapActions`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * methods: {
- * ...mapVuexModuleActions(vm => vm.vuexModule, ['fetchFoos']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleActions = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- vuexHelper: mapActions,
- selector: (namespace, value, dispatch, ...args) => dispatch(`${namespace}/${value}`, ...args),
- });
-
-/**
- * Like `mapGetters`, but takes a function in the first param for selecting a namespace.
- *
- * ```
- * computed: {
- * ...mapGetters(vm => vm.vuexModule, ['hasSearchInfo']),
- * }
- * ```
- *
- * @param {Function} namespaceSelector
- * @param {Array|Object} fields
- */
-export const mapVuexModuleGetters = (namespaceSelector, fields) =>
- mapVuexModuleFields({
- namespaceSelector,
- fields,
- // `mapGetters` does not let us pass an object which maps to functions. Thankfully `mapState` does
- // and gives us access to the getters.
- vuexHelper: mapState,
- selector: (namespace, value, state, getters) => getters[`${namespace}/${value}`],
- });
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
index 23d6fa64c64..e99aceb2196 100644
--- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -233,14 +233,11 @@ export default {
-
-
-
- {{ s__('BulkImport|GitLab Migration history') }}
-
-
+
+
+ {{ s__('BulkImport|Direct transfer history') }}
+
+
{{ item.import_url }}
- {{
- s__('BulkImport|Template / File-based import / GitLab Migration')
- }}
+ {{ s__('BulkImport|Template / File-based import / Direct transfer') }}
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index e5d2392b454..69ea29edc14 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -9,7 +9,7 @@ import ServiceDeskSetting from './service_desk_setting.vue';
const CustomEmailWrapper = () => import('./custom_email_wrapper.vue');
export default {
- serviceDeskEmailHelpPath: helpPagePath('/user/project/service_desk.html', {
+ serviceDeskEmailHelpPath: helpPagePath('/user/project/service_desk/configure.html', {
anchor: 'use-an-additional-service-desk-alias-email',
}),
components: {
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
index 5febb6ff0aa..891ad53dd10 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
@@ -132,12 +132,12 @@ export default {
return this.serviceDeskEmail && this.serviceDeskEmail !== this.incomingEmail;
},
emailSuffixHelpUrl() {
- return helpPagePath('user/project/service_desk.html', {
+ return helpPagePath('user/project/service_desk/configure.html', {
anchor: 'configure-a-suffix-for-service-desk-alias-email',
});
},
serviceDeskEmailAddressHelpUrl() {
- return helpPagePath('user/project/service_desk.html', {
+ return helpPagePath('user/project/service_desk/configure.html', {
anchor: 'use-an-additional-service-desk-alias-email',
});
},
diff --git a/app/assets/javascripts/super_sidebar/constants.js b/app/assets/javascripts/super_sidebar/constants.js
index f4da76f4a6e..061c0c855fe 100644
--- a/app/assets/javascripts/super_sidebar/constants.js
+++ b/app/assets/javascripts/super_sidebar/constants.js
@@ -57,3 +57,15 @@ export const DROPDOWN_Y_OFFSET = 4;
export const NAV_ITEM_LINK_ACTIVE_CLASS = 'gl-bg-t-gray-a-08';
export const IMPERSONATING_OFFSET = 34;
+
+// Frequent items constants
+export const FREQUENT_ITEMS = {
+ MAX_COUNT: 20,
+ ELIGIBLE_FREQUENCY: 3,
+};
+
+export const FIFTEEN_MINUTES_IN_MS = 900000;
+
+export const STORAGE_KEY = {
+ projects: 'frequent-projects',
+};
diff --git a/app/assets/javascripts/super_sidebar/utils.js b/app/assets/javascripts/super_sidebar/utils.js
index 2f24eb84f92..18334a7d139 100644
--- a/app/assets/javascripts/super_sidebar/utils.js
+++ b/app/assets/javascripts/super_sidebar/utils.js
@@ -1,6 +1,6 @@
import * as Sentry from '~/sentry/sentry_browser_wrapper';
import AccessorUtilities from '~/lib/utils/accessor';
-import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
+import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/super_sidebar/constants';
import axios from '~/lib/utils/axios_utils';
/**
diff --git a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
index d99b90fa561..a7dfc1e2cdb 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/comment_templates_dropdown.vue
@@ -88,7 +88,7 @@ export default {
placement="right"
searchable
size="small"
- class="comment-template-dropdown gl-mr-3"
+ class="comment-template-dropdown gl-mr-2"
positioning-strategy="fixed"
:searching="$apollo.queries.savedReplies.loading"
@shown="fetchCommentTemplates"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index 2d088aa2200..8b9600b2f07 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -21,6 +21,7 @@ import { updateText } from '~/lib/utils/text_markdown';
import ToolbarButton from './toolbar_button.vue';
import DrawioToolbarButton from './drawio_toolbar_button.vue';
import CommentTemplatesDropdown from './comment_templates_dropdown.vue';
+import HeaderDivider from './header_divider.vue';
export default {
components: {
@@ -30,6 +31,7 @@ export default {
DrawioToolbarButton,
CommentTemplatesDropdown,
AiActionsDropdown: () => import('ee_component/ai/components/ai_actions_dropdown.vue'),
+ HeaderDivider,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -261,249 +263,271 @@ export default {