From 4501cf9b68e14e6196714cfe1e080ef5c1e9cd63 Mon Sep 17 00:00:00 2001 From: Phil Hughes <me@iamphill.com> Date: Mon, 17 Feb 2025 11:32:18 +0000 Subject: [PATCH] Remove `vue_merge_request_list` feature flag Changelog: other https://gitlab.com/gitlab-org/gitlab/-/issues/518678 --- app/assets/javascripts/issuable/index.js | 35 - .../javascripts/merge_requests/list/index.js | 34 - .../pages/groups/merge_requests/index.js | 19 - .../projects/merge_requests/index/index.js | 20 +- app/controllers/groups_controller.rb | 6 +- .../projects/merge_requests_controller.rb | 2 +- app/views/groups/merge_requests.html.haml | 27 +- .../merge_requests/_nav_btns.html.haml | 10 - .../projects/merge_requests/index.html.haml | 31 +- .../issuable/_bulk_update_sidebar.html.haml | 9 +- .../beta/vue_merge_request_list.yml | 9 - .../_bulk_update_button.html.haml | 2 - spec/controllers/groups_controller_spec.rb | 86 -- .../merge_requests_controller_spec.rb | 71 - ..._users_dropdowns_in_issuables_list_spec.rb | 19 - .../filtered_search/dropdown_user_spec.js | 2 +- .../filtered_search/dropdown_utils_spec.js | 2 +- spec/frontend/fixtures/merge_requests.rb | 13 - .../fixtures/static/merge_request_list.html | 1260 +++++++++++++++++ 19 files changed, 1276 insertions(+), 381 deletions(-) delete mode 100644 app/views/projects/merge_requests/_nav_btns.html.haml delete mode 100644 config/feature_flags/beta/vue_merge_request_list.yml delete mode 100644 ee/app/views/projects/merge_requests/_bulk_update_button.html.haml create mode 100644 spec/frontend/fixtures/static/merge_request_list.html diff --git a/app/assets/javascripts/issuable/index.js b/app/assets/javascripts/issuable/index.js index 40f92763b295c..4d7a9794f5d49 100644 --- a/app/assets/javascripts/issuable/index.js +++ b/app/assets/javascripts/issuable/index.js @@ -1,10 +1,8 @@ -import { GlToast } from '@gitlab/ui'; import Vue from 'vue'; import { parseBoolean } from '~/lib/utils/common_utils'; import Sidebar from '~/right_sidebar'; import { getSidebarOptions } from '~/sidebar/mount_sidebar'; import CsvImportExportButtons from './components/csv_import_export_buttons.vue'; -import IssuableByEmail from './components/issuable_by_email.vue'; import issuableBulkUpdateActions from './issuable_bulk_update_actions'; import IssuableBulkUpdateSidebar from './issuable_bulk_update_sidebar'; import IssuableContext from './issuable_context'; @@ -63,39 +61,6 @@ export function initCsvImportExportButtons() { }); } -export function initIssuableByEmail() { - const el = document.querySelector('.js-issuable-by-email'); - - if (!el) { - return null; - } - - Vue.use(GlToast); - - const { - initialEmail, - issuableType, - emailsHelpPagePath, - quickActionsHelpPath, - markdownHelpPath, - resetPath, - } = el.dataset; - - return new Vue({ - el, - name: 'IssuableByEmailRoot', - provide: { - initialEmail, - issuableType, - emailsHelpPagePath, - quickActionsHelpPath, - markdownHelpPath, - resetPath, - }, - render: (createElement) => createElement(IssuableByEmail), - }); -} - export function initIssuableSidebar() { const el = document.querySelector('.js-sidebar-options'); diff --git a/app/assets/javascripts/merge_requests/list/index.js b/app/assets/javascripts/merge_requests/list/index.js index 613933bd8a0ba..1cdf2c3ce8664 100644 --- a/app/assets/javascripts/merge_requests/list/index.js +++ b/app/assets/javascripts/merge_requests/list/index.js @@ -4,7 +4,6 @@ import VueRouter from 'vue-router'; import { parseBoolean } from '~/lib/utils/common_utils'; import { defaultClient } from '~/graphql_shared/issuable_client'; import MergeRequestsListApp from './components/merge_requests_list_app.vue'; -import MoreactionsDropdown from './components/more_actions_dropdown.vue'; export async function mountMergeRequestListsApp({ getMergeRequestsQuery, @@ -94,36 +93,3 @@ export async function mountMergeRequestListsApp({ render: (createComponent) => createComponent(MergeRequestsListApp), }); } - -export async function mountMoreActionsDropdown() { - const el = document.querySelector('#js-vue-mr-list-more-actions'); - - if (!el) { - return null; - } - - const { - isSignedIn, - showExportButton, - issuableType, - issuableCount, - email, - exportCsvPath, - rssUrl, - } = el.dataset; - - return new Vue({ - el, - name: 'MergeRequestsListMoreActions', - provide: { - isSignedIn: parseBoolean(isSignedIn), - showExportButton: parseBoolean(showExportButton), - issuableType, - issuableCount: Number(issuableCount), - email, - exportCsvPath, - rssUrl, - }, - render: (createComponent) => createComponent(MoreactionsDropdown), - }); -} diff --git a/app/assets/javascripts/pages/groups/merge_requests/index.js b/app/assets/javascripts/pages/groups/merge_requests/index.js index 8afd84f8df458..aa836d8ac1fa8 100644 --- a/app/assets/javascripts/pages/groups/merge_requests/index.js +++ b/app/assets/javascripts/pages/groups/merge_requests/index.js @@ -1,32 +1,13 @@ -import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests'; import getMergeRequestsQuery from 'ee_else_ce/merge_requests/list/queries/group/get_merge_requests.query.graphql'; import getMergeRequestsCountsQuery from 'ee_else_ce/merge_requests/list/queries/group/get_merge_requests_counts.query.graphql'; import getMergeRequestsApprovalsQuery from 'ee_else_ce/merge_requests/list/queries/group/get_merge_requests_approvals.query.graphql'; -import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys'; -import { FILTERED_SEARCH } from '~/filtered_search/constants'; import { initBulkUpdateSidebar } from '~/issuable'; -import initFilteredSearch from '~/pages/search/init_filtered_search'; -import { initNewResourceDropdown } from '~/vue_shared/components/new_resource_dropdown/init_new_resource_dropdown'; -import { RESOURCE_TYPE_MERGE_REQUEST } from '~/vue_shared/components/new_resource_dropdown/constants'; -import searchUserGroupProjectsWithMergeRequestsEnabled from '~/vue_shared/components/new_resource_dropdown/graphql/search_user_group_projects_with_merge_requests_enabled.query.graphql'; import { mountMergeRequestListsApp } from '~/merge_requests/list'; const ISSUABLE_BULK_UPDATE_PREFIX = 'merge_request_'; -addExtraTokensForMergeRequests(IssuableFilteredSearchTokenKeys); initBulkUpdateSidebar(ISSUABLE_BULK_UPDATE_PREFIX); -initFilteredSearch({ - page: FILTERED_SEARCH.MERGE_REQUESTS, - isGroupDecendent: true, - useDefaultState: true, - filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys, -}); -initNewResourceDropdown({ - resourceType: RESOURCE_TYPE_MERGE_REQUEST, - query: searchUserGroupProjectsWithMergeRequestsEnabled, - extractProjects: (data) => data?.group?.projects?.nodes, -}); mountMergeRequestListsApp({ getMergeRequestsQuery, getMergeRequestsCountsQuery, diff --git a/app/assets/javascripts/pages/projects/merge_requests/index/index.js b/app/assets/javascripts/pages/projects/merge_requests/index/index.js index a04d64a488ab0..cd6a91d985e37 100644 --- a/app/assets/javascripts/pages/projects/merge_requests/index/index.js +++ b/app/assets/javascripts/pages/projects/merge_requests/index/index.js @@ -1,31 +1,15 @@ -import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests'; import getMergeRequestsQuery from 'ee_else_ce/merge_requests/list/queries/project/get_merge_requests.query.graphql'; import getMergeRequestsCountsQuery from 'ee_else_ce/merge_requests/list/queries/project/get_merge_requests_counts.query.graphql'; import getMergeRequestsApprovalsQuery from 'ee_else_ce/merge_requests/list/queries/project/get_merge_requests_approvals.query.graphql'; import { addShortcutsExtension } from '~/behaviors/shortcuts'; import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation'; -import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys'; -import { FILTERED_SEARCH } from '~/filtered_search/constants'; -import { initBulkUpdateSidebar, initCsvImportExportButtons, initIssuableByEmail } from '~/issuable'; -import initFilteredSearch from '~/pages/search/init_filtered_search'; -import { mountMoreActionsDropdown, mountMergeRequestListsApp } from '~/merge_requests/list'; +import { initBulkUpdateSidebar } from '~/issuable'; +import { mountMergeRequestListsApp } from '~/merge_requests/list'; initBulkUpdateSidebar('merge_request_'); -addExtraTokensForMergeRequests(IssuableFilteredSearchTokenKeys); -IssuableFilteredSearchTokenKeys.removeTokensForKeys('iteration'); - -initFilteredSearch({ - page: FILTERED_SEARCH.MERGE_REQUESTS, - filteredSearchTokenKeys: IssuableFilteredSearchTokenKeys, - useDefaultState: true, -}); - addShortcutsExtension(ShortcutsNavigation); -initIssuableByEmail(); -initCsvImportExportButtons(); -mountMoreActionsDropdown(); mountMergeRequestListsApp({ getMergeRequestsQuery, getMergeRequestsApprovalsQuery, diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index ae103aedb288c..367c117fc7a80 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -155,11 +155,7 @@ def edit @badge_api_endpoint = expose_path(api_v4_groups_badges_path(id: @group.id)) end - def merge_requests - return if ::Feature.enabled?(:vue_merge_request_list, current_user) - - render_merge_requests - end + def merge_requests; end def projects @projects = @group.projects.with_statistics.page(params[:page]) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 7caa2be78f219..8dfc485fec54e 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -390,7 +390,7 @@ def auto_merge_requested? private def set_issuables_index - return if ::Feature.enabled?(:vue_merge_request_list, current_user) && request.format.html? + return if request.format.html? super end diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index 56a2075d2dc9f..ca4be4a8bd931 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -2,27 +2,6 @@ - page_title _("Merge requests") - add_page_specific_style 'page_bundles/issuable_list' -- if Feature.enabled?(:vue_merge_request_list, @group) - .js-merge-request-list-root{ data: group_merge_requests_list_data(@group, current_user) } - - if has_bulk_update_permission - = render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :merge_requests -- else - - can_bulk_update = has_bulk_update_permission && issuables_count_for_state(:merge_requests, :all) > 0 - - .top-area - = render 'shared/issuable/nav', type: :merge_requests, display_count: !@search_timeout_occurred - - if current_user - .nav-controls - - if can_bulk_update - = render_if_exists 'projects/merge_requests/bulk_update_button' - - = render 'shared/new_project_item_vue_select' - - = render 'shared/issuable/search_bar', type: :merge_requests - - if can_bulk_update - = render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :merge_requests - - - if @search_timeout_occurred - = render 'shared/dashboard/search_timeout_occurred' - - else - = render 'shared/merge_requests' +.js-merge-request-list-root{ data: group_merge_requests_list_data(@group, current_user) } +- if has_bulk_update_permission + = render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :merge_requests diff --git a/app/views/projects/merge_requests/_nav_btns.html.haml b/app/views/projects/merge_requests/_nav_btns.html.haml deleted file mode 100644 index 130d0c848a252..0000000000000 --- a/app/views/projects/merge_requests/_nav_btns.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -= render_if_exists 'projects/merge_requests/merge_trains_button' -- if @can_bulk_update - = render Pajamas::ButtonComponent.new(type: :submit, button_options: { class: 'gl-mr-3 js-bulk-update-toggle' }) do - = _("Bulk edit") -- if merge_project && can?(@current_user, :create_merge_request_in, @project) - = render Pajamas::ButtonComponent.new(href: new_merge_request_path, variant: :confirm, - button_options: { data: { event_tracking: 'click_new_merge_request_list' } }) do - = _("New merge request") - -#js-vue-mr-list-more-actions{ data: project_merge_requests_list_more_actions_data(@project, current_user) } diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index b626620d70ec5..9d571a7b0b226 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,10 +1,6 @@ - @can_bulk_update = can?(current_user, :admin_merge_request, @project) -- merge_project = merge_request_source_project_for_project(@project) -- new_merge_request_path = project_new_merge_request_path(merge_project) if merge_project -- issuable_type = 'merge_request' - page_title _("Merge requests") -- new_merge_request_email = @project.new_issuable_address(current_user, 'merge_request') - add_page_specific_style 'page_bundles/issuable_list' - add_page_specific_style 'page_bundles/merge_request' @@ -13,27 +9,6 @@ = render 'projects/last_push' -- if Feature.enabled?(:vue_merge_request_list, @project) - .js-merge-request-list-root{ data: project_merge_requests_list_data(@project, current_user) } - - if @can_bulk_update - = render 'shared/issuable/bulk_update_sidebar', type: :merge_requests -- else - - if @project.merge_requests.exists? - .top-area - = render 'shared/issuable/nav', type: :merge_requests - .nav-controls - = render "projects/merge_requests/nav_btns", merge_project: merge_project, new_merge_request_path: new_merge_request_path - - = render 'shared/issuable/search_bar', type: :merge_requests - - - if @can_bulk_update - = render 'shared/issuable/bulk_update_sidebar', type: :merge_requests - - .merge-requests-holder - = render 'merge_requests', new_merge_request_path: new_merge_request_path - - else - = render 'shared/empty_states/merge_requests', button_path: new_merge_request_path - - - if new_merge_request_email && can?(current_user, :create_merge_request_in, @project) - .gl-text-center.gl-pt-5.gl-pb-7 - .js-issuable-by-email{ data: { initial_email: new_merge_request_email, issuable_type: issuable_type, emails_help_page_path: help_page_path('development/emails.md', anchor: 'email-namespace'), quick_actions_help_path: help_page_path('user/project/quick_actions.md'), markdown_help_path: help_page_path('user/markdown.md'), reset_path: new_issuable_address_project_path(@project, issuable_type: issuable_type) } } +.js-merge-request-list-root{ data: project_merge_requests_list_data(@project, current_user) } +- if @can_bulk_update + = render 'shared/issuable/bulk_update_sidebar', type: :merge_requests diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index ddc6c6cde9644..ac051cc84a5a6 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -11,11 +11,10 @@ = _('Update selected') = render Pajamas::ButtonComponent.new(button_options: { class: 'js-bulk-update-menu-hide gl-float-right' }) do = _('Cancel') - - if params[:state] != 'merged' || ::Feature.enabled?(:vue_merge_request_list, @project) - .block.js-status-dropdown-container - .title - = _('Status') - .js-status-dropdown + .block.js-status-dropdown-container + .title + = _('Status') + .js-status-dropdown .block .title = _('Assignee') diff --git a/config/feature_flags/beta/vue_merge_request_list.yml b/config/feature_flags/beta/vue_merge_request_list.yml deleted file mode 100644 index 0ebefadd4e1f9..0000000000000 --- a/config/feature_flags/beta/vue_merge_request_list.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: vue_merge_request_list -feature_issue_url: https://gitlab.com/groups/gitlab-org/-/epics/10827 -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/145168 -rollout_issue_url: -milestone: '16.10' -group: group::code review -type: beta -default_enabled: true diff --git a/ee/app/views/projects/merge_requests/_bulk_update_button.html.haml b/ee/app/views/projects/merge_requests/_bulk_update_button.html.haml deleted file mode 100644 index 01324eec8459f..0000000000000 --- a/ee/app/views/projects/merge_requests/_bulk_update_button.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -= render Pajamas::ButtonComponent.new(button_options: { class: 'gl-mr-3 js-bulk-update-toggle' }) do - = _("Bulk edit") diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index 87a722228c17e..84793b0c0e6e7 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -594,92 +594,6 @@ expect(response).to render_template('groups/merge_requests') end - - context 'sorting by votes' do - context 'when vue_merge_request_list is disabled' do - before do - stub_feature_flags(vue_merge_request_list: false) - end - - it 'sorts most popular merge requests' do - get :merge_requests, params: { id: group.to_param, sort: 'upvotes_desc' } - expect(assigns(:merge_requests)).to eq [merge_request_2, merge_request_1] - end - - it 'sorts least popular merge requests' do - get :merge_requests, params: { id: group.to_param, sort: 'downvotes_desc' } - expect(assigns(:merge_requests)).to eq [merge_request_2, merge_request_1] - end - end - end - - context 'rendering views' do - before do - stub_feature_flags(vue_merge_request_list: false) - end - - render_views - - it 'displays MR counts in nav' do - get :merge_requests, params: { id: group.to_param } - - expect(response.body).to have_content('Open 2 Merged 0 Closed 0 All 2') - expect(response.body).not_to have_content('Open Merged Closed All') - end - - context 'when MergeRequestsFinder raises an exception' do - before do - allow_next_instance_of(MergeRequestsFinder) do |instance| - allow(instance).to receive(:count_by_state).and_raise(ActiveRecord::QueryCanceled) - end - end - - it 'does not display MR counts in nav' do - get :merge_requests, params: { id: group.to_param } - - expect(response.body).to have_content('Open Merged Closed All') - expect(response.body).not_to have_content('Open 0 Merged 0 Closed 0 All 0') - end - end - end - - context 'when an ActiveRecord::QueryCanceled is raised' do - before do - stub_feature_flags(vue_merge_request_list: false) - - allow_next_instance_of(Gitlab::IssuableMetadata) do |instance| - allow(instance).to receive(:data).and_raise(ActiveRecord::QueryCanceled) - end - end - - it 'sets :search_timeout_occurred' do - get :merge_requests, params: { id: group.to_param } - - expect(response).to have_gitlab_http_status(:ok) - expect(assigns(:search_timeout_occurred)).to eq(true) - end - - it 'logs the exception' do - get :merge_requests, params: { id: group.to_param } - end - - context 'rendering views' do - render_views - - it 'shows error message' do - get :merge_requests, params: { id: group.to_param } - - expect(response.body).to have_content('Too many results to display. Edit your search or add a filter.') - end - - it 'does not display MR counts in nav' do - get :merge_requests, params: { id: group.to_param } - - expect(response.body).to have_content('Open Merged Closed All') - expect(response.body).not_to have_content('Open 0 Merged 0 Closed 0 All 0') - end - end - end end describe 'DELETE #destroy' do diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index d06b0fd585d2b..2625fb984c6e3 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -402,77 +402,6 @@ def get_merge_requests(page = nil) expect(response).to render_template('projects/merge_requests/index') end - - context 'when vue_merge_request_list is disabled' do - before do - stub_feature_flags(vue_merge_request_list: false) - end - - context 'when the test is flaky', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/450217' do - it_behaves_like "issuables list meta-data", :merge_request - end - - it_behaves_like 'set sort order from user preference' do - let(:sorting_param) { 'updated_asc' } - end - - context 'when page param' do - let(:last_page) { project.merge_requests.page.total_pages } - let!(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } - - it 'redirects to last_page if page number is larger than number of pages' do - get_merge_requests(last_page + 1) - - expect(response).to redirect_to(project_merge_requests_path(project, page: last_page, state: controller.params[:state], scope: controller.params[:scope])) - end - - it 'redirects to specified page' do - get_merge_requests(last_page) - - expect(assigns(:merge_requests).current_page).to eq(last_page) - expect(response).to have_gitlab_http_status(:ok) - end - - it 'does not redirect to external sites when provided a host field' do - external_host = "www.example.com" - get :index, - params: { - namespace_id: project.namespace.to_param, - project_id: project, - state: 'opened', - page: (last_page + 1).to_param, - host: external_host - } - - expect(response).to redirect_to(project_merge_requests_path(project, page: last_page, state: controller.params[:state], scope: controller.params[:scope])) - end - end - - context 'when filtering by opened state' do - context 'with opened merge requests' do - it 'lists those merge requests' do - expect(merge_request).to be_persisted - - get_merge_requests - - expect(assigns(:merge_requests)).to include(merge_request) - end - end - - context 'with reopened merge requests' do - before do - merge_request.close! - merge_request.reopen! - end - - it 'lists those merge requests' do - get_merge_requests - - expect(assigns(:merge_requests)).to include(merge_request) - end - end - end - end end describe 'PUT update' do diff --git a/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb b/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb index 066c6b3c7dacf..1c67c688158a3 100644 --- a/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb +++ b/spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb @@ -47,24 +47,5 @@ end end end - - context 'when vue_merge_request_list feature flag is disabled' do - before do - stub_feature_flags(vue_merge_request_list: false) - end - - %w[author assignee].each do |dropdown| - describe "#{dropdown} dropdown" do - it 'only includes members of the project/group' do - visit merge_requests_group_path(group) - - filtered_search.set("#{dropdown}:=") - - expect(find("#js-dropdown-#{dropdown} .filter-dropdown")).to have_content(user_in_dropdown.name) - expect(find("#js-dropdown-#{dropdown} .filter-dropdown")).not_to have_content(user_not_in_dropdown.name) - end - end - end - end end end diff --git a/spec/frontend/filtered_search/dropdown_user_spec.js b/spec/frontend/filtered_search/dropdown_user_spec.js index 8ddf83904314b..8196a08f5b456 100644 --- a/spec/frontend/filtered_search/dropdown_user_spec.js +++ b/spec/frontend/filtered_search/dropdown_user_spec.js @@ -1,4 +1,4 @@ -import htmlMergeRequestList from 'test_fixtures/merge_requests/merge_request_list.html'; +import htmlMergeRequestList from 'test_fixtures_static/merge_request_list.html'; import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import DropdownUser from '~/filtered_search/dropdown_user'; import DropdownUtils from '~/filtered_search/dropdown_utils'; diff --git a/spec/frontend/filtered_search/dropdown_utils_spec.js b/spec/frontend/filtered_search/dropdown_utils_spec.js index d8a5b493b7a85..776601ab04ef4 100644 --- a/spec/frontend/filtered_search/dropdown_utils_spec.js +++ b/spec/frontend/filtered_search/dropdown_utils_spec.js @@ -1,4 +1,4 @@ -import htmlMergeRequestList from 'test_fixtures/merge_requests/merge_request_list.html'; +import htmlMergeRequestList from 'test_fixtures_static/merge_request_list.html'; import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper'; import DropdownUtils from '~/filtered_search/dropdown_utils'; diff --git a/spec/frontend/fixtures/merge_requests.rb b/spec/frontend/fixtures/merge_requests.rb index 6e3c779396dab..5fd24eb67a9fd 100644 --- a/spec/frontend/fixtures/merge_requests.rb +++ b/spec/frontend/fixtures/merge_requests.rb @@ -127,19 +127,6 @@ end end - it 'merge_requests/merge_request_list.html' do - stub_feature_flags(vue_merge_request_list: false) - - create(:merge_request, source_project: project, target_project: project) - - get :index, params: { - namespace_id: project.namespace.to_param, - project_id: project - } - - expect(response).to be_successful - end - describe GraphQL::Query, type: :request do include ApiHelpers include GraphqlHelpers diff --git a/spec/frontend/fixtures/static/merge_request_list.html b/spec/frontend/fixtures/static/merge_request_list.html new file mode 100644 index 0000000000000..5fbcb4159fdbb --- /dev/null +++ b/spec/frontend/fixtures/static/merge_request_list.html @@ -0,0 +1,1260 @@ +<body> + <meta charset="utf-8" /> + <meta content="IE=edge" http-equiv="X-UA-Compatible" /> + <meta content="width=device-width, initial-scale=1" name="viewport" /> + <title>Merge requests · Sidney Jones42 / Merge-requests-project Name · GitLab</title> + + <meta content="object" property="og:type" /> + <meta content="GitLab" property="og:site_name" /> + <meta + content="Merge requests · Sidney Jones42 / Merge-requests-project Name · GitLab" + property="og:title" + /> + <meta content="GitLab Enterprise Edition" property="og:description" /> + <meta + content="http://test.host/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" + property="og:image" + /> + <meta content="64" property="og:image:width" /> + <meta content="64" property="og:image:height" /> + <meta + content="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests" + property="og:url" + /> + <meta content="summary" property="twitter:card" /> + <meta + content="Merge requests · Sidney Jones42 / Merge-requests-project Name · GitLab" + property="twitter:title" + /> + <meta content="GitLab Enterprise Edition" property="twitter:description" /> + <meta + content="http://test.host/assets/twitter_card-570ddb06edf56a2312253c5872489847a0f385112ddbcd71ccfa1570febab5d2.jpg" + property="twitter:image" + /> + + <meta name="csp-nonce" content="YvN7ALTNcueZIIqujkPQQw==" /> + <meta name="action-cable-url" content="http://test.host/-/cable" /> + + <meta content="GitLab Enterprise Edition" name="description" /> + <meta content="#ececef" name="theme-color" /> + + <div class="layout-page page-with-super-sidebar"> + <aside + class="js-super-sidebar super-sidebar super-sidebar-loading" + data-command-palette='{"project_files_url":"/frontend-fixtures/merge-requests-project/-/files/master?format=json","project_blob_url":"/frontend-fixtures/merge-requests-project/-/blob/master"}' + data-force-desktop-expanded-sidebar="" + data-is-saas="false" + data-root-path="http://test.host/" + data-sidebar='{"whats_new_most_recent_release_items_count":3,"whats_new_version_digest":"0dc755729105d759eb626954bd82029a9f94aed1c747983d4f27a0d7ade59e57","is_logged_in":true,"context_switcher_links":[{"title":"Your work","link":"/","icon":"work"},{"title":"Explore","link":"/explore","icon":"compass"},{"title":"Profile","link":"/-/user_settings/profile","icon":"profile"},{"title":"Preferences","link":"/-/profile/preferences","icon":"preferences"}],"current_menu_items":[{"id":"project_overview","title":"Merge-requests-project Name","entity_id":18,"link":"/frontend-fixtures/merge-requests-project","link_classes":"shortcuts-project","is_active":false},{"id":"manage_menu","title":"Manage","icon":"users","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/activity","is_active":false,"items":[{"id":"activity","title":"Activity","link":"/frontend-fixtures/merge-requests-project/activity","link_classes":"shortcuts-project-activity","is_active":false},{"id":"members","title":"Members","link":"/frontend-fixtures/merge-requests-project/-/project_members","is_active":false},{"id":"labels","title":"Labels","link":"/frontend-fixtures/merge-requests-project/-/labels","is_active":false}],"separated":false},{"id":"plan_menu","title":"Plan","icon":"planning","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/issues","is_active":false,"items":[{"id":"project_issue_list","title":"Issues","link":"/frontend-fixtures/merge-requests-project/-/issues","pill_count_field":"openIssuesCount","link_classes":"shortcuts-issues has-sub-items","is_active":false},{"id":"boards","title":"Issue boards","link":"/frontend-fixtures/merge-requests-project/-/boards","link_classes":"shortcuts-issue-boards","is_active":false},{"id":"milestones","title":"Milestones","link":"/frontend-fixtures/merge-requests-project/-/milestones","is_active":false},{"id":"project_wiki","title":"Wiki","link":"/frontend-fixtures/merge-requests-project/-/wikis/home","link_classes":"shortcuts-wiki","is_active":false}],"separated":false},{"id":"code_menu","title":"Code","icon":"code","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/merge_requests","is_active":true,"items":[{"id":"project_merge_request_list","title":"Merge requests","link":"/frontend-fixtures/merge-requests-project/-/merge_requests","pill_count_field":"openMergeRequestsCount","link_classes":"shortcuts-merge_requests","is_active":true},{"id":"files","title":"Repository","link":"/frontend-fixtures/merge-requests-project/-/tree/master","link_classes":"shortcuts-tree","is_active":false},{"id":"branches","title":"Branches","link":"/frontend-fixtures/merge-requests-project/-/branches","is_active":false},{"id":"commits","title":"Commits","link":"/frontend-fixtures/merge-requests-project/-/commits/master?ref_type=heads","link_classes":"shortcuts-commits","is_active":false},{"id":"tags","title":"Tags","link":"/frontend-fixtures/merge-requests-project/-/tags","is_active":false},{"id":"graphs","title":"Repository graph","link":"/frontend-fixtures/merge-requests-project/-/network/master?ref_type=heads","link_classes":"shortcuts-network","is_active":false},{"id":"compare","title":"Compare revisions","link":"/frontend-fixtures/merge-requests-project/-/compare?from=master\u0026to=master","is_active":false},{"id":"project_snippets","title":"Snippets","link":"/frontend-fixtures/merge-requests-project/-/snippets","link_classes":"shortcuts-snippets","is_active":false}],"separated":false},{"id":"build_menu","title":"Build","icon":"rocket","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/pipelines","is_active":false,"items":[{"id":"pipelines","title":"Pipelines","link":"/frontend-fixtures/merge-requests-project/-/pipelines","link_classes":"shortcuts-pipelines","is_active":false},{"id":"jobs","title":"Jobs","link":"/frontend-fixtures/merge-requests-project/-/jobs","link_classes":"shortcuts-builds","is_active":false},{"id":"pipelines_editor","title":"Pipeline editor","link":"/frontend-fixtures/merge-requests-project/-/ci/editor?branch_name=master","is_active":false},{"id":"pipeline_schedules","title":"Pipeline schedules","link":"/frontend-fixtures/merge-requests-project/-/pipeline_schedules","link_classes":"shortcuts-builds","is_active":false},{"id":"artifacts","title":"Artifacts","link":"/frontend-fixtures/merge-requests-project/-/artifacts","link_classes":"shortcuts-builds","is_active":false}],"separated":false},{"id":"secure_menu","title":"Secure","icon":"shield","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/audit_events","is_active":false,"items":[{"id":"audit_events","title":"Audit events","link":"/frontend-fixtures/merge-requests-project/-/audit_events","is_active":false},{"id":"configuration","title":"Security configuration","link":"/frontend-fixtures/merge-requests-project/-/security/configuration","is_active":false}],"separated":false},{"id":"deploy_menu","title":"Deploy","icon":"deployments","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/releases","is_active":false,"items":[{"id":"releases","title":"Releases","link":"/frontend-fixtures/merge-requests-project/-/releases","link_classes":"shortcuts-deployments-releases","is_active":false},{"id":"feature_flags","title":"Feature flags","link":"/frontend-fixtures/merge-requests-project/-/feature_flags","link_classes":"shortcuts-feature-flags","is_active":false},{"id":"packages_registry","title":"Package Registry","link":"/frontend-fixtures/merge-requests-project/-/packages","link_classes":"shortcuts-container-registry","is_active":false},{"id":"model_registry","title":"Model registry","link":"/frontend-fixtures/merge-requests-project/-/ml/models","is_active":false}],"separated":false},{"id":"operations_menu","title":"Operate","icon":"cloud-pod","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/environments","is_active":false,"items":[{"id":"environments","title":"Environments","link":"/frontend-fixtures/merge-requests-project/-/environments","link_classes":"shortcuts-environments","is_active":false},{"id":"kubernetes","title":"Kubernetes clusters","link":"/frontend-fixtures/merge-requests-project/-/clusters","link_classes":"shortcuts-kubernetes","is_active":false},{"id":"terraform_states","title":"Terraform states","link":"/frontend-fixtures/merge-requests-project/-/terraform","is_active":false},{"id":"infrastructure_registry","title":"Terraform modules","link":"/frontend-fixtures/merge-requests-project/-/terraform_module_registry","is_active":false},{"id":"google_cloud","title":"Google Cloud","link":"/frontend-fixtures/merge-requests-project/-/google_cloud/configuration","is_active":false},{"id":"aws","title":"AWS","link":"/frontend-fixtures/merge-requests-project/-/aws","is_active":false}],"separated":false},{"id":"monitor_menu","title":"Monitor","icon":"monitor","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/error_tracking","is_active":false,"items":[{"id":"error_tracking","title":"Error Tracking","link":"/frontend-fixtures/merge-requests-project/-/error_tracking","is_active":false},{"id":"alert_management","title":"Alerts","link":"/frontend-fixtures/merge-requests-project/-/alert_management","is_active":false},{"id":"incidents","title":"Incidents","link":"/frontend-fixtures/merge-requests-project/-/incidents","is_active":false}],"separated":false},{"id":"analyze_menu","title":"Analyze","icon":"chart","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/-/value_stream_analytics","is_active":false,"items":[{"id":"cycle_analytics","title":"Value stream analytics","link":"/frontend-fixtures/merge-requests-project/-/value_stream_analytics","link_classes":"shortcuts-project-cycle-analytics","is_active":false},{"id":"contributors","title":"Contributor analytics","link":"/frontend-fixtures/merge-requests-project/-/graphs/master?ref_type=heads","is_active":false},{"id":"ci_cd_analytics","title":"CI/CD analytics","link":"/frontend-fixtures/merge-requests-project/-/pipelines/charts","is_active":false},{"id":"repository_analytics","title":"Repository analytics","link":"/frontend-fixtures/merge-requests-project/-/graphs/master/charts","link_classes":"shortcuts-repository-charts","is_active":false},{"id":"model_experiments","title":"Model experiments","link":"/frontend-fixtures/merge-requests-project/-/ml/experiments","is_active":false}],"separated":false},{"id":"settings_menu","title":"Settings","icon":"settings","avatar_shape":"rect","link":"/frontend-fixtures/merge-requests-project/edit","is_active":false,"items":[{"id":"general","title":"General","link":"/frontend-fixtures/merge-requests-project/edit","is_active":false},{"id":"integrations","title":"Integrations","link":"/frontend-fixtures/merge-requests-project/-/settings/integrations","is_active":false},{"id":"webhooks","title":"Webhooks","link":"/frontend-fixtures/merge-requests-project/-/hooks","is_active":false},{"id":"access_tokens","title":"Access tokens","link":"/frontend-fixtures/merge-requests-project/-/settings/access_tokens","is_active":false},{"id":"repository","title":"Repository","link":"/frontend-fixtures/merge-requests-project/-/settings/repository","is_active":false},{"id":"merge_request_settings","title":"Merge requests","link":"/frontend-fixtures/merge-requests-project/-/settings/merge_requests","is_active":false},{"id":"ci_cd","title":"CI/CD","link":"/frontend-fixtures/merge-requests-project/-/settings/ci_cd","is_active":false},{"id":"packages_and_registries","title":"Packages and registries","link":"/frontend-fixtures/merge-requests-project/-/settings/packages_and_registries","is_active":false},{"id":"monitor","title":"Monitor","link":"/frontend-fixtures/merge-requests-project/-/settings/operations","is_active":false},{"id":"usage_quotas","title":"Usage Quotas","link":"/frontend-fixtures/merge-requests-project/-/usage_quotas","is_active":false}],"separated":true}],"current_context_header":"Project","support_path":"https://about.gitlab.com/get-help/","docs_path":"/help/docs","display_whats_new":true,"show_version_check":false,"search":{"search_path":"/search","issues_path":"/dashboard/issues","mr_path":"/dashboard/merge_requests","autocomplete_path":"/search/autocomplete","settings_path":"/search/settings","search_context":{"project":{"id":18,"name":"Merge-requests-project Name"},"project_metadata":{"mr_path":"/frontend-fixtures/merge-requests-project/-/merge_requests","issues_path":"/frontend-fixtures/merge-requests-project/-/issues"},"code_search":false,"scope":"merge_requests","for_snippets":null}},"panel_type":"project","shortcut_links":[{"title":"Milestones","href":"/dashboard/milestones","css_class":"dashboard-shortcuts-milestones"},{"title":"Snippets","href":"/dashboard/snippets","css_class":"dashboard-shortcuts-snippets"},{"title":"Activity","href":"/dashboard/activity","css_class":"dashboard-shortcuts-activity"},{"title":"Groups","href":"/dashboard/groups","css_class":"dashboard-shortcuts-groups"},{"title":"Projects","href":"/dashboard/projects","css_class":"dashboard-shortcuts-projects"},{"title":"Create a new issue","href":"/frontend-fixtures/merge-requests-project/-/issues/new","css_class":"shortcuts-new-issue"}],"terms":null,"is_admin":false,"name":"Sidney Jones42","username":"frontend-fixtures","admin_url":"http://test.host/admin","admin_mode":{"admin_mode_feature_enabled":true,"admin_mode_active":false,"enter_admin_mode_url":"/admin/session/new","leave_admin_mode_url":"/admin/session/destroy","user_is_admin":false},"avatar_url":"https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=80\u0026d=identicon","has_link_to_profile":true,"link_to_profile":"/frontend-fixtures","logo_url":null,"status":{"can_update":true,"busy":null,"customized":null,"availability":"","emoji":null,"message_html":null,"message":null,"clear_after":null},"settings":{"has_settings":true,"profile_path":"/-/user_settings/profile","profile_preferences_path":"/-/profile/preferences"},"user_counts":{"assigned_issues":0,"assigned_merge_requests":0,"review_requested_merge_requests":0,"todos":0,"last_update":1435917600000},"can_sign_out":true,"sign_out_link":"/users/sign_out","issues_dashboard_path":"/dashboard/issues?assignee_username=frontend-fixtures","merge_request_dashboard_path":null,"todos_dashboard_path":"/dashboard/todos","create_new_menu_groups":[{"name":"In this project","items":[{"text":"New issue","href":"/frontend-fixtures/merge-requests-project/-/issues/new","component":null,"extraAttrs":{"data-track-label":"new_issue","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"new_issue"}},{"text":"New merge request","href":"/frontend-fixtures/merge-requests-project/-/merge_requests/new","component":null,"extraAttrs":{"data-track-label":"new_mr","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"new_mr"}},{"text":"New snippet","href":"/frontend-fixtures/merge-requests-project/-/snippets/new","component":null,"extraAttrs":{"data-track-label":"new_snippet","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"new_snippet"}},{"text":"Invite members","href":null,"component":"invite_members","extraAttrs":{"data-track-label":"invite","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"invite"}}]},{"name":"In GitLab","items":[{"text":"New project/repository","href":"/projects/new","component":null,"extraAttrs":{"data-track-label":"general_new_project","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"general_new_project"}},{"text":"New group","href":"/groups/new","component":null,"extraAttrs":{"data-track-label":"general_new_group","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"general_new_group"}},{"text":"New organization","href":"/-/organizations/new","component":null,"extraAttrs":{"data-track-label":"general_new_organization","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"general_new_organization"}},{"text":"New snippet","href":"/-/snippets/new","component":null,"extraAttrs":{"data-track-label":"general_new_snippet","data-track-action":"click_link","data-track-property":"nav_create_menu","data-testid":"create_menu_item","data-qa-create-menu-item":"general_new_snippet"}}]}],"merge_request_menu":[{"name":"Merge requests","items":[{"text":"Assigned","href":"/dashboard/merge_requests?assignee_username=frontend-fixtures","count":0,"userCount":"assigned_merge_requests","extraAttrs":{"data-track-action":"click_link","data-track-label":"merge_requests_assigned","data-track-property":"nav_core_menu","class":"dashboard-shortcuts-merge_requests"}},{"text":"Review requests","href":"/dashboard/merge_requests?reviewer_username=frontend-fixtures","count":0,"userCount":"review_requested_merge_requests","extraAttrs":{"data-track-action":"click_link","data-track-label":"merge_requests_to_review","data-track-property":"nav_core_menu","class":"dashboard-shortcuts-review_requests"}}]}],"projects_path":"/dashboard/projects","groups_path":"/dashboard/groups","gitlab_com_but_not_canary":false,"gitlab_com_and_canary":false,"canary_toggle_com_url":"https://next.gitlab.com","current_context":{"namespace":"projects","item":{"id":18,"name":"Merge-requests-project Name","namespace":"Sidney Jones42 / Merge-requests-project Name","fullPath":"frontend-fixtures/merge-requests-project","webUrl":"/frontend-fixtures/merge-requests-project","avatarUrl":null}},"pinned_items":["project_issue_list","project_merge_request_list"],"update_pins_url":"/-/users/pins","is_impersonating":false,"stop_impersonation_path":"/admin/impersonation","track_visits_path":"/-/track_namespace_visits","work_items":null,"show_tanuki_bot":false,"trial":{"has_start_trial":false,"url":"/-/trials/new?glm_content=top-right-dropdown\u0026glm_source=gitlab.com"}}' + ></aside> + + <div class="content-wrapper"> + <div class="broadcast-wrapper"></div> + <div + class="alert-wrapper alert-wrapper-top-space container-fluid container-limited gl-flex gl-flex-col gl-gap-3" + ></div> + <div class="top-bar-fixed container-fluid" data-testid="top-bar"> + <div class="top-bar-container gl-flex gl-items-center gl-gap-2"> + <div class="gl-flex gl-grow gl-basis-0 gl-items-center gl-justify-start gl-gap-3"> + <button + class="gl-button btn btn-icon btn-md btn-default btn-default-tertiary js-super-sidebar-toggle-expand super-sidebar-toggle -gl-ml-3" + aria-controls="super-sidebar" + aria-expanded="false" + aria-label="Primary navigation sidebar" + type="button" + > + <svg class="s16 gl-icon gl-button-icon" data-testid="sidebar-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#sidebar" + ></use> + </svg> + </button> + + <div data-testid="breadcrumb-links" id="js-vue-page-breadcrumbs-wrapper"> + <div + data-breadcrumbs-json='[{"text":"Sidney Jones42","href":"/frontend-fixtures","avatarPath":null},{"text":"Merge-requests-project Name","href":"/frontend-fixtures/merge-requests-project","avatarPath":null},{"text":"Merge requests","href":"/frontend-fixtures/merge-requests-project/-/merge_requests","avatarPath":null}]' + id="js-vue-page-breadcrumbs" + ></div> + <div id="js-injected-page-breadcrumbs"></div> + </div> + </div> + <div class="gl-flex gl-flex-none gl-items-center gl-justify-center"> + <div id="js-advanced-search-modal"></div> + </div> + <div class="gl-flex gl-grow gl-basis-0 gl-items-center gl-justify-end"> + <div id="js-work-item-feedback"></div> + </div> + </div> + </div> + + <div class="container-fluid container-limited project-highlight-puc"> + <main + class="content" + id="content-body" + itemscope + itemtype="http://schema.org/SoftwareSourceCode" + > + <div class="flash-container flash-container-page sticky" data-testid="flash-container"> + <div id="js-global-alerts"></div> + </div> + + <div + class="js-invite-members-modal" + data-access-levels='{"Guest":10,"Planner":15,"Reporter":20,"Developer":30,"Maintainer":40,"Owner":50}' + data-default-access-level="10" + data-full-path="frontend-fixtures/merge-requests-project" + data-has-gitlab-subscription="false" + data-help-link="http://test.host/help/user/permissions.md" + data-id="18" + data-is-project="true" + data-name="Merge-requests-project Name" + data-overage-members-modal-available="false" + data-reload-page-on-submit="false" + data-root-id="32" + ></div> + + <div + class="js-hand-raise-lead-modal" + data-submit-path="http://test.host/-/gitlab_subscriptions/hand_raise_leads" + data-user='{"namespace_id":32,"user_name":"frontend-fixtures","first_name":"Sidney","last_name":"Jones42","company_name":""}' + ></div> + + <div class="top-area"> + <ul class="issues-state-filters nav gl-tabs-nav gl-grow gl-border-b-0" role="tablist"> + <li role="presentation" class="nav-item"> + <a + id="state-opened" + title="Filter by merge requests that are currently open." + data-state="opened" + role="tab" + class="nav-link gl-tab-nav-item active gl-tab-nav-item-active" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?state=opened" + ><span>Open</span> + <span + class="gl-badge badge badge-pill badge-muted gl-tab-counter-badge gl-hidden sm:gl-inline-flex" + ><span class="gl-badge-content">1</span></span + > + </a> + </li> + <li role="presentation" class="nav-item"> + <a + id="state-merged" + title="Filter by merge requests that are currently merged." + data-state="merged" + role="tab" + class="nav-link gl-tab-nav-item" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?state=merged" + ><span>Merged</span> + <span + class="gl-badge badge badge-pill badge-muted gl-tab-counter-badge gl-hidden sm:gl-inline-flex" + ><span class="gl-badge-content">0</span></span + > + </a> + </li> + <li role="presentation" class="nav-item"> + <a + id="state-closed" + title="Filter by merge requests that are currently closed and unmerged." + data-state="closed" + role="tab" + class="nav-link gl-tab-nav-item" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?state=closed" + ><span>Closed</span> + <span + class="gl-badge badge badge-pill badge-muted gl-tab-counter-badge gl-hidden sm:gl-inline-flex" + ><span class="gl-badge-content">0</span></span + > + </a> + </li> + <li role="presentation" class="nav-item"> + <a + id="state-all" + title="Show all merge requests." + data-state="all" + role="tab" + class="nav-link gl-tab-nav-item" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?state=all" + ><span>All</span> + <span + class="gl-badge badge badge-pill badge-muted gl-tab-counter-badge gl-hidden sm:gl-inline-flex" + ><span class="gl-badge-content">1</span></span + > + </a> + </li> + </ul> + <div class="nav-controls"> + <button + class="gl-button btn btn-md btn-default js-bulk-update-toggle gl-mr-3" + type="submit" + > + <span class="gl-button-text"> Bulk edit </span></button + ><a + data-event-tracking="click_new_merge_request_list" + class="gl-button btn btn-md btn-confirm" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests/new" + ><span class="gl-button-text"> New merge request </span> + </a> + </div> + </div> + <div class="issues-filters"> + <div + class="issues-details-filters filtered-search-block row-content-block second-block gl-flex gl-flex-col gl-gap-3 lg:gl-flex-row" + > + <div class="gl-flex gl-w-full gl-grow gl-flex-col md:gl-flex-row"> + <form + class="filter-form js-filter-form gl-w-full" + action="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?" + accept-charset="UTF-8" + method="get" + > + <div + class="check-all-holder hidden gl-float-left gl-mr-3 gl-hidden gl-leading-36 sm:gl-block" + > + <div class="gl-form-checkbox custom-control custom-checkbox"> + <input + type="checkbox" + name="check-all-issues" + id="check-all-issues" + class="custom-control-input" + /> + <label class="custom-control-label" for="check-all-issues" + ><span><span class="gl-sr-only"> Select all </span> </span></label + > + </div> + </div> + <div + class="issues-other-filters filtered-search-wrapper gl-flex gl-flex-col md:gl-flex-row" + > + <div class="filtered-search-box"> + <div class="dropdown filtered-search-history-dropdown-wrapper"> + <button + class="dropdown-menu-toggle gl-button btn btn-default filtered-search-history-dropdown-toggle-button" + type="button" + data-toggle="dropdown" + > + <span class="dropdown-toggle-text" + ><span + ><svg class="s16" data-testid="history-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#history" + ></use></svg></span + ><span class="gl-sr-only">Recent searches</span></span + ><svg + class="s16 dropdown-menu-toggle-icon" + data-testid="chevron-down-icon" + > + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-down" + ></use> + </svg> + </button> + <div class="dropdown-menu dropdown-select filtered-search-history-dropdown"> + <div + data-testid="dropdown-list-content" + class="dropdown-content filtered-search-history-dropdown-content" + > + <div + class="js-filtered-search-history-dropdown" + data-full-path="frontend-fixtures/merge-requests-project" + ></div> + </div> + <div class="dropdown-loading"> + <div class="gl-spinner-container gl-mt-7" role="status"> + <span + aria-hidden + class="gl-spinner gl-spinner-md gl-spinner-dark !gl-align-text-bottom" + ></span + ><span class="gl-sr-only !gl-absolute">Loading</span> + </div> + </div> + </div> + </div> + <div class="filtered-search-box-input-container droplab-dropdown"> + <div class="scroll-container"> + <ul class="tokens-container list-unstyled"> + <li class="input-token"> + <input + aria-label="Add search filter" + autocomplete="off" + class="form-control filtered-search" + data-environments-endpoint="http://test.host/frontend-fixtures/merge-requests-project/unfoldered_environment_names" + data-labels-endpoint="http://test.host/frontend-fixtures/merge-requests-project/-/labels" + data-milestones-endpoint="http://test.host/frontend-fixtures/merge-requests-project/-/milestones" + data-project-id="18" + data-releases-endpoint="http://test.host/frontend-fixtures/merge-requests-project/-/releases" + id="filtered-search-merge_requests" + placeholder="Search or filter results…" + /> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-hint" + > + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li + class="filter-dropdown-item" + data-action="{{hint === 'search' ? 'submit' : '' }}" + data-hint="{{hint}}" + data-tag="{{tag}}" + > + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-inline-flex"> + <svg> + <use xlink:href="{{icon}}"></use> + </svg> + {{ formattedKey }} + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-operator" + > + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item" data-value="{{ title }}"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span + class="gl-button-text gl-inline-flex gl-w-full gl-justify-between" + > + {{ title }} + <span class="gl-text-subtle"> {{ help }} </span> + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-author" + > + <ul data-dropdown> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-assignee" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-reviewer" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + <div + class="filtered-search-input-dropdown-menu dropdown-menu" + id="js-dropdown-approver" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + + <div + class="filtered-search-input-dropdown-menu dropdown-menu" + id="js-dropdown-approved-by" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + + <div + class="filtered-search-input-dropdown-menu dropdown-menu" + id="js-dropdown-merge-user" + > + <ul data-dropdown> + <li class="filter-dropdown-item js-current-user"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="Sidney Jones42's avatar" + src="https://www.gravatar.com/avatar/d3141e10fa3afaf0a6ecde38bcacf66bc03908a2114f4f4259dc5e600f3b37d0?s=128&d=identicon" + class="avatar s32" + title="Sidney Jones42" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + Sidney Jones42 + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @frontend-fixtures + </span> + </div> + </span> + </button> + </li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-flex gl-items-center"> + <div class="gl-shrink-0"> + <img + alt="{{name}}'s avatar" + src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + data-src="{{avatar_url}}" + class="avatar s32 lazy" + title="{{name}}" + /> + </div> + <div class="gl-flex gl-flex-col"> + <span class="gl-whitespace-normal gl-break-words gl-font-bold"> + {{name}} + </span> + <span + class="js-dropdown-light-content gl-whitespace-normal gl-break-all gl-text-subtle" + > + @{{username}} + </span> + </div> + </span> + </button> + </li> + </ul> + </div> + + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-milestone" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Upcoming"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Upcoming </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Started"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Started </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button + class="gl-button btn btn-md btn-link js-data-value" + type="button" + > + <span class="gl-button-text"> {{title}} </span> + </button> + </li> + </ul> + </div> + + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-release" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button + class="gl-button btn btn-md btn-link js-data-value" + type="button" + > + <span class="gl-button-text"> {{title}} </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-label" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-inline-flex gl-gap-3"> + <span + class="dropdown-label-box gl-m-0" + style="background: {{color}}" + ></span> + <span class="label-title js-data-value"> {{title}} </span> + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-my-reaction" + > + <ul data-dropdown> + <li class="filter-dropdown-item" data-value="None"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> None </span> + </button> + </li> + <li class="filter-dropdown-item" data-value="Any"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Any </span> + </button> + </li> + <li class="divider droplab-item-ignore"></li> + </ul> + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text gl-inline-flex gl-gap-1"> + <gl-emoji></gl-emoji> + <span class="js-data-value"> {{name}} </span> + </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-wip" + > + <ul class="filter-dropdown" data-dropdown> + <li class="filter-dropdown-item" data-capitalize data-value="yes"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Yes </span> + </button> + </li> + <li class="filter-dropdown-item" data-capitalize data-value="no"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> No </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-approved" + > + <ul class="filter-dropdown" data-dropdown> + <li class="filter-dropdown-item" data-capitalize data-value="yes"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Yes </span> + </button> + </li> + <li class="filter-dropdown-item" data-capitalize data-value="no"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> No </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-confidential" + > + <ul class="filter-dropdown" data-dropdown> + <li class="filter-dropdown-item" data-capitalize data-value="yes"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> Yes </span> + </button> + </li> + <li class="filter-dropdown-item" data-capitalize data-value="no"> + <button type="button" class="gl-button btn btn-md btn-link"> + <span class="gl-button-text"> No </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-target-branch" + > + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button + class="gl-button btn btn-md btn-link js-data-value gl-font-monospace" + type="button" + > + <span class="gl-button-text"> {{title}} </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-source-branch" + > + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button + class="gl-button btn btn-md btn-link js-data-value gl-font-monospace" + type="button" + > + <span class="gl-button-text"> {{title}} </span> + </button> + </li> + </ul> + </div> + <div + class="gl-filtered-search-suggestion-list dropdown-menu" + id="js-dropdown-environment" + > + <ul class="filter-dropdown" data-dropdown data-dynamic> + <li class="filter-dropdown-item"> + <button + class="gl-button btn btn-md btn-link js-data-value" + type="button" + > + <span class="gl-button-text"> {{title}} </span> + </button> + </li> + </ul> + </div> + </div> + <button + class="gl-button btn btn-icon btn-sm btn-default btn-default-tertiary clear-search hidden has-tooltip gl-mr-1 gl-self-center" + title="Clear" + type="button" + > + <svg + class="s16 gl-icon gl-button-icon clear-search-icon" + data-testid="clear-icon" + > + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#clear" + ></use> + </svg> + </button> + </div> + </div> + </form> + </div> + <div + class="filter-dropdown-container gl-flex gl-flex-col gl-items-start md:gl-flex-row" + > + <div> + <div class="btn-group" role="group"> + <div + class="gl-new-dropdown js-redirect-listbox btn-group" + data-placement="right" + data-items='[{"value":"priority","text":"Priority","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=priority"},{"value":"created_date","text":"Created date","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=created_date"},{"value":"closed_at","text":"Closed date","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=closed_at"},{"value":"updated_desc","text":"Updated date","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=updated_desc"},{"value":"milestone","text":"Milestone due date","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=milestone"},{"value":"popularity","text":"Popularity","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=popularity"},{"value":"label_priority","text":"Label priority","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=label_priority"},{"value":"title_asc","text":"Title","href":"/frontend-fixtures/merge-requests-project/-/merge_requests?sort=title_asc"}]' + data-selected="created_date" + > + <button + class="gl-button btn btn-md btn-default gl-new-dropdown-toggle" + type="button" + > + <span class="gl-button-text"> + <span class="gl-new-dropdown-button-text">Created date</span + ><svg + class="s16 gl-button-icon gl-new-dropdown-chevron gl-icon" + data-testid="chevron-down-icon" + > + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-down" + ></use> + </svg> + </span> + </button> + </div> + <a + class="gl-button btn btn-icon btn-md btn-default has-tooltip reverse-sort-btn rspec-reverse-sort" + title="Sort direction" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests?sort=created_asc" + ><svg class="s16 gl-icon gl-button-icon" data-testid="sort-highest-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#sort-highest" + ></use> + </svg> + </a> + </div> + </div> + </div> + </div> + </div> + + <aside + aria-label="Bulk update" + aria-live="polite" + class="issues-bulk-update js-right-sidebar right-sidebar" + data-signed-in + > + <div class="issuable-sidebar hidden"> + <form + class="bulk-update" + action="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests/bulk_update" + accept-charset="UTF-8" + method="post" + > + <div class="block issuable-sidebar-header"> + <div class="filter-item update-issues-btn float-left gl-inline-block"> + <button + type="submit" + disabled + class="gl-button btn btn-md btn-confirm js-update-selected-issues" + > + <span class="gl-button-text"> Update selected </span> + </button> + </div> + <button + class="gl-button btn btn-md btn-default js-bulk-update-menu-hide gl-float-right" + type="button" + > + <span class="gl-button-text"> Cancel </span> + </button> + </div> + <div class="block js-status-dropdown-container"> + <div class="title">Status</div> + <div class="js-status-dropdown"></div> + </div> + <div class="block"> + <div class="title">Assignee</div> + <div class="filter-item"> + <input + class="js-assignee-ids-input" + name="update[assignee_ids][]" + type="hidden" + /> + <div + class="js-assignee-dropdown" + data-full-path="frontend-fixtures/merge-requests-project" + ></div> + </div> + </div> + <div class="block"> + <div class="title">Labels</div> + <div class="filter-item labels-filter"> + <div class="dropdown"> + <button + class="dropdown-menu-toggle js-label-select js-multiselect js-filter-bulk-update" + data-default-label="Labels" + data-field-name="update[label_ids][]" + data-labels="http://test.host/frontend-fixtures/merge-requests-project/-/labels.json?include_ancestor_groups=true" + data-namespace-path="frontend-fixtures" + data-persist-when-hide="true" + data-project-id="18" + data-project-path="merge-requests-project" + data-scoped-labels="false" + data-testid="issuable-label-dropdown" + data-toggle="dropdown" + data-use-id + type="button" + > + <span class="dropdown-toggle-text"> Select labels </span> + <svg class="s16 dropdown-menu-toggle-icon" data-testid="chevron-down-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#chevron-down" + ></use> + </svg> + </button> + <div + class="dropdown-menu dropdown-select dropdown-menu-paging dropdown-menu-labels dropdown-menu-selectable dropdown-extended-height" + > + <div class="dropdown-page-one"> + <div class="dropdown-title gl-flex"> + <span class="gl-ml-auto">Apply a label</span + ><button + class="dropdown-title-button dropdown-menu-close gl-ml-auto" + aria-label="Close" + type="button" + > + <svg class="s16 dropdown-menu-close-icon" data-testid="close-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#close" + ></use> + </svg> + </button> + </div> + <div class="dropdown-input"> + <input + type="search" + data-testid="dropdown-input-field" + class="dropdown-input-field" + placeholder="Search" + autocomplete="off" + /><svg class="s16 dropdown-input-search" data-testid="search-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#search" + ></use></svg + ><svg + class="s16 dropdown-input-clear js-dropdown-input-clear" + data-testid="close-icon" + > + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#close" + ></use> + </svg> + </div> + <div class="dropdown-content"></div> + <div class="dropdown-loading"> + <div class="gl-spinner-container gl-mt-7" role="status"> + <span + aria-hidden + class="gl-spinner gl-spinner-md gl-spinner-dark !gl-align-text-bottom" + ></span + ><span class="gl-sr-only !gl-absolute">Loading</span> + </div> + </div> + </div> + + <div class="dropdown-loading"> + <div class="gl-spinner-container gl-mt-7" role="status"> + <span + aria-hidden + class="gl-spinner gl-spinner-md gl-spinner-dark !gl-align-text-bottom" + ></span + ><span class="gl-sr-only !gl-absolute">Loading</span> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="block"> + <div class="title">Milestone</div> + <div class="filter-item"> + <div + class="js-milestone-dropdown-root" + data-full-path="frontend-fixtures/merge-requests-project" + data-workspace-type="project" + ></div> + </div> + </div> + <div class="block"> + <div class="title">Subscriptions</div> + <div class="js-subscriptions-dropdown"></div> + </div> + <input + type="hidden" + name="update[issuable_ids]" + id="update_issuable_ids" + value="" + autocomplete="off" + /> + <input type="hidden" name="state_event" id="state_event" autocomplete="off" /> + </form> + </div> + </aside> + + <div class="merge-requests-holder"> + <ul class="content-list mr-list issuable-list"> + <li class="merge-request" data-id="19" data-labels="[]" id="merge_request_19"> + <div class="issue-check hidden gl-mr-3"> + <div class="gl-form-checkbox custom-control custom-checkbox"> + <input + type="checkbox" + name="selected_merge_request_19" + id="selected_merge_request_19" + data-id="19" + class="custom-control-input" + /> + <label class="custom-control-label" for="selected_merge_request_19" + ><span><span class="gl-sr-only"> My title 36 </span> </span></label + > + </div> + </div> + <div class="issuable-info-container gl-flex-col gl-gap-3 md:gl-flex-row"> + <div class="issuable-main-info !gl-mr-0"> + <div class="merge-request-title title"> + <span class="merge-request-title-text js-onboarding-mr-item"> + <a + class="js-prefetch-document" + href="http://test.host/frontend-fixtures/merge-requests-project/-/merge_requests/1" + >My title 36</a + > + </span> + </div> + <div class="issuable-info"> + <span class="issuable-reference gl-inline-block"> !1 </span> + <span class="gl-hidden sm:gl-inline"> + <span class="issuable-authored gl-inline-block !gl-text-subtle"> + · created + <time + class="js-timeago" + title="Jul 3, 2015 10:00am" + datetime="2015-07-03T10:00:00Z" + tabindex="0" + aria-label="Jul 3, 2015 10:00am" + data-toggle="tooltip" + data-placement="bottom" + data-container="body" + >Jul 03, 2015</time + > + by + <a + class="author-link js-user-link !gl-text-subtle" + data-user-id="30" + data-username="frontend-fixtures" + data-name="Sidney Jones42" + data-testid="author-link" + href="http://test.host/frontend-fixtures" + ><span class="author">Sidney Jones42</span></a + > + </span> + <span + class="project-ref-path has-tooltip gl-inline-block gl-max-w-26 gl-truncate gl-align-bottom" + title="Target branch: feature" + > +  + <a + class="ref-name !gl-text-subtle" + href="http://test.host/frontend-fixtures/merge-requests-project/-/commits/feature" + ><svg class="s12 fork-sprite" data-testid="branch-icon"> + <use + href="http://test.host/assets/icons-aa2c8ddf99d22b77153ca2bb092a23889c12c597fc8b8de94b0f730eb53513f6.svg#branch" + ></use> + </svg> + feature + </a></span + > + </span> + </div> + </div> + <div + class="gl-flex gl-w-full gl-shrink-0 gl-flex-row gl-justify-between gl-gap-1 gl-self-start gl-text-sm md:gl-w-auto md:!gl-flex-col" + > + <ul class="controls gl-gap-3 gl-self-end gl-pl-0"></ul> + </div> + </div> + </li> + </ul> + </div> + </main> + </div> + </div> + </div> +</body> -- GitLab