Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(PC-34013)[PRO] feat: decorrelate nameOrIsbn from offer filters #16311

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,51 @@ describe('hasSearchFilters', () => {

it('should confirm whether collective filters are applied or not', () => {
expect(
hasCollectiveSearchFilters(defaultCollectiveFilters, {
...defaultCollectiveFilters,
hasCollectiveSearchFilters({
searchFilters: defaultCollectiveFilters,
defaultFilters: defaultCollectiveFilters
})
).toBeFalsy()

expect(
hasCollectiveSearchFilters(defaultCollectiveFilters, {
...defaultCollectiveFilters,
format: EacFormat.ATELIER_DE_PRATIQUE,
})
hasCollectiveSearchFilters({
searchFilters: defaultCollectiveFilters,
defaultFilters: {
...defaultCollectiveFilters,
format: EacFormat.ATELIER_DE_PRATIQUE,
}
})
).toBeTruthy()

expect(
hasCollectiveSearchFilters(defaultCollectiveFilters, {
...defaultCollectiveFilters,
status: [CollectiveOfferDisplayedStatus.ACTIVE],
hasCollectiveSearchFilters({
searchFilters: defaultCollectiveFilters,
defaultFilters: {
...defaultCollectiveFilters,
status: [CollectiveOfferDisplayedStatus.ACTIVE],
}
})
).toBeTruthy()
})

it('should ignore the page number and offerer id', () => {
expect(
hasCollectiveSearchFilters(defaultCollectiveFilters, {
...defaultCollectiveFilters,
page: 10,
hasCollectiveSearchFilters({
searchFilters: defaultCollectiveFilters,
defaultFilters: {
...defaultCollectiveFilters,
page: 10,
}
})
).toBeFalsy()

expect(
hasCollectiveSearchFilters(defaultCollectiveFilters, {
...defaultCollectiveFilters,
offererId: '816',
hasCollectiveSearchFilters({
searchFilters: defaultCollectiveFilters,
defaultFilters: {
...defaultCollectiveFilters,
offererId: '816',
}
})
).toBeFalsy()
})
Expand Down
57 changes: 37 additions & 20 deletions pro/src/commons/core/Offers/utils/hasSearchFilters.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,55 @@
import { DEFAULT_SEARCH_FILTERS } from '../constants'
import { CollectiveSearchFiltersParams, SearchFiltersParams } from '../types'

export const hasSearchFilters = (
searchFilters: Partial<SearchFiltersParams>,
filterNames: (keyof SearchFiltersParams)[] = Object.keys(
searchFilters
) as (keyof SearchFiltersParams)[]
): boolean => {
return filterNames.some(
type HasSearchFiltersParams = {
searchFilters: Partial<SearchFiltersParams>
lookup?: (keyof SearchFiltersParams)[]
ignore?: (keyof SearchFiltersParams)[]
}
export const hasSearchFilters = ({
searchFilters,
lookup = Object.keys(searchFilters) as (keyof SearchFiltersParams)[],
ignore = []
}: HasSearchFiltersParams): boolean => {
// Those "filters" are ignored because none are to be interpreted
// as such by the user.
const finalIgnore = ['offererId', 'page', ...ignore]

return lookup.some(
(filterName) =>
searchFilters[filterName] &&
filterName !== 'offererId' &&
filterName !== 'page' &&
searchFilters[filterName] !== { ...DEFAULT_SEARCH_FILTERS }[filterName]
searchFilters[filterName] !== { ...DEFAULT_SEARCH_FILTERS }[filterName] &&
!finalIgnore.includes(filterName)
)
}

export const hasCollectiveSearchFilters = (
searchFilters: Partial<CollectiveSearchFiltersParams>,
defaultFilters: CollectiveSearchFiltersParams,
filterNames: (keyof CollectiveSearchFiltersParams)[] = Object.keys(
type HasCollectiveSearchFiltersParams = {
searchFilters: Partial<CollectiveSearchFiltersParams>
defaultFilters: CollectiveSearchFiltersParams
lookup?: (keyof CollectiveSearchFiltersParams)[]
ignore?: (keyof CollectiveSearchFiltersParams)[]
}
export const hasCollectiveSearchFilters = ({
searchFilters,
defaultFilters,
lookup = Object.keys(
searchFilters
) as (keyof CollectiveSearchFiltersParams)[]
): boolean => {
return filterNames.some(
) as (keyof CollectiveSearchFiltersParams)[],
ignore = []
}: HasCollectiveSearchFiltersParams): boolean => {
// Those "filters" are ignored because none are to be interpreted
// as such by the user.
const finalIgnore = ['offererId', 'page', ...ignore]

return lookup.some(
(filterName) =>
searchFilters[filterName] &&
filterName !== 'offererId' &&
filterName !== 'page' &&
((['string', 'number'].includes(typeof searchFilters[filterName]) &&
searchFilters[filterName] !== { ...defaultFilters }[filterName]) ||
(Array.isArray(searchFilters[filterName]) &&
Array.isArray(defaultFilters[filterName]) &&
!isSameArray(searchFilters[filterName], defaultFilters[filterName])))
!isSameArray(searchFilters[filterName], defaultFilters[filterName]))) &&
!finalIgnore.includes(filterName)
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { CELLS_DEFINITIONS } from 'components/OffersTable/utils/cellDefinitions'
import { CollectiveOffersTableBody } from './CollectiveOffersTableBody/CollectiveOffersTableBody'

type CollectiveOffersTableProps = {
hasFilters: boolean
hasFiltersOrNameSearch: boolean
areAllOffersSelected: boolean
hasOffers: boolean
isLoading: boolean
Expand All @@ -33,7 +33,7 @@ type CollectiveOffersTableProps = {
}

export const CollectiveOffersTable = ({
hasFilters,
hasFiltersOrNameSearch,
areAllOffersSelected,
hasOffers,
isLoading,
Expand Down Expand Up @@ -73,7 +73,7 @@ export const CollectiveOffersTable = ({
return (
<OffersTable
hasOffers={hasOffers}
hasFilters={hasFilters}
hasFiltersOrNameSearch={hasFiltersOrNameSearch}
offersCount={offers.length}
isLoading={isLoading}
resetFilters={resetFilters}
Expand Down
6 changes: 3 additions & 3 deletions pro/src/components/OffersTable/OffersTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import styles from './OffersTable.module.scss'

type OffersTableProps = {
hasOffers: boolean
hasFilters: boolean
hasFiltersOrNameSearch: boolean
offersCount: number
isLoading: boolean
resetFilters: () => void
Expand All @@ -19,7 +19,7 @@ type OffersTableProps = {

export const OffersTable = ({
hasOffers,
hasFilters,
hasFiltersOrNameSearch,
offersCount,
isLoading,
resetFilters,
Expand Down Expand Up @@ -67,7 +67,7 @@ export const OffersTable = ({
)}
</>
)}
{!hasOffers && hasFilters && (
{!hasOffers && hasFiltersOrNameSearch && (
<NoResults resetFilters={resetFilters} />
)}
</>
Expand Down
8 changes: 6 additions & 2 deletions pro/src/components/OffersTable/OffersTableSearch/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,15 @@ export function useStoredFilterConfig<T extends 'individual' | 'collective' | 't
}
}

const onResetFilters = () => {
const onResetFilters = (resetNameOrIsbn = true) => {
const filterConfig = getStoredFilterConfig(type)
const newFilterConfig: StoredFilterConfig = {
...filterConfig,
storedFilters: {}
storedFilters: {
...(!resetNameOrIsbn ? {
nameOrIsbn: filterConfig.storedFilters.nameOrIsbn
} : {}),
}
}

if (isSessionStorageAvailable) {
Expand Down
30 changes: 30 additions & 0 deletions pro/src/pages/CollectiveOffers/__specs__/CollectiveOffers.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,36 @@ describe('route CollectiveOffers', () => {
undefined
)
})

it('when clicking on "Réinitialiser les filtres" & WIP_COLLAPSED_MEMORIZED_FILTERS enabled - except nameOrIsbn', async () => {
vi.spyOn(api, 'getCollectiveOffers')
const nameOrIsbn = 'Any word'

await renderOffers(
{
nameOrIsbn,
venueId: '666',
},
['WIP_COLLAPSED_MEMORIZED_FILTERS']
)

await userEvent.click(screen.getByText('Réinitialiser les filtres'))

await waitFor(() => {
expect(api.getCollectiveOffers).toHaveBeenLastCalledWith(
nameOrIsbn,
'1',
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined
)
})
})
})

it('should show draft offers ', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { useDefaultCollectiveSearchFilters } from 'commons/core/Offers/hooks/use
import { CollectiveSearchFiltersParams } from 'commons/core/Offers/types'
import { hasCollectiveSearchFilters } from 'commons/core/Offers/utils/hasSearchFilters'
import { SelectOption } from 'commons/custom_types/form'
import { useActiveFeature } from 'commons/hooks/useActiveFeature'
import { useColumnSorting } from 'commons/hooks/useColumnSorting'
import { usePagination } from 'commons/hooks/usePagination'
import { isSameOffer } from 'commons/utils/isSameOffer'
Expand Down Expand Up @@ -62,6 +63,7 @@ export const CollectiveOffersScreen = ({
const [selectedFilters, setSelectedFilters] = useState(initialSearchFilters)

const defaultCollectiveFilters = useDefaultCollectiveSearchFilters()
const isCollapsedMemorizedFiltersEnabled = useActiveFeature('WIP_COLLAPSED_MEMORIZED_FILTERS')

const currentPageOffersSubset = offers.slice(
(currentPageNumber - 1) * NUMBER_OF_OFFERS_PER_PAGE,
Expand All @@ -70,10 +72,12 @@ export const CollectiveOffersScreen = ({

const hasOffers = currentPageOffersSubset.length > 0

const hasFilters = hasCollectiveSearchFilters(
initialSearchFilters,
defaultCollectiveFilters
)
const hasFilters = hasCollectiveSearchFilters({
searchFilters: initialSearchFilters,
defaultFilters: defaultCollectiveFilters,
ignore: ['nameOrIsbn']
})
const hasFiltersOrNameSearch = hasFilters || !!initialSearchFilters.nameOrIsbn

const userHasNoOffers = !isLoading && !hasOffers && !hasFilters

Expand Down Expand Up @@ -121,10 +125,14 @@ export const CollectiveOffersScreen = ({
applyUrlFiltersAndRedirect({ ...filters, page: DEFAULT_PAGE })
}

const resetFilters = () => {
onResetFilters()
applyUrlFiltersAndRedirect(defaultCollectiveFilters)
setSelectedFilters(defaultCollectiveFilters)
const resetFilters = (resetNameOrIsbn = true) => {
onResetFilters(resetNameOrIsbn)
const newFilters = {
...defaultCollectiveFilters,
...(!resetNameOrIsbn && { nameOrIsbn: initialSearchFilters.nameOrIsbn }),
}
applyUrlFiltersAndRedirect(newFilters)
setSelectedFilters(newFilters)
}

function onSetSelectedOffer(offer: CollectiveOfferResponseModel) {
Expand Down Expand Up @@ -154,7 +162,7 @@ export const CollectiveOffersScreen = ({
categories={categories}
disableAllFilters={userHasNoOffers}
offerer={offerer}
resetFilters={resetFilters}
resetFilters={() => resetFilters(!isCollapsedMemorizedFiltersEnabled)}
selectedFilters={selectedFilters}
setSelectedFilters={setSelectedFilters}
venues={venues}
Expand All @@ -164,7 +172,7 @@ export const CollectiveOffersScreen = ({
) : (
<>
<CollectiveOffersTable
hasFilters={hasFilters}
hasFiltersOrNameSearch={hasFiltersOrNameSearch}
areAllOffersSelected={areAllOffersSelected}
hasOffers={hasOffers}
isLoading={isLoading}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export const IndividualOffersContainer = ({
const [selectedFilters, setSelectedFilters] = useState(initialSearchFilters)
const { isHeadlineOfferAllowedForOfferer } = useIndividualOffersContext()
const isHeadlineOfferEnabled = useActiveFeature('WIP_HEADLINE_OFFER')
const isCollapsedMemorizedFiltersEnabled = useActiveFeature('WIP_COLLAPSED_MEMORIZED_FILTERS')

const currentPageOffersSubset = offers.slice(
(currentPageNumber - 1) * NUMBER_OF_OFFERS_PER_PAGE,
Expand All @@ -64,8 +65,9 @@ export const IndividualOffersContainer = ({

const hasOffers = currentPageOffersSubset.length > 0

const hasFilters = hasSearchFilters(initialSearchFilters)
const userHasNoOffers = !isLoading && !hasOffers && !hasFilters
const hasFilters = hasSearchFilters({ searchFilters: initialSearchFilters, ignore: ['nameOrIsbn'] })
const hasFiltersOrNameSearch = hasFilters || !!initialSearchFilters.nameOrIsbn
const userHasNoOffers = !isLoading && !hasOffers && !hasFiltersOrNameSearch

const areAllOffersSelected =
selectedOffers.length > 0 && selectedOffers.length === offers.length
Expand All @@ -92,10 +94,14 @@ export const IndividualOffersContainer = ({
applySelectedFiltersAndRedirect({ ...filters, page: DEFAULT_PAGE })
}

const resetFilters = () => {
onResetFilters()
setSelectedFilters(DEFAULT_SEARCH_FILTERS)
applySelectedFiltersAndRedirect(DEFAULT_SEARCH_FILTERS)
const resetFilters = (resetNameOrIsbn = true) => {
onResetFilters(resetNameOrIsbn)
const newFilters = {
...DEFAULT_SEARCH_FILTERS,
...(!resetNameOrIsbn && { nameOrIsbn: initialSearchFilters.nameOrIsbn }),
}
setSelectedFilters(newFilters)
applySelectedFiltersAndRedirect(newFilters)
}

function onSetSelectedOffer(offer: ListOffersOfferResponseModel) {
Expand Down Expand Up @@ -132,7 +138,7 @@ export const IndividualOffersContainer = ({
applyFilters={applyFilters}
categories={categories}
disableAllFilters={userHasNoOffers}
resetFilters={resetFilters}
resetFilters={() => resetFilters(!isCollapsedMemorizedFiltersEnabled)}
selectedFilters={selectedFilters}
setSelectedFilters={setSelectedFilters}
venues={venues}
Expand All @@ -158,7 +164,7 @@ export const IndividualOffersContainer = ({
selectedOffers={selectedOffers}
setSelectedOffer={onSetSelectedOffer}
toggleSelectAllCheckboxes={toggleSelectAllCheckboxes}
hasFilters={hasFilters}
hasFiltersOrNameSearch={hasFiltersOrNameSearch}
selectedFilters={selectedFilters}
isAtLeastOneOfferChecked={selectedOffers.length > 1}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,6 @@ export const IndividualOffersSearchFilters = ({
applyFilters(selectedFilters)
}

const requestAllOffers = () => {
resetFilters()
}

const searchByOfferNameLabel = (
<span>
Nom de l’offre ou <abbr title="European Article Numbering">EAN-13</abbr>
Expand Down Expand Up @@ -149,7 +145,7 @@ export const IndividualOffersSearchFilters = ({
onChange: storeNameOrIsbnSearchValue,
value: selectedFilters.nameOrIsbn,
}}
onResetFilters={requestAllOffers}
onResetFilters={resetFilters}
>
<FormLayout.Row inline>
<FieldLayout label="Statut" name="status" isOptional>
Expand Down
Loading
Loading