From bbb3ca06ec2d3ed4622b79cea81558a87519a8a8 Mon Sep 17 00:00:00 2001 From: oliv37 Date: Mon, 17 Feb 2020 19:36:10 +0100 Subject: [PATCH] feat(breadcrumb): sort the breadcrumbs in addBreadcrumbs action fix #1770 --- .../breadcrumbs/Breadcrumbs.test.tsx | 2 +- .../breadcrumbs/breadcrumbs-slice.test.ts | 24 ++++++++++++++++++- src/breadcrumbs/Breadcrumbs.tsx | 21 +++++++--------- src/breadcrumbs/breadcrumbs-slice.ts | 4 +++- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/__tests__/breadcrumbs/Breadcrumbs.test.tsx b/src/__tests__/breadcrumbs/Breadcrumbs.test.tsx index e36f64ceea..586bbf748e 100644 --- a/src/__tests__/breadcrumbs/Breadcrumbs.test.tsx +++ b/src/__tests__/breadcrumbs/Breadcrumbs.test.tsx @@ -32,9 +32,9 @@ describe('Breadcrumbs', () => { it('should render breadcrumbs items', () => { const breadcrumbs = [ - { text: 'Edit Patient', location: '/patient/1/edit' }, { i18nKey: 'patient.label', location: '/patient' }, { text: 'Bob', location: '/patient/1' }, + { text: 'Edit Patient', location: '/patient/1/edit' }, ] const wrapper = setup(breadcrumbs) diff --git a/src/__tests__/breadcrumbs/breadcrumbs-slice.test.ts b/src/__tests__/breadcrumbs/breadcrumbs-slice.test.ts index f3b6f7da35..10f73f19ff 100644 --- a/src/__tests__/breadcrumbs/breadcrumbs-slice.test.ts +++ b/src/__tests__/breadcrumbs/breadcrumbs-slice.test.ts @@ -24,7 +24,7 @@ describe('breadcrumbs slice', () => { expect(breadcrumbsStore.breadcrumbs).toEqual(breadcrumbsToAdd) }) - it('should handle the ADD_BREADCRUMBS action with existing breadcreumbs', () => { + it('should handle the ADD_BREADCRUMBS action with existing breadcrumbs', () => { const breadcrumbsToAdd = [{ text: 'Bob', location: '/user/1' }] const state = { @@ -39,6 +39,28 @@ describe('breadcrumbs slice', () => { expect(breadcrumbsStore.breadcrumbs).toEqual([...state.breadcrumbs, ...breadcrumbsToAdd]) }) + it('should handle the ADD_BREADCRUMBS action and sort the breadcrumbs by their location', () => { + const breadcrumbsToAdd = [{ text: 'Bob', location: '/user/1/' }] + + const state = { + breadcrumbs: [ + { text: 'user', location: '/user' }, + { text: 'edit user', location: '/user/1/edit' }, + ], + } + + const breadcrumbsStore = breadcrumbs(state, { + type: addBreadcrumbs.type, + payload: breadcrumbsToAdd, + }) + + expect(breadcrumbsStore.breadcrumbs).toEqual([ + { text: 'user', location: '/user' }, + { text: 'Bob', location: '/user/1/' }, + { text: 'edit user', location: '/user/1/edit' }, + ]) + }) + it('should handle the REMOVE_BREADCRUMBS action', () => { const breadcrumbsToRemove = [{ text: 'Bob', location: '/user/1' }] diff --git a/src/breadcrumbs/Breadcrumbs.tsx b/src/breadcrumbs/Breadcrumbs.tsx index ba666ece17..14cf3ddd33 100644 --- a/src/breadcrumbs/Breadcrumbs.tsx +++ b/src/breadcrumbs/Breadcrumbs.tsx @@ -12,19 +12,16 @@ const Breadcrumbs = () => { return ( - {breadcrumbs - .slice() - .sort((b1, b2) => b1.location.length - b2.location.length) - .map(({ i18nKey, text, location }, index) => { - const isLast = index === breadcrumbs.length - 1 - const onClick = !isLast ? () => history.push(location) : undefined + {breadcrumbs.map(({ i18nKey, text, location }, index) => { + const isLast = index === breadcrumbs.length - 1 + const onClick = !isLast ? () => history.push(location) : undefined - return ( - - {i18nKey ? t(i18nKey) : text} - - ) - })} + return ( + + {i18nKey ? t(i18nKey) : text} + + ) + })} ) } diff --git a/src/breadcrumbs/breadcrumbs-slice.ts b/src/breadcrumbs/breadcrumbs-slice.ts index 2cc55424a3..86a689e0d8 100644 --- a/src/breadcrumbs/breadcrumbs-slice.ts +++ b/src/breadcrumbs/breadcrumbs-slice.ts @@ -14,7 +14,9 @@ const breadcrumbsSlice = createSlice({ initialState, reducers: { addBreadcrumbs(state, { payload }: PayloadAction) { - state.breadcrumbs = [...state.breadcrumbs, ...payload] + state.breadcrumbs = [...state.breadcrumbs, ...payload].sort( + (b1, b2) => b1.location.length - b2.location.length, + ) }, removeBreadcrumbs(state, { payload }: PayloadAction) { const locations = payload.map((b) => b.location)