diff --git a/components/JobSkillModal/index.scss b/components/JobSkillModal/index.scss new file mode 100644 index 00000000..58615f4d --- /dev/null +++ b/components/JobSkillModal/index.scss @@ -0,0 +1,16 @@ +#Header #Bar select { + background-color: $grey-90; +} +#Header label { + margin: 0 $unit * 3; + + .Input { + border: 1px solid $grey-80; + border-radius: calc($unit / 1.5); + box-sizing: border-box; + font-size: $font-regular; + padding: $unit * 1.5; + text-align: left; + width: 100%; + } +} diff --git a/components/JobSkillModal/index.tsx b/components/JobSkillModal/index.tsx new file mode 100644 index 00000000..415ff74f --- /dev/null +++ b/components/JobSkillModal/index.tsx @@ -0,0 +1,203 @@ +import React, { useEffect, useState } from "react" +import { getCookie, setCookie } from "cookies-next" +import { useRouter } from "next/router" +import { useSnapshot } from "valtio" +import { useTranslation } from "react-i18next" +import InfiniteScroll from "react-infinite-scroll-component" + +import { appState } from "~utils/appState" +import { skillGroups } from "~utils/skillGroups" + +import * as Dialog from "@radix-ui/react-dialog" +import JobSkillResult from "~components/JobSkillResult" + +import CrossIcon from "~public/icons/Cross.svg" + +import "./index.scss" + +interface Props { + send: (skill: JobSkill, position: number) => any + job?: Job + fromPosition: number + children: React.ReactNode +} + +const JobSkillModal = (props: Props) => { + // Set up router + const router = useRouter() + const locale = router.locale + + // Set up translation + const { t } = useTranslation("common") + + let searchInput = React.createRef() + let scrollContainer = React.createRef() + + const [currentGroup, setCurrentGroup] = useState(-1) + const [currentGroupName, setCurrentGroupName] = useState("") + const [open, setOpen] = useState(false) + const [query, setQuery] = useState("") + const [results, setResults] = useState([]) + + // Pagination states + const [recordCount, setRecordCount] = useState(0) + const [currentPage, setCurrentPage] = useState(1) + const [totalPages, setTotalPages] = useState(1) + + useEffect(() => { + setResults(appState.jobSkills.filter((skill) => skill.main === false)) + setRecordCount( + appState.jobSkills.filter((skill) => skill.main === false).length + ) + }, [appState, setResults]) + + useEffect(() => { + if (searchInput.current) searchInput.current.focus() + }, [searchInput]) + + useEffect(() => { + setRecordCount(results.length) + }, [results]) + + useEffect(() => { + const name = skillGroups + .find((skill) => skill.id === currentGroup) + ?.name["en"].toLowerCase() + setCurrentGroupName(name ? name : "") + }, [currentGroup]) + + function onChange(event: React.ChangeEvent) { + const newValue = parseInt(event.target.value) + setCurrentGroup(newValue) + + if (newValue >= 0) { + setResults( + appState.jobSkills.filter((skill, i) => { + if (newValue === 4) { + return skill.emp && !skill.main + } else if (newValue === 5) { + return skill.base && !skill.main + } else { + return skill.color === newValue && !skill.main + } + }) + ) + } else { + setResults(appState.jobSkills.filter((skill) => skill.main === false)) + } + } + + function inputChanged(event: React.ChangeEvent) { + const text = event.target.value + if (text.length) { + setQuery(text) + } else { + setQuery("") + } + } + + function openChange() { + if (open) { + setQuery("") + // setFirstLoad(true) + setResults([]) + setRecordCount(0) + setCurrentPage(1) + setOpen(false) + } else { + setOpen(true) + } + } + + function onBlur() {} + + function render() { + const rows = results.map((result: JobSkill, i: number) => { + return ( + {}} /> + ) + }) + return ( + 0 ? results.length : 0} + next={() => setCurrentPage(currentPage + 1)} + hasMore={totalPages > currentPage} + scrollableTarget="Results" + loader={
Loading...
} + > + {rows} +
+ ) + } + return ( + + {props.children} + + + + +
+
+ {t("search.result_count", { record_count: recordCount })} +
+ {open ? render() : ""} +
+
+ +
+
+ ) +} + +export default JobSkillModal