diff --git a/.gitlab/ci/database.gitlab-ci.yml b/.gitlab/ci/database.gitlab-ci.yml
index 63428b6d19a..d9776e70743 100644
--- a/.gitlab/ci/database.gitlab-ci.yml
+++ b/.gitlab/ci/database.gitlab-ci.yml
@@ -1,7 +1,7 @@
include:
- local: .gitlab/ci/rails/shared.gitlab-ci.yml
-db:setup pg16:
+.db:setup pg16:
stage: prepare
needs: []
extends:
@@ -18,6 +18,16 @@ db:setup pg16:
paths:
- pg_dumpall.sql
+db:setup pg16:
+ extends:
+ - .db:setup pg16
+
+# Job name is detected in scripts/utils.sh to set up EE-only databases.
+db:setup-ee pg16:
+ extends:
+ - .db:setup pg16
+ - .rails:rules:setup-test-env-ee
+
db:rollback single-db-ci-connection:
extends:
- db:rollback
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index b36c511c9e3..12c2a27b239 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -297,6 +297,10 @@ include:
- .use-pg15-es7-ee
.rspec-ee-base-pg16:
+ needs:
+ - !reference [.rspec-base, needs]
+ - job: "db:setup-ee pg16"
+ optional: true
extends:
- .rspec-base
- .use-pg16-es7-ee
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index b889e55eafd..283b5c1d9d7 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -2072,6 +2072,12 @@
- <<: *if-merge-request-labels-run-all-rspec
- <<: *if-default-branch-schedule-weekly
+.rails:rules:setup-test-env-ee:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - !reference [".rails:rules:setup-test-env", rules]
+
.rails:rules:setup-test-env-fips:
rules:
- <<: *if-default-branch-schedule-weekly
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index 226fbd7e290..46184fe3a43 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -1112,7 +1112,6 @@ RSpec/ContextWording:
- 'spec/features/reportable_note/merge_request_spec.rb'
- 'spec/features/search/user_searches_for_code_spec.rb'
- 'spec/features/signed_commits_spec.rb'
- - 'spec/features/snippets/explore_spec.rb'
- 'spec/features/tags/developer_creates_tag_spec.rb'
- 'spec/features/tags/developer_deletes_tag_spec.rb'
- 'spec/features/tags/maintainer_deletes_protected_tag_spec.rb'
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index eace2275080..eccb5bd2152 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -19,7 +19,6 @@ import ImportedBadge from '~/vue_shared/components/imported_badge.vue';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import EmojiPicker from '~/emoji/components/picker.vue';
-import { TYPE_COMMENT } from '~/import/constants';
import getDesignQuery from '../../graphql/queries/get_design.query.graphql';
import updateNoteMutation from '../../graphql/mutations/update_note.mutation.graphql';
import designNoteAwardEmojiToggleMutation from '../../graphql/mutations/design_note_award_emoji_toggle.mutation.graphql';
@@ -264,7 +263,6 @@ export default {
},
},
updateNoteMutation,
- TYPE_COMMENT,
};
@@ -303,7 +301,7 @@ export default {
>
-
+
diff --git a/app/assets/javascripts/design_management/components/toolbar/index.vue b/app/assets/javascripts/design_management/components/toolbar/index.vue
index 50791d2c08f..adf35deedbd 100644
--- a/app/assets/javascripts/design_management/components/toolbar/index.vue
+++ b/app/assets/javascripts/design_management/components/toolbar/index.vue
@@ -4,7 +4,6 @@ import { GlButton, GlIcon, GlTooltipDirective, GlSkeletonLoader } from '@gitlab/
import permissionsQuery from 'shared_queries/design_management/design_permissions.query.graphql';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { __, s__, sprintf } from '~/locale';
-import { TYPE_DESIGN } from '~/import/constants';
import timeagoMixin from '~/vue_shared/mixins/timeago';
import ImportedBadge from '~/vue_shared/components/imported_badge.vue';
import { DESIGNS_ROUTE_NAME } from '../../router/constants';
@@ -130,7 +129,6 @@ export default {
},
},
DESIGNS_ROUTE_NAME,
- TYPE_DESIGN,
};
@@ -147,11 +145,7 @@ export default {
{{ filename }}
-
+
{{ updatedText }}
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
index f24f87c2f7c..08f28fc465a 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
@@ -153,7 +153,7 @@ export default {
},
{
key: 'importTarget',
- label: s__('BulkImport|New group'),
+ label: s__('BulkImport|Path of the new group'),
thClass: `gl-w-1/2`,
},
{
@@ -886,14 +886,7 @@ export default {
/>
-
- {{ data.label }}
-
+ {{ data.label }}
import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
-import { issuableTypeText } from '~/issues/constants';
-import { __, sprintf } from '~/locale';
export default {
components: {
@@ -10,20 +8,6 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- props: {
- issuableType: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- title() {
- return sprintf(__('This %{issuable} is hidden because its author has been banned.'), {
- issuable: issuableTypeText[this.issuableType],
- });
- },
- },
};
@@ -31,7 +15,7 @@ export default {
-
-
+
+
{{ title }}
diff --git a/app/assets/javascripts/members/components/avatars/user_avatar.vue b/app/assets/javascripts/members/components/avatars/user_avatar.vue
index 84fa26da63b..b60832908f4 100644
--- a/app/assets/javascripts/members/components/avatars/user_avatar.vue
+++ b/app/assets/javascripts/members/components/avatars/user_avatar.vue
@@ -1,4 +1,5 @@
-
-
+
-
-
- ({{ $options.i18n.busy }})
-
-
-
-
-
-
- {{ badge.text }}
-
-
-
-
-
+
+
+
+ ({{ $options.i18n.busy }})
+
+
+
+
+
+
+ {{ badge.text }}
+
+
+
+
+
-
+
+
diff --git a/app/assets/javascripts/merge_requests/components/merge_request_header.vue b/app/assets/javascripts/merge_requests/components/merge_request_header.vue
index 1fd7305c061..c46cf4061e0 100644
--- a/app/assets/javascripts/merge_requests/components/merge_request_header.vue
+++ b/app/assets/javascripts/merge_requests/components/merge_request_header.vue
@@ -106,15 +106,7 @@ export default {
class="gl-mr-2 gl-self-center"
:issuable-type="$options.TYPE_MERGE_REQUEST"
/>
-
-
+
+
diff --git a/app/assets/javascripts/merge_requests/components/sticky_header.vue b/app/assets/javascripts/merge_requests/components/sticky_header.vue
index f987006a5ca..5b0574c9159 100644
--- a/app/assets/javascripts/merge_requests/components/sticky_header.vue
+++ b/app/assets/javascripts/merge_requests/components/sticky_header.vue
@@ -178,7 +178,7 @@ export default {
>
-
+
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index ae0a185e335..b9dcb097c84 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -73,12 +73,14 @@ function createPopover(el, user) {
populateUserInfo(user);
}
const UserPopoverComponent = Vue.extend(UserPopover);
+
return new UserPopoverComponent({
propsData: {
target: el,
user,
show: true,
placement: el.dataset.placement || 'top',
+ container: el.parentNode?.id || null,
},
});
}
@@ -102,6 +104,13 @@ function launchPopover(el, mountPopover) {
},
{ once: true },
);
+ el.addEventListener(
+ 'focusout',
+ ({ target }) => {
+ target.removeAttribute('aria-describedby');
+ },
+ { once: true },
+ );
const popoverInstance = createPopover(el, Vue.observable(emptyUser));
const { userId } = el.dataset;
@@ -138,6 +147,7 @@ export default function addPopovers(mountPopover = (instance) => instance.$mount
// https://gitlab.com/gitlab-org/gitlab/-/issues/351395#note_1039341458
if (window.gon?.current_user_id && !hasAddedLazyPopovers) {
document.addEventListener('mouseover', (event) => lazyLaunchPopover(mountPopover, event));
+ document.addEventListener('focusin', (event) => lazyLaunchPopover(mountPopover, event));
hasAddedLazyPopovers = true;
}
}
diff --git a/app/assets/javascripts/vue_shared/components/imported_badge.vue b/app/assets/javascripts/vue_shared/components/imported_badge.vue
index 308416cc085..98b9ab2fa35 100644
--- a/app/assets/javascripts/vue_shared/components/imported_badge.vue
+++ b/app/assets/javascripts/vue_shared/components/imported_badge.vue
@@ -1,21 +1,9 @@
-
+
{{ __('Imported') }}
-
+
{{ __('Imported') }}
diff --git a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
index 19c1515b365..da522633263 100644
--- a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
@@ -71,6 +71,11 @@ export default {
required: false,
default: false,
},
+ container: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
data() {
return {
@@ -202,6 +207,7 @@ export default {
:target="target"
:delay="$options.USER_POPOVER_DELAY"
:placement="placement"
+ :container="container"
boundary="viewport"
triggers="hover focus manual"
data-testid="user-popover"
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
index 7af1989fe75..344b196c35f 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
@@ -168,8 +168,8 @@ export default {
:workspace-type="workspaceType"
/>
-
-
+
+
@@ -305,7 +303,7 @@ export default {
>
-
+
diff --git a/app/assets/javascripts/work_items/components/design_management/design_preview/design_toolbar.vue b/app/assets/javascripts/work_items/components/design_management/design_preview/design_toolbar.vue
index d3879dc5edc..778f5258981 100644
--- a/app/assets/javascripts/work_items/components/design_management/design_preview/design_toolbar.vue
+++ b/app/assets/javascripts/work_items/components/design_management/design_preview/design_toolbar.vue
@@ -1,7 +1,6 @@
@@ -90,11 +88,7 @@ export default {
{{ design.filename }}
-
+
diff --git a/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_assignee.vue b/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_assignee.vue
index c7588d77c75..4e039ed28c9 100644
--- a/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_assignee.vue
+++ b/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_assignee.vue
@@ -46,6 +46,9 @@ export default {
apollo: {
currentUser: {
query: currentUserQuery,
+ skip() {
+ return !this.searchStarted;
+ },
},
users: {
query: usersSearchQuery,
diff --git a/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_state.vue b/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_dropdown.vue
similarity index 60%
rename from app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_state.vue
rename to app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_dropdown.vue
index 9a40d89624c..4e277fe419e 100644
--- a/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_state.vue
+++ b/app/assets/javascripts/work_items/components/work_item_bulk_edit/work_item_bulk_edit_dropdown.vue
@@ -1,17 +1,24 @@
-
+
getIdFromGraphQLId(item.id)).join(','),
remove_label_ids: this.removeLabelIds.map(getIdFromGraphQLId),
state_event: this.state,
+ subscription_event: this.subscription,
};
return axios.post(this.legacyBulkEditEndpoint, { update });
@@ -128,7 +153,14 @@ export default {
-
+
+
+
+
diff --git a/app/assets/javascripts/work_items/components/work_item_created_updated.vue b/app/assets/javascripts/work_items/components/work_item_created_updated.vue
index 6114f59d265..bb8c4c6ee33 100644
--- a/app/assets/javascripts/work_items/components/work_item_created_updated.vue
+++ b/app/assets/javascripts/work_items/components/work_item_created_updated.vue
@@ -1,10 +1,12 @@