Dejvino's Curriculum Vitae
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

52 lines
1.5 KiB

  1. import React from 'react';
  2. import { Job } from '@/PersonalDataTypes';
  3. import { Accordion } from 'react-bootstrap';
  4. import { JobListProps } from './types';
  5. import JobTags from './JobTags';
  6. import md from '../Markdown';
  7. function JobTitle(props: {job: Job, heading?: string}) {
  8. const {job, heading} = props
  9. return (
  10. <div>
  11. <div><strong>{job.position}</strong></div>
  12. <div>{[job.company, job.timerange].filter(x => x).join(', ')}</div>
  13. {heading && (<div>({heading})</div>)}
  14. </div>
  15. )
  16. }
  17. function AccordionJobItem(props: {job: Job, eventKey: string, heading?: string}) {
  18. const {job, eventKey} = props
  19. return (
  20. <Accordion.Item eventKey={eventKey}>
  21. <Accordion.Header><JobTitle job={job} /></Accordion.Header>
  22. <Accordion.Body className='multiline'>
  23. {md(job.description)}
  24. {job.tags && <JobTags tags={job.tags} />}
  25. </Accordion.Body>
  26. </Accordion.Item>
  27. )
  28. }
  29. export type Props = {
  30. heading: string,
  31. } & JobListProps
  32. const defaultProps = {
  33. entriesPerRow: 2,
  34. currentHeading: 'Currently',
  35. }
  36. export default function JobsAccordion(props: JobListProps) {
  37. const {jobs} = props
  38. const config = {...defaultProps, ...props}
  39. return (
  40. <Accordion defaultActiveKey={jobs.current ? 'current' : 'previous-0'}>
  41. {jobs.current && <AccordionJobItem job={jobs.current} heading={config.currentHeading} eventKey={'current'}/>}
  42. {jobs.previous?.map((job, index) => <AccordionJobItem key={index} job={job} eventKey={`previous-${index}`} />)}
  43. </Accordion>
  44. )
  45. }