mirror of
https://github.com/acid-info/free.technology.git
synced 2025-02-28 17:30:30 +00:00
feat: replace filters with pickers
This commit is contained in:
parent
c3402a168b
commit
9ee32a59f4
@ -28,27 +28,23 @@ const JobList = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<CustomBox marginTop={marginTop} marginBottom={marginBottom}>
|
<CustomBox marginTop={marginTop} marginBottom={marginBottom}>
|
||||||
{Object.entries(jobs)
|
{Object.entries(jobs).map(([businessUnit, jobList]) => (
|
||||||
.filter(([businessUnit, _]) =>
|
<Container id={businessUnit} key={businessUnit + '-jobs'}>
|
||||||
!activeBUs?.length ? true : activeBUs.includes(businessUnit),
|
<TitleContainer>
|
||||||
)
|
<Title>{title ?? businessUnit}</Title>
|
||||||
.map(([businessUnit, jobList]) => (
|
</TitleContainer>
|
||||||
<Container key={businessUnit + '-jobs'}>
|
<Jobs>
|
||||||
<TitleContainer>
|
{jobList?.length ? (
|
||||||
<Title>{title ?? businessUnit}</Title>
|
jobList.map((job: any) => <JobItem key={job.id} job={job} />)
|
||||||
</TitleContainer>
|
) : (
|
||||||
<Jobs>
|
<NoJobs>
|
||||||
{jobList?.length ? (
|
No Open Positions
|
||||||
jobList.map((job: any) => <JobItem key={job.id} job={job} />)
|
{/* <p>Please get in touch on our Discord.</p> */}
|
||||||
) : (
|
</NoJobs>
|
||||||
<NoJobs>
|
)}
|
||||||
No Open Positions
|
</Jobs>
|
||||||
{/* <p>Please get in touch on our Discord.</p> */}
|
</Container>
|
||||||
</NoJobs>
|
))}
|
||||||
)}
|
|
||||||
</Jobs>
|
|
||||||
</Container>
|
|
||||||
))}
|
|
||||||
</CustomBox>
|
</CustomBox>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -58,6 +54,7 @@ const Container = styled.div`
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
border-top: 1px solid rgba(0, 0, 0, 0.18);
|
border-top: 1px solid rgba(0, 0, 0, 0.18);
|
||||||
|
scroll-margin-top: 24px;
|
||||||
|
|
||||||
@media (max-width: ${breakpoints.md}px) {
|
@media (max-width: ${breakpoints.md}px) {
|
||||||
margin-top: 60px;
|
margin-top: 60px;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { breakpoints, uiConfigs } from '@/configs/ui.configs'
|
import { breakpoints, uiConfigs } from '@/configs/ui.configs'
|
||||||
import styled from '@emotion/styled'
|
import styled from '@emotion/styled'
|
||||||
|
import Link from 'next/link'
|
||||||
import { calculatElementCount } from '../../../utils/count'
|
import { calculatElementCount } from '../../../utils/count'
|
||||||
import { FilterTitle } from '../Filter'
|
import { FilterTitle } from '../Filter'
|
||||||
import { Tag } from '../Tag'
|
import { Tag } from '../Tag'
|
||||||
@ -15,7 +16,7 @@ type Props = {
|
|||||||
setActiveBUs: React.Dispatch<React.SetStateAction<string[]>>
|
setActiveBUs: React.Dispatch<React.SetStateAction<string[]>>
|
||||||
}
|
}
|
||||||
|
|
||||||
const JobFilter = ({ data, activeBUs, setActiveBUs }: Props) => {
|
const JobPicker = ({ data, activeBUs, setActiveBUs }: Props) => {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
return <div>Something went wrong</div>
|
return <div>Something went wrong</div>
|
||||||
}
|
}
|
||||||
@ -26,7 +27,7 @@ const JobFilter = ({ data, activeBUs, setActiveBUs }: Props) => {
|
|||||||
if (activeBUs.includes(bu)) {
|
if (activeBUs.includes(bu)) {
|
||||||
setActiveBUs((prevBUs) => prevBUs.filter((item) => item !== bu))
|
setActiveBUs((prevBUs) => prevBUs.filter((item) => item !== bu))
|
||||||
} else {
|
} else {
|
||||||
setActiveBUs((prevBUs) => [...prevBUs, bu])
|
setActiveBUs([bu])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,18 +36,21 @@ const JobFilter = ({ data, activeBUs, setActiveBUs }: Props) => {
|
|||||||
<FilterTitle title="Open Vacancies" length={calculatElementCount(data)} />
|
<FilterTitle title="Open Vacancies" length={calculatElementCount(data)} />
|
||||||
<Border />
|
<Border />
|
||||||
<BUs>
|
<BUs>
|
||||||
<Tag active={activeBUs.length === 0} onClick={() => setActiveBUs([])}>
|
<CustomLink href="/jobs">
|
||||||
All Jobs
|
<Tag active={activeBUs.length === 0} onClick={() => setActiveBUs([])}>
|
||||||
</Tag>
|
All Jobs
|
||||||
|
</Tag>
|
||||||
|
</CustomLink>
|
||||||
{businessUnits?.length
|
{businessUnits?.length
|
||||||
? businessUnits.map((bu: string) => (
|
? businessUnits.map((bu: string) => (
|
||||||
<Tag
|
<CustomLink key={bu + '-tag'} href={`#${bu}`}>
|
||||||
active={activeBUs.includes(bu)}
|
<Tag
|
||||||
key={bu + '-tag'}
|
active={activeBUs.includes(bu)}
|
||||||
onClick={() => toggleBU(bu)}
|
onClick={() => toggleBU(bu)}
|
||||||
>
|
>
|
||||||
{bu}
|
{bu}
|
||||||
</Tag>
|
</Tag>
|
||||||
|
</CustomLink>
|
||||||
))
|
))
|
||||||
: null}
|
: null}
|
||||||
</BUs>
|
</BUs>
|
||||||
@ -92,4 +96,8 @@ const Border = styled.hr`
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
`
|
`
|
||||||
|
|
||||||
export default JobFilter
|
const CustomLink = styled(Link)`
|
||||||
|
text-decoration: none;
|
||||||
|
`
|
||||||
|
|
||||||
|
export default JobPicker
|
@ -1,3 +1,3 @@
|
|||||||
export { default as JobFilter } from './JobFilter'
|
|
||||||
export { default as JobItem } from './JobItem'
|
export { default as JobItem } from './JobItem'
|
||||||
export { default as JobList } from './JobList'
|
export { default as JobList } from './JobList'
|
||||||
|
export { default as JobPicker } from './JobPicker'
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { breakpoints } from '@/configs/ui.configs'
|
import { breakpoints } from '@/configs/ui.configs'
|
||||||
import styled from '@emotion/styled'
|
import styled from '@emotion/styled'
|
||||||
|
import { toBuInUrl } from '../../../utils/bu'
|
||||||
import ServiceItem, { ServiceType } from './ServiceItem' // adjust path accordingly
|
import ServiceItem, { ServiceType } from './ServiceItem' // adjust path accordingly
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@ -17,7 +18,7 @@ const ServiceList = ({ services, activeServices }: Props) => {
|
|||||||
!activeServices?.length ? true : activeServices.includes(service.title),
|
!activeServices?.length ? true : activeServices.includes(service.title),
|
||||||
)
|
)
|
||||||
.map((service, idx) => (
|
.map((service, idx) => (
|
||||||
<Container key={idx + '-services'}>
|
<Container id={toBuInUrl(service.title)} key={idx + '-services'}>
|
||||||
<TitleContainer>
|
<TitleContainer>
|
||||||
<Title>{service.title}</Title>
|
<Title>{service.title}</Title>
|
||||||
</TitleContainer>
|
</TitleContainer>
|
||||||
@ -33,6 +34,7 @@ const Container = styled.div`
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
border-top: 1px solid rgba(0, 0, 0, 0.18);
|
border-top: 1px solid rgba(0, 0, 0, 0.18);
|
||||||
|
scroll-margin-top: 24px;
|
||||||
|
|
||||||
@media (max-width: ${breakpoints.md}px) {
|
@media (max-width: ${breakpoints.md}px) {
|
||||||
margin-top: 60px;
|
margin-top: 60px;
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
import { breakpoints, uiConfigs } from '@/configs/ui.configs'
|
import { breakpoints, uiConfigs } from '@/configs/ui.configs'
|
||||||
import styled from '@emotion/styled'
|
import styled from '@emotion/styled'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import { toBuInUrl } from '../../../utils/bu'
|
||||||
import { FilterTitle } from '../Filter'
|
import { FilterTitle } from '../Filter'
|
||||||
import { Tag } from '../Tag'
|
import { Tag } from '../Tag'
|
||||||
import { ServiceType } from './ServiceItem'
|
import { ServiceType } from './ServiceItem'
|
||||||
@ -10,7 +12,7 @@ type Props = {
|
|||||||
setActiveServices: React.Dispatch<React.SetStateAction<string[]>>
|
setActiveServices: React.Dispatch<React.SetStateAction<string[]>>
|
||||||
}
|
}
|
||||||
|
|
||||||
const ServiceFilter = ({
|
const ServicePicker = ({
|
||||||
services,
|
services,
|
||||||
activeServices,
|
activeServices,
|
||||||
setActiveServices,
|
setActiveServices,
|
||||||
@ -25,10 +27,7 @@ const ServiceFilter = ({
|
|||||||
prevServicesContainer.filter((item) => item !== service),
|
prevServicesContainer.filter((item) => item !== service),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
setActiveServices((prevServicesContainer) => [
|
setActiveServices([service])
|
||||||
...prevServicesContainer,
|
|
||||||
service,
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,13 +38,17 @@ const ServiceFilter = ({
|
|||||||
<ServicesContainer>
|
<ServicesContainer>
|
||||||
{services?.length
|
{services?.length
|
||||||
? services.map((service) => (
|
? services.map((service) => (
|
||||||
<Tag
|
<CustomLink
|
||||||
active={activeServices.includes(service.title)}
|
|
||||||
key={service.title + '-tag'}
|
key={service.title + '-tag'}
|
||||||
onClick={() => toggleService(service.title)}
|
href={`#${toBuInUrl(service.title)}`}
|
||||||
>
|
>
|
||||||
{service.title}
|
<Tag
|
||||||
</Tag>
|
active={activeServices.includes(service.title)}
|
||||||
|
onClick={() => toggleService(service.title)}
|
||||||
|
>
|
||||||
|
{service.title}
|
||||||
|
</Tag>
|
||||||
|
</CustomLink>
|
||||||
))
|
))
|
||||||
: null}
|
: null}
|
||||||
</ServicesContainer>
|
</ServicesContainer>
|
||||||
@ -95,4 +98,8 @@ const Border = styled.hr`
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
`
|
`
|
||||||
|
|
||||||
export default ServiceFilter
|
const CustomLink = styled(Link)`
|
||||||
|
text-decoration: none;
|
||||||
|
`
|
||||||
|
|
||||||
|
export default ServicePicker
|
@ -1,3 +1,3 @@
|
|||||||
export { default as ServiceFilter } from './ServiceFilter'
|
|
||||||
export { default as ServiceItem } from './ServiceItem'
|
export { default as ServiceItem } from './ServiceItem'
|
||||||
export { default as ServiceList } from './ServiceList'
|
export { default as ServiceList } from './ServiceList'
|
||||||
|
export { default as ServicePicker } from './ServicePicker'
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Box } from '@/components/Box'
|
import { Box } from '@/components/Box'
|
||||||
import { JobFilter, JobList } from '@/components/Jobs'
|
import { JobList, JobPicker } from '@/components/Jobs'
|
||||||
import { SEO } from '@/components/SEO'
|
import { SEO } from '@/components/SEO'
|
||||||
import { breakpoints } from '@/configs/ui.configs'
|
import { breakpoints } from '@/configs/ui.configs'
|
||||||
import { SubPageLayout } from '@/layouts/SubPageLayout'
|
import { SubPageLayout } from '@/layouts/SubPageLayout'
|
||||||
@ -21,7 +21,7 @@ const Page = ({ jobs }: any) => {
|
|||||||
<SEO />
|
<SEO />
|
||||||
<div>
|
<div>
|
||||||
<CustomBox marginBottom="180px">
|
<CustomBox marginBottom="180px">
|
||||||
<JobFilter
|
<JobPicker
|
||||||
data={jobs}
|
data={jobs}
|
||||||
activeBUs={activeBUs}
|
activeBUs={activeBUs}
|
||||||
setActiveBUs={setActiveBUs}
|
setActiveBUs={setActiveBUs}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Box } from '@/components/Box'
|
import { Box } from '@/components/Box'
|
||||||
import { SEO } from '@/components/SEO'
|
import { SEO } from '@/components/SEO'
|
||||||
import { ServiceFilter, ServiceList } from '@/components/Services'
|
import { ServiceList, ServicePicker } from '@/components/Services'
|
||||||
import ServiceContact from '@/components/Services/ServiceContact'
|
import ServiceContact from '@/components/Services/ServiceContact'
|
||||||
import { ServiceType } from '@/components/Services/ServiceItem'
|
import { ServiceType } from '@/components/Services/ServiceItem'
|
||||||
import { breakpoints } from '@/configs/ui.configs'
|
import { breakpoints } from '@/configs/ui.configs'
|
||||||
@ -22,7 +22,7 @@ const Page = ({ services }: any) => {
|
|||||||
<SEO />
|
<SEO />
|
||||||
<div>
|
<div>
|
||||||
<CustomBox marginBottom="180px">
|
<CustomBox marginBottom="180px">
|
||||||
<ServiceFilter
|
<ServicePicker
|
||||||
services={services}
|
services={services}
|
||||||
activeServices={activeServices}
|
activeServices={activeServices}
|
||||||
setActiveServices={setActiveServices}
|
setActiveServices={setActiveServices}
|
||||||
|
@ -20,3 +20,12 @@ export const businessUnitMark = (businessUnit: string) => {
|
|||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function toBuInUrl(bu: string) {
|
||||||
|
return bu
|
||||||
|
.toLowerCase()
|
||||||
|
.trim()
|
||||||
|
.replace(/\s+/g, '-')
|
||||||
|
.replace(/[^\w\-]+/g, '')
|
||||||
|
.replace(/\-\-+/g, '-')
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user