From 03bc9922d1e82020785562b43cf4150bd1927803 Mon Sep 17 00:00:00 2001 From: Scott Stern <sstern@gitlab.com> Date: Mon, 14 Feb 2022 05:34:53 +0000 Subject: [PATCH] On click of board cards in filtered search, refresh page Changed: fixed MR: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80238 --- .../boards/components/board_card_inner.vue | 18 ++---- spec/frontend/boards/board_card_inner_spec.js | 55 ++----------------- 2 files changed, 10 insertions(+), 63 deletions(-) diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue index ea80496c3f5a..aee61a5b2a59 100644 --- a/app/assets/javascripts/boards/components/board_card_inner.vue +++ b/app/assets/javascripts/boards/components/board_card_inner.vue @@ -11,12 +11,10 @@ import { sortBy } from 'lodash'; import { mapActions, mapGetters, mapState } from 'vuex'; import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner'; import { isScopedLabel } from '~/lib/utils/common_utils'; -import { updateHistory } from '~/lib/utils/url_utility'; import { sprintf, __, n__ } from '~/locale'; import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue'; import UserAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue'; import { ListType } from '../constants'; -import eventHub from '../eventhub'; import BoardBlockedIcon from './board_blocked_icon.vue'; import IssueDueDate from './issue_due_date.vue'; import IssueTimeEstimate from './issue_time_estimate.vue'; @@ -176,18 +174,10 @@ export default { ) ); }, - filterByLabel(label) { - if (!this.updateFilters) return; + labelTarget(label) { const filterPath = window.location.search ? `${window.location.search}&` : '?'; - const filter = `label_name[]=${encodeURIComponent(label.title)}`; - - if (!filterPath.includes(filter)) { - updateHistory({ - url: `${filterPath}${filter}`, - }); - this.performSearch(); - eventHub.$emit('updateTokens'); - } + const value = encodeURIComponent(label.title); + return `${filterPath}label_name[]=${value}`; }, showScopedLabel(label) { return this.scopedLabelsAvailable && isScopedLabel(label); @@ -242,7 +232,7 @@ export default { :description="label.description" size="sm" :scoped="showScopedLabel(label)" - @click="filterByLabel(label)" + :target="labelTarget(label)" /> </template> </div> diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js index 6de549718d91..677978d31caf 100644 --- a/spec/frontend/boards/board_card_inner_spec.js +++ b/spec/frontend/boards/board_card_inner_spec.js @@ -2,15 +2,12 @@ import { GlLabel, GlLoadingIcon, GlTooltip } from '@gitlab/ui'; import { range } from 'lodash'; import Vuex from 'vuex'; import { nextTick } from 'vue'; -import setWindowLocation from 'helpers/set_window_location_helper'; import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import BoardBlockedIcon from '~/boards/components/board_blocked_icon.vue'; import BoardCardInner from '~/boards/components/board_card_inner.vue'; import { issuableTypes } from '~/boards/constants'; -import eventHub from '~/boards/eventhub'; import defaultStore from '~/boards/stores'; -import { updateHistory } from '~/lib/utils/url_utility'; import { mockLabelList, mockIssue, mockIssueFullPath } from './mock_data'; jest.mock('~/lib/utils/url_utility'); @@ -54,6 +51,7 @@ describe('Board card component', () => { state: { ...defaultStore.state, issuableType: issuableTypes.issue, + isShowingLabels: true, }, getters: { isGroupBoard: () => true, @@ -405,53 +403,12 @@ describe('Board card component', () => { expect(wrapper.findAll(GlLabel).length).toBe(1); expect(wrapper.text()).not.toContain('closed'); }); - }); - - describe('filterByLabel method', () => { - beforeEach(() => { - wrapper.setProps({ - updateFilters: true, - }); - }); - - describe('when selected label is not in the filter', () => { - beforeEach(() => { - jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {}); - setWindowLocation('?'); - wrapper.vm.filterByLabel(label1); - }); - - it('calls updateHistory', () => { - expect(updateHistory).toHaveBeenCalledTimes(1); - }); - - it('dispatches performSearch vuex action', () => { - expect(wrapper.vm.performSearch).toHaveBeenCalledTimes(1); - }); - - it('emits updateTokens event', () => { - expect(eventHub.$emit).toHaveBeenCalledTimes(1); - expect(eventHub.$emit).toHaveBeenCalledWith('updateTokens'); - }); - }); - - describe('when selected label is already in the filter', () => { - beforeEach(() => { - jest.spyOn(wrapper.vm, 'performSearch').mockImplementation(() => {}); - setWindowLocation('?label_name[]=testing%20123'); - wrapper.vm.filterByLabel(label1); - }); - - it('does not call updateHistory', () => { - expect(updateHistory).not.toHaveBeenCalled(); - }); - it('does not dispatch performSearch vuex action', () => { - expect(wrapper.vm.performSearch).not.toHaveBeenCalled(); - }); - - it('does not emit updateTokens event', () => { - expect(eventHub.$emit).not.toHaveBeenCalled(); + describe('when label params arent set', () => { + it('passes the right target to GlLabel', () => { + expect(wrapper.findAll(GlLabel).at(0).props('target')).toEqual( + '?label_name[]=testing%20123', + ); }); }); }); -- GitLab