From a455a9d5f062f3abdf144c8e8746add531ce03d5 Mon Sep 17 00:00:00 2001 From: Jack Chapman Date: Wed, 22 Oct 2025 16:44:10 +0100 Subject: [PATCH] Remove board_multi_select feature Removes unreleased and unmaintained feature. Using other changelog as this is not documented. Changelog: other --- .rubocop_todo/layout/line_length.yml | 1 - .../rspec/pending_without_reason.yml | 1 - .../boards/components/board_card.vue | 49 +------- .../client/selected_board_items.query.graphql | 3 - .../set_selected_board_items.mutation.graphql | 3 - ...nset_selected_board_items.mutation.graphql | 3 - .../graphql_shared/issuable_client.js | 21 ---- app/controllers/groups/boards_controller.rb | 1 - app/controllers/projects/boards_controller.rb | 1 - .../development/board_multi_select.yml | 8 -- spec/features/boards/multi_select_spec.rb | 116 ------------------ .../boards/components/board_card_spec.js | 95 ++------------ spec/support/rspec_order_todo.yml | 1 - 13 files changed, 18 insertions(+), 285 deletions(-) delete mode 100644 app/assets/javascripts/boards/graphql/client/selected_board_items.query.graphql delete mode 100644 app/assets/javascripts/boards/graphql/client/set_selected_board_items.mutation.graphql delete mode 100644 app/assets/javascripts/boards/graphql/client/unset_selected_board_items.mutation.graphql delete mode 100644 config/feature_flags/development/board_multi_select.yml delete mode 100644 spec/features/boards/multi_select_spec.rb diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index 669ab00c976b28..7e96fb47e13277 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -2399,7 +2399,6 @@ Layout/LineLength: - 'spec/features/boards/board_filters_spec.rb' - 'spec/features/boards/boards_spec.rb' - 'spec/features/boards/issue_ordering_spec.rb' - - 'spec/features/boards/multi_select_spec.rb' - 'spec/features/boards/sidebar_assignee_spec.rb' - 'spec/features/boards/sidebar_labels_spec.rb' - 'spec/features/boards/user_visits_board_spec.rb' diff --git a/.rubocop_todo/rspec/pending_without_reason.yml b/.rubocop_todo/rspec/pending_without_reason.yml index 8fa2271e9bd6d8..0d7b9ab3d385e9 100644 --- a/.rubocop_todo/rspec/pending_without_reason.yml +++ b/.rubocop_todo/rspec/pending_without_reason.yml @@ -12,7 +12,6 @@ RSpec/PendingWithoutReason: - 'ee/spec/support/shared_examples/models/vulnerabilities/cvss_vector_validator_shared_examples.rb' - 'qa/qa/specs/features/api/8_monitor/metrics_spec.rb' - 'spec/controllers/projects/issues_controller_spec.rb' - - 'spec/features/boards/multi_select_spec.rb' - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb' - 'spec/features/merge_request/user_merges_merge_request_spec.rb' - 'spec/features/merge_request/user_resolves_conflicts_spec.rb' diff --git a/app/assets/javascripts/boards/components/board_card.vue b/app/assets/javascripts/boards/components/board_card.vue index 36532c31e7ba22..ce990e85dd8d76 100644 --- a/app/assets/javascripts/boards/components/board_card.vue +++ b/app/assets/javascripts/boards/components/board_card.vue @@ -4,9 +4,6 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { visitUrl } from '~/lib/utils/url_utility'; import { sprintf, __ } from '~/locale'; import { WORK_ITEM_TYPE_ENUM_INCIDENT } from '~/work_items/constants'; -import setSelectedBoardItemsMutation from '~/boards/graphql/client/set_selected_board_items.mutation.graphql'; -import unsetSelectedBoardItemsMutation from '~/boards/graphql/client/unset_selected_board_items.mutation.graphql'; -import selectedBoardItemsQuery from '~/boards/graphql/client/selected_board_items.query.graphql'; import setActiveBoardItemMutation from 'ee_else_ce/boards/graphql/client/set_active_board_item.mutation.graphql'; import activeBoardItemQuery from 'ee_else_ce/boards/graphql/client/active_board_item.query.graphql'; import BoardCardInner from './board_card_inner.vue'; @@ -65,10 +62,6 @@ export default { }; }, }, - // eslint-disable-next-line @gitlab/vue-no-undef-apollo-properties - selectedBoardItems: { - query: selectedBoardItemsQuery, - }, }, computed: { activeItemId() { @@ -77,9 +70,6 @@ export default { isActive() { return this.item.id === this.activeItemId; }, - multiSelectVisible() { - return !this.activeItemId && this.selectedBoardItems?.includes(this.item.id); - }, isDisabled() { return this.disabled || !this.item.id || this.item.isLoading || !this.canAdmin; }, @@ -100,7 +90,7 @@ export default { }; }, showFocusBackground() { - return !this.isActive && !this.multiSelectVisible; + return !this.isActive; }, itemPrefix() { return this.isEpicBoard ? '&' : '#'; @@ -123,9 +113,8 @@ export default { // Allow Ctrl/Cmd+click to open link in new tab const isMetaKey = e.ctrlKey || e.metaKey; - const boardMultiSelectEnabled = gon?.features?.boardMultiSelect; - if (isMetaKey && !boardMultiSelectEnabled) { + if (isMetaKey) { // Let the browser handle the new tab open return; } @@ -139,18 +128,11 @@ export default { return; } - if (isMetaKey && boardMultiSelectEnabled) { - this.toggleBoardItemMultiSelection(this.item); - } else { - this.$el.querySelector('.board-card-button')?.focus(); - this.toggleItem(); - this.track('click_card', { label: 'right_sidebar' }); - } + this.$el.querySelector('.board-card-button')?.focus(); + this.toggleItem(); + this.track('click_card', { label: 'right_sidebar' }); }, async toggleItem() { - await this.$apollo.mutate({ - mutation: unsetSelectedBoardItemsMutation, - }); this.$apollo.mutate({ mutation: setActiveBoardItemMutation, variables: { @@ -160,26 +142,6 @@ export default { }, }); }, - async toggleBoardItemMultiSelection(item) { - if (this.activeItemId) { - await this.$apollo.mutate({ - mutation: setSelectedBoardItemsMutation, - variables: { - itemId: this.activeItemId, - }, - }); - await this.$apollo.mutate({ - mutation: setActiveBoardItemMutation, - variables: { boardItem: null, listId: null }, - }); - } - this.$apollo.mutate({ - mutation: setSelectedBoardItemsMutation, - variables: { - itemId: item.id, - }, - }); - }, changeFocusInColumn(currentCard, i) { // Building a list using data-col-index instead of just traversing the ul is necessary for swimlanes const columnCards = [ @@ -240,7 +202,6 @@ export default {
  • { Vue.use(VueApollo); const mockSetActiveBoardItemResolver = jest.fn(); - const mockSetSelectedBoardItemsResolver = jest.fn(); const mockApollo = createMockApollo([], { Mutation: { setActiveBoardItem: mockSetActiveBoardItemResolver, - setSelectedBoardItems: mockSetSelectedBoardItemsResolver, }, }); @@ -37,7 +33,6 @@ describe('Board card', () => { provide = {}, stubs = { BoardCardInner }, item = mockIssue, - selectedBoardItems = [], activeBoardItem = {}, mountOptions = {}, } = {}) => { @@ -47,12 +42,6 @@ describe('Board card', () => { isShowingLabels: true, }, }); - mockApollo.clients.defaultClient.cache.writeQuery({ - query: selectedBoardItemsQuery, - data: { - selectedBoardItems, - }, - }); mockApollo.clients.defaultClient.cache.writeQuery({ query: activeBoardItemQuery, data: { @@ -93,11 +82,6 @@ describe('Board card', () => { await nextTick(); }; - const multiSelectCard = async () => { - findBoardCardButton().trigger('click', { ctrlKey: true }); - await nextTick(); - }; - beforeEach(() => { window.gon = { features: {} }; }); @@ -117,33 +101,10 @@ describe('Board card', () => { }); }); - describe('when GlLabel is clicked in BoardCardInner', () => { - it("doesn't call setSelectedBoardItemsMutation", async () => { - mountComponent(); - - await wrapper.findComponent(GlLabel).trigger('mouseup'); - - expect(mockSetSelectedBoardItemsResolver).toHaveBeenCalledTimes(0); - }); - }); - - describe('when issuable title is clicked in BoardCardInner and issuesListDrawer feature is enabled', () => { - it('calls mockSetSelectedBoardItemsResolver', async () => { - mountComponent({ provide: { glFeatures: { issuesListDrawer: true } } }); - - await findBoardCardButton().trigger('click'); - - await waitForPromises(); - - expect(mockSetActiveBoardItemResolver).toHaveBeenCalledTimes(1); - }); - }); - it('should not highlight the card by default', () => { mountComponent(); expect(wrapper.classes()).not.toContain('is-active'); - expect(wrapper.classes()).not.toContain('multi-select'); }); it('should highlight the card with a correct style when selected', async () => { @@ -151,14 +112,6 @@ describe('Board card', () => { await waitForPromises(); expect(wrapper.classes()).toContain('is-active'); - expect(wrapper.classes()).not.toContain('multi-select'); - }); - - it('should highlight the card with a correct style when multi-selected', () => { - mountComponent({ selectedBoardItems: [mockIssue.id] }); - - expect(wrapper.classes()).toContain('multi-select'); - expect(wrapper.classes()).not.toContain('is-active'); }); it('render card with unique id', () => { @@ -174,43 +127,21 @@ describe('Board card', () => { mountComponent({ mountOptions: { attachTo: document.body } }); }); - describe('when not using multi-select', () => { - it('set active board item on client when clicking on card', async () => { - await selectCard(); - await waitForPromises(); - - expect(mockSetActiveBoardItemResolver).toHaveBeenCalledWith( - {}, - { - boardItem: mockIssue, - listId: 'gid://gitlab/List/2', - }, - expect.anything(), - expect.anything(), - ); - - expect(document.activeElement).toEqual(findBoardCardButton().element); - }); - }); + it('set active board item on client when clicking on card', async () => { + await selectCard(); + await waitForPromises(); - describe('when using multi-select', () => { - beforeEach(() => { - window.gon = { features: { boardMultiSelect: true } }; - }); + expect(mockSetActiveBoardItemResolver).toHaveBeenCalledWith( + {}, + { + boardItem: mockIssue, + listId: 'gid://gitlab/List/2', + }, + expect.anything(), + expect.anything(), + ); - it('should call setSelectedBoardItemsMutation with correct parameters', async () => { - await multiSelectCard(); - - expect(mockSetSelectedBoardItemsResolver).toHaveBeenCalledTimes(1); - expect(mockSetSelectedBoardItemsResolver).toHaveBeenCalledWith( - expect.any(Object), - { - itemId: mockIssue.id, - }, - expect.anything(), - expect.anything(), - ); - }); + expect(document.activeElement).toEqual(findBoardCardButton().element); }); }); diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index b2b39b8ddb35d8..3639a6b0ff96d9 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -2593,7 +2593,6 @@ - './spec/features/boards/issue_ordering_spec.rb' - './spec/features/boards/keyboard_shortcut_spec.rb' - './spec/features/boards/multiple_boards_spec.rb' -- './spec/features/boards/multi_select_spec.rb' - './spec/features/boards/new_issue_spec.rb' - './spec/features/boards/reload_boards_on_browser_back_spec.rb' - './spec/features/boards/sidebar_assignee_spec.rb' -- GitLab