diff --git a/app/assets/javascripts/work_items/pages/work_items_list_app.vue b/app/assets/javascripts/work_items/pages/work_items_list_app.vue index 2ca2946930c1b010dac62db19e2d5b7c9a6469ac..93d00a6e54f4b7bcf4fc0b274cde8eb1e02098a6 100644 --- a/app/assets/javascripts/work_items/pages/work_items_list_app.vue +++ b/app/assets/javascripts/work_items/pages/work_items_list_app.vue @@ -139,6 +139,11 @@ export default { required: false, default: () => [], }, + eeSearchTokens: { + type: Array, + required: false, + default: () => [], + }, }, data() { return { @@ -405,6 +410,10 @@ export default { }); } + if (this.eeSearchTokens.length) { + tokens.push(...this.eeSearchTokens); + } + tokens.sort((a, b) => a.title.localeCompare(b.title)); return tokens; diff --git a/spec/frontend/work_items/list/components/work_items_list_app_spec.js b/spec/frontend/work_items/list/components/work_items_list_app_spec.js index 240a6da0aa713a9b3e3e99ea2fb6708795855b02..713f1c568ba9947f2e2821207d2b887d9e5f9231 100644 --- a/spec/frontend/work_items/list/components/work_items_list_app_spec.js +++ b/spec/frontend/work_items/list/components/work_items_list_app_spec.js @@ -342,6 +342,45 @@ describeSkipVue3(skipReason, () => { }); }); + describe('custom field tokens', () => { + it('combines eeSearchTokens with default search tokens', async () => { + const customToken = { + type: `custom`, + title: 'Custom Field', + token: () => {}, + }; + + mountComponent({ + props: { + eeSearchTokens: [customToken], + }, + }); + + await waitForPromises(); + + const searchTokens = findIssuableList().props('searchTokens'); + + expect(searchTokens).toContainEqual( + expect.objectContaining({ + type: customToken.type, + title: customToken.title, + }), + ); + + // Other tokens are still included + expect(searchTokens).toContainEqual( + expect.objectContaining({ + type: TOKEN_TYPE_ASSIGNEE, + }), + ); + expect(searchTokens).toContainEqual( + expect.objectContaining({ + type: TOKEN_TYPE_LABEL, + }), + ); + }); + }); + describe('events', () => { describe('when "click-tab" event is emitted by IssuableList', () => { beforeEach(async () => {