206 lines
6.1 KiB
TypeScript
206 lines
6.1 KiB
TypeScript
import React, { ReactElement, useState } from 'react'
|
|
import classNames from 'classnames/bind'
|
|
import { addExistingParamsToUrl } from './utils'
|
|
import Button from '@shared/atoms/Button'
|
|
import {
|
|
FilterByAccessOptions,
|
|
FilterByTypeOptions
|
|
} from '../../@types/aquarius/SearchQuery'
|
|
import { useRouter } from 'next/router'
|
|
import styles from './Filters.module.css'
|
|
|
|
const cx = classNames.bind(styles)
|
|
|
|
const clearFilters = [{ display: 'Clear', value: '' }]
|
|
|
|
const serviceFilterItems = [
|
|
{ display: 'datasets', value: FilterByTypeOptions.Data },
|
|
{ display: 'algorithms', value: FilterByTypeOptions.Algorithm }
|
|
]
|
|
|
|
const accessFilterItems = [
|
|
{ display: 'download ', value: FilterByAccessOptions.Download },
|
|
{ display: 'compute ', value: FilterByAccessOptions.Compute }
|
|
]
|
|
|
|
export default function FilterPrice({
|
|
serviceType,
|
|
accessType,
|
|
setServiceType,
|
|
setAccessType,
|
|
addFiltersToUrl,
|
|
className
|
|
}: {
|
|
serviceType: string
|
|
accessType: string
|
|
setServiceType: React.Dispatch<React.SetStateAction<string>>
|
|
setAccessType: React.Dispatch<React.SetStateAction<string>>
|
|
addFiltersToUrl?: boolean
|
|
className?: string
|
|
}): ReactElement {
|
|
const router = useRouter()
|
|
const [serviceSelections, setServiceSelections] = useState<string[]>([])
|
|
const [accessSelections, setAccessSelections] = useState<string[]>([])
|
|
|
|
async function applyFilter(filter: string, filterType: string) {
|
|
filterType === 'accessType' ? setAccessType(filter) : setServiceType(filter)
|
|
if (addFiltersToUrl) {
|
|
let urlLocation = ''
|
|
if (filterType.localeCompare('accessType') === 0) {
|
|
urlLocation = await addExistingParamsToUrl(location, ['accessType'])
|
|
} else {
|
|
urlLocation = await addExistingParamsToUrl(location, ['serviceType'])
|
|
}
|
|
|
|
if (filter && location.search.indexOf(filterType) === -1) {
|
|
filterType === 'accessType'
|
|
? (urlLocation = `${urlLocation}&accessType=${filter}`)
|
|
: (urlLocation = `${urlLocation}&serviceType=${filter}`)
|
|
}
|
|
|
|
router.push(urlLocation)
|
|
}
|
|
}
|
|
|
|
async function handleSelectedFilter(isSelected: boolean, value: string) {
|
|
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 {
|
|
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 (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 {
|
|
if (serviceSelections.length) {
|
|
await applyFilter(undefined, 'serviceType')
|
|
setServiceSelections(serviceFilterItems.map((p) => p.value))
|
|
} else {
|
|
await applyFilter(value, 'serviceType')
|
|
setServiceSelections([value])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async function applyClearFilter(addFiltersToUrl: boolean) {
|
|
setServiceSelections([])
|
|
setAccessSelections([])
|
|
setServiceType(undefined)
|
|
setAccessType(undefined)
|
|
if (addFiltersToUrl) {
|
|
let urlLocation = await addExistingParamsToUrl(location, [
|
|
'accessType',
|
|
'serviceType'
|
|
])
|
|
urlLocation = `${urlLocation}`
|
|
router.push(urlLocation)
|
|
}
|
|
}
|
|
|
|
const styleClasses = cx({
|
|
filterList: true,
|
|
[className]: className
|
|
})
|
|
|
|
return (
|
|
<div className={styleClasses}>
|
|
<div>
|
|
{serviceFilterItems.map((e, index) => {
|
|
const isServiceSelected =
|
|
e.value === serviceType || serviceSelections.includes(e.value)
|
|
const selectFilter = cx({
|
|
[styles.selected]: isServiceSelected,
|
|
[styles.filter]: true
|
|
})
|
|
return (
|
|
<Button
|
|
size="small"
|
|
style="text"
|
|
key={index}
|
|
className={selectFilter}
|
|
onClick={async () => {
|
|
handleSelectedFilter(isServiceSelected, e.value)
|
|
}}
|
|
>
|
|
{e.display}
|
|
</Button>
|
|
)
|
|
})}
|
|
</div>
|
|
<div>
|
|
{accessFilterItems.map((e, index) => {
|
|
const isAccessSelected =
|
|
e.value === accessType || accessSelections.includes(e.value)
|
|
const selectFilter = cx({
|
|
[styles.selected]: isAccessSelected,
|
|
[styles.filter]: true
|
|
})
|
|
return (
|
|
<Button
|
|
size="small"
|
|
style="text"
|
|
key={index}
|
|
className={selectFilter}
|
|
onClick={async () => {
|
|
handleSelectedFilter(isAccessSelected, e.value)
|
|
}}
|
|
>
|
|
{e.display}
|
|
</Button>
|
|
)
|
|
})}
|
|
{clearFilters.map((e, index) => {
|
|
const showClear =
|
|
accessSelections.length > 0 || serviceSelections.length > 0
|
|
return (
|
|
<Button
|
|
size="small"
|
|
style="text"
|
|
key={index}
|
|
className={showClear ? styles.showClear : styles.hideClear}
|
|
onClick={async () => {
|
|
applyClearFilter(addFiltersToUrl)
|
|
}}
|
|
>
|
|
{e.display}
|
|
</Button>
|
|
)
|
|
})}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|