From 969ac96417782986bdb7111436805d202e64ebfe Mon Sep 17 00:00:00 2001 From: claudiaHash <49017601+claudiaHash@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:18:15 +0300 Subject: [PATCH] Add service filters download and compute to the existing filters (#817) * filter tags added, filter functionality linked * filter tag selection fix * deselect filter fix, logs deleted * use single filter function * delete unused functions and logs *   replaced --- .../templates/Search/filterService.module.css | 7 + .../templates/Search/filterService.tsx | 128 ++++++++++++++---- src/components/templates/Search/index.tsx | 7 +- src/components/templates/Search/utils.ts | 25 +++- 4 files changed, 138 insertions(+), 29 deletions(-) diff --git a/src/components/templates/Search/filterService.module.css b/src/components/templates/Search/filterService.module.css index 7417f7983..04d0151ef 100644 --- a/src/components/templates/Search/filterService.module.css +++ b/src/components/templates/Search/filterService.module.css @@ -2,6 +2,13 @@ div.filterList { white-space: normal; margin-bottom: 0; + display: flex; + flex-direction: row; + align-items: baseline; +} + +.separator { + width: calc(var(--spacer) / 2); } .filter { diff --git a/src/components/templates/Search/filterService.tsx b/src/components/templates/Search/filterService.tsx index 168c35fe2..a75252470 100644 --- a/src/components/templates/Search/filterService.tsx +++ b/src/components/templates/Search/filterService.tsx @@ -2,7 +2,11 @@ import React, { ReactElement, useState } from 'react' import { useNavigate } from '@reach/router' import styles from './filterService.module.css' import classNames from 'classnames/bind' -import { addExistingParamsToUrl, FilterByTypeOptions } from './utils' +import { + addExistingParamsToUrl, + FilterByAccessOptions, + FilterByTypeOptions +} from './utils' import Button from '../../atoms/Button' const cx = classNames.bind(styles) @@ -14,57 +18,110 @@ const serviceFilterItems = [ { display: 'algorithms', value: FilterByTypeOptions.Algorithm } ] +const accessFilterItems = [ + { display: 'download ', value: FilterByAccessOptions.Download }, + { display: 'compute ', value: FilterByAccessOptions.Compute } +] + export default function FilterPrice({ serviceType, - setServiceType + accessType, + setServiceType, + setAccessType }: { serviceType: string + accessType: string setServiceType: React.Dispatch> + setAccessType: React.Dispatch> }): ReactElement { const navigate = useNavigate() const [serviceSelections, setServiceSelections] = useState([]) + const [accessSelections, setAccessSelections] = useState([]) - async function applyServiceFilter(filterBy: string) { - let urlLocation = await addExistingParamsToUrl(location, ['serviceType']) - if (filterBy && location.search.indexOf('&serviceType') === -1) { - urlLocation = `${urlLocation}&serviceType=${filterBy}` + async function applyFilter(filter: string, filterType: string) { + let urlLocation = '' + if (filterType.localeCompare('accessType') === 0) { + urlLocation = await addExistingParamsToUrl(location, ['accessType']) + } else { + urlLocation = await addExistingParamsToUrl(location, ['serviceType']) } - setServiceType(filterBy) + + if (filter && location.search.indexOf(filterType) === -1) { + filterType === 'accessType' + ? (urlLocation = `${urlLocation}&accessType=${filter}`) + : (urlLocation = `${urlLocation}&serviceType=${filter}`) + } + + filterType === 'accessType' ? setAccessType(filter) : setServiceType(filter) navigate(urlLocation) } async function handleSelectedFilter(isSelected: boolean, value: string) { - if (isSelected) { - if (serviceSelections.length > 1) { - const otherValue = serviceFilterItems.find( - (p) => p.value !== value - ).value - await applyServiceFilter(otherValue) - setServiceSelections([otherValue]) + if ( + value === FilterByAccessOptions.Download || + value === FilterByAccessOptions.Compute + ) { + if (isSelected) { + if (accessSelections.length > 1) { + // both selected -> select the other one + const otherValue = accessFilterItems.find( + (p) => p.value !== value + ).value + await applyFilter(otherValue, 'accessType') + setAccessSelections([otherValue]) + } else { + // only the current one selected -> deselect it + await applyFilter(undefined, 'accessType') + setAccessSelections([]) + } } else { - await applyServiceFilter(undefined) - if (serviceSelections.includes(value)) { - serviceSelections.pop() + if (accessSelections.length) { + // one already selected -> both selected + await applyFilter(undefined, 'accessType') + setAccessSelections(accessFilterItems.map((p) => p.value)) + } else { + // none selected -> select + await applyFilter(value, 'accessType') + setAccessSelections([value]) } } } else { - if (serviceSelections.length) { - await applyServiceFilter(undefined) - setServiceSelections(serviceFilterItems.map((p) => p.value)) + if (isSelected) { + if (serviceSelections.length > 1) { + const otherValue = serviceFilterItems.find( + (p) => p.value !== value + ).value + await applyFilter(otherValue, 'serviceType') + setServiceSelections([otherValue]) + } else { + await applyFilter(undefined, 'serviceType') + setServiceSelections([]) + } } else { - await applyServiceFilter(value) - setServiceSelections([value]) + if (serviceSelections.length) { + await applyFilter(undefined, 'serviceType') + setServiceSelections(serviceFilterItems.map((p) => p.value)) + } else { + await applyFilter(value, 'serviceType') + setServiceSelections([value]) + } } } } async function applyClearFilter() { - let urlLocation = await addExistingParamsToUrl(location, ['serviceType']) + let urlLocation = await addExistingParamsToUrl(location, [ + 'accessType', + 'serviceType' + ]) urlLocation = `${urlLocation}` setServiceSelections([]) + setAccessSelections([]) + setServiceType(undefined) + setAccessType(undefined) navigate(urlLocation) } @@ -91,8 +148,31 @@ export default function FilterPrice({ ) })} +
+ {accessFilterItems.map((e, index) => { + const isAccessSelected = + e.value === accessType || accessSelections.includes(e.value) + const selectFilter = cx({ + [styles.selected]: isAccessSelected, + [styles.filter]: true + }) + return ( + + ) + })} {clearFilters.map((e, index) => { - const showClear = serviceSelections.length > 0 + const showClear = + accessSelections.length > 0 || serviceSelections.length > 0 return (