diff --git a/src/App.tsx b/src/App.tsx index c56000d0086334d0d6c5a05d5bd16c33ec35dc98..10b22331bfafe4c9f6e3d6c56da28c8c2679d463 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,14 +3,17 @@ import {Redirect, Route, Switch} from 'react-router'; import LandingPage from "./pages/landingPage/landingPage"; import OverviewPage from "./pages/overviewPage/Overview"; import { GlobalCommitContext } from './context/commitPageContext'; -import { useState } from 'react'; import IssuePage from './pages/issuePage'; import { CommitPage } from './pages/commitGraphPage/CommitPage'; import { IssueGraphPage } from './pages/issueGraphPage/issueGraphPage'; import CommitPageWrapper from "./pages/commitListPage/commitPageWrapper" +import './i18n'; +import { useState } from 'react'; function App() { - const [testContext, setTestContext] = useState<string>('Admin'); + + const [language, setLanguage] = useState("no"); + return ( <div className="App"> <Switch> @@ -36,7 +39,7 @@ function App() { <CommitPageWrapper/> </Route> <Route exact path={"/commitgraph"}> - <GlobalCommitContext.Provider value = {{testContext, setTestContext}}> + <GlobalCommitContext.Provider value={{language: language, setLanguage: setLanguage}}> <CommitPage /> </GlobalCommitContext.Provider> </Route> diff --git a/src/components/graphs/barChart/barChart.module.scss b/src/components/graphs/barChart/barChart.module.scss index bf4555180dc3561f60260ee99fadd73de9f60800..d824909b8a44bd0dd1d4f8dfe7a1f84f9586758d 100644 --- a/src/components/graphs/barChart/barChart.module.scss +++ b/src/components/graphs/barChart/barChart.module.scss @@ -19,10 +19,16 @@ justify-content: space-evenly; } -// .datePickerContainer { -// display: flex; -// flex-direction: column; -// justify-content: space-evenly; -// height: 30%; -// width: 50%; -// } +.datePickerContainer { + display: flex; + flex-direction: row; + justify-content: space-evenly; + height: 30%; + width: 70%; +} + +@media screen and (max-width: 500px) { + .datePickerContainer { + flex-direction: column; + } +} diff --git a/src/components/graphs/barChart/barChart.tsx b/src/components/graphs/barChart/barChart.tsx index 91c3f3a240d42f6fa3fc541ace1fdda9c80aec34..19f8c946af166dd0693d942c177319ab3aebe4fd 100644 --- a/src/components/graphs/barChart/barChart.tsx +++ b/src/components/graphs/barChart/barChart.tsx @@ -8,6 +8,7 @@ import { ICommitsPerDay } from "../../../utils/victory/types"; import { Commit, Issue } from '../../../utils/queryType'; import { TextField } from "@mui/material"; import { DatePicker } from "@mui/lab"; +import { useTranslation } from 'react-i18next'; interface IBarChartProps { @@ -22,6 +23,7 @@ export const BarChart = (props: IBarChartProps) => { const [currentData, setCurrentData] = useState<ICommitsPerDay[]>(); const [dateIntervalStart, setStartDate] = useState<Date>(new Date("2021-09-26")); const [dateIntervalEnd, setEndDate] = useState<Date>(new Date("2021-10-03")); + const { t } = useTranslation(); useEffect(() => { let commitsPerDay = getEntriesPerDayBarChartData(dateIntervalStart, dateIntervalEnd); @@ -30,27 +32,29 @@ export const BarChart = (props: IBarChartProps) => { return ( <div className={styles.container}> - <h2>{props.title}</h2> + <h2>{t(props.title)}</h2> <LocalizationProvider dateAdapter={AdapterDateFns}> - <div> - <DatePicker - label="Start date" - value={dateIntervalStart} - onChange={(newValue) => { - setStartDate(newValue ?? new Date("2021-09-26")); - }} - renderInput={(params) => <TextField {...params} sx={{ marginBottom: "10px"}} />} - /> - </div> - <div> - <DatePicker - label="End date" - value={dateIntervalEnd} - onChange={(newValue) => { - setEndDate(newValue ?? new Date()); - }} - renderInput={(params) => <TextField {...params} />} - /> + <div className={styles.datePickerContainer}> + <div> + <DatePicker + label={t("Start date")} + value={dateIntervalStart} + onChange={(newValue) => { + setStartDate(newValue ?? new Date("2021-09-26")); + }} + renderInput={(params) => <TextField {...params} sx={{ marginBottom: "10px"}} />} + /> + </div> + <div> + <DatePicker + label={t("End date")} + value={dateIntervalEnd} + onChange={(newValue) => { + setEndDate(newValue ?? new Date()); + }} + renderInput={(params) => <TextField {...params} />} + /> + </div> </div> </LocalizationProvider> <div className={styles.wrapper}> @@ -67,4 +71,4 @@ export const BarChart = (props: IBarChartProps) => { </div> </div> ) -} \ No newline at end of file +} diff --git a/src/components/graphs/pieChart/pieChart.module.scss b/src/components/graphs/pieChart/pieChart.module.scss index 57a7c89be6647264e7262e0a646eecbf46aafbf9..bf7c9091bf2e54e6b48e292871ad60ac927fec48 100644 --- a/src/components/graphs/pieChart/pieChart.module.scss +++ b/src/components/graphs/pieChart/pieChart.module.scss @@ -3,7 +3,7 @@ display: flex; flex-direction: column; align-items: center; - width: 70%; + width: 60%; } @media only screen and (max-width: 500px){ diff --git a/src/components/graphs/pieChart/pieChart.tsx b/src/components/graphs/pieChart/pieChart.tsx index 9123e42b76329724841b95f8223a1cf56429c4bb..f58f770060a551d55f639fe2554eb10a381f4fb0 100644 --- a/src/components/graphs/pieChart/pieChart.tsx +++ b/src/components/graphs/pieChart/pieChart.tsx @@ -4,6 +4,7 @@ import { Commit, Issue } from '../../../utils/queryType'; import { useVictory } from '../../../utils/victory/useVictory'; import styles from './pieChart.module.scss'; import Switch from "react-switch"; +import { useTranslation } from 'react-i18next'; interface IPieChartProps { data: Commit[] | Issue[], @@ -16,6 +17,7 @@ export const PieChart = (props: IPieChartProps) => { const [selectedAnimals, setSelectedAnimals] = useState( getAnonAnimals().map(animal => { return {animal: animal, selected: true}})) const [currentData, setCurrentData] = useState(getEntriesPerMemberPieChartData(selectedAnimals)); + const { t } = useTranslation(); const changeSelectedAnimals = (animalToChange: string) => { setSelectedAnimals(prevState => @@ -31,7 +33,7 @@ export const PieChart = (props: IPieChartProps) => { let checkboxes = getAnonAnimals().map(animal => { return ( <div className={styles.checkboxContainer} key={animal}> - <label>{animal}</label> + <label>{t(animal)}</label> <Switch onColor="#fae7c2" checked={selectedAnimals.find(sa => sa.animal === animal)?.selected ?? false} @@ -49,7 +51,7 @@ export const PieChart = (props: IPieChartProps) => { return ( <div className={styles.pieChartContainer}> - <h2>{props.title}</h2> + <h2>{t(props.title)}</h2> <div className={styles.inputContainer}> {animalCheckboxes()} </div> diff --git a/src/context/commitPageContext.tsx b/src/context/commitPageContext.tsx index bd691636b7d57b80baf21b4c8e7447e68598825e..a15ae6ead9b61af89b330b4964178aceef5b54c3 100644 --- a/src/context/commitPageContext.tsx +++ b/src/context/commitPageContext.tsx @@ -1,10 +1,12 @@ -import { createContext, useContext } from "react" +import { createContext, Dispatch, SetStateAction, useContext } from "react" +import '../i18n'; export type GlobalGraphCommit = { - testContext: string - setTestContext:(c: string) => void + language: string, + setLanguage: Dispatch<SetStateAction<string>>, } + export const GlobalCommitContext = createContext<GlobalGraphCommit>({ -testContext: 'Hello World', -setTestContext: () => {}, -}) -export const useCommitContext = () => useContext(GlobalCommitContext) \ No newline at end of file + language: "no", + setLanguage: () => {}, +}); +export const useCommitContext = () => useContext(GlobalCommitContext) diff --git a/src/context/issuePageContext.tsx b/src/context/issuePageContext.tsx deleted file mode 100644 index 593b52394027484b478556330bdb01099b8db0a4..0000000000000000000000000000000000000000 --- a/src/context/issuePageContext.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createContext, useContext } from "react" -export type GlobalGraphIssue = { - testContext: string - setTestContext:(c: string) => void -} -export const GlobalIssueContext = createContext<GlobalGraphIssue>({ -testContext: 'Hello World', -setTestContext: () => {}, -}) -export const useIssueContext = () => useContext(GlobalIssueContext) \ No newline at end of file diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000000000000000000000000000000000000..c799fe19fa135443a09d82c1a57001e3fc8296ff --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,55 @@ +// Source: https://react.i18next.com/guides/quick-start + +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; + +// the translations +// (tip move them in a JSON file and import them, +// or even better, manage them separated from your code: https://react.i18next.com/guides/multiple-translation-files) +const resources = { + en: { + translation: { + "Charts for issues": "Charts for issues", + "Charts for commits": "Charts for commits", + "Start date": "Start date", + "End date": "End date", + "Commits per day": "Commits per day", + "Commits per member": "Commits per member", + "Issues authored per member": "Issues authored by each member", + "Tiger": "Tiger", + "Lion": "Lion", + "Giraffe": "Giraffe", + "Rhino": "Rhino", + } + }, + no: { + translation: { + "Charts for issues": "Diagrammer for issues", + "Charts for commits": "Diagrammer for commits", + "Start date": "Startdato", + "End date": "Sluttdato", + "Commits per day": "Commits per dag", + "Commits per member": "Commits per medlem", + "Issues authored per member": "Issues laget av hvert medlem", + "Tiger": "Tiger", + "Lion": "Løve", + "Giraffe": "Sjiraff", + "Rhino": "Nesehorn", + } + } +}; + +i18n + .use(initReactI18next) // passes i18n down to react-i18next + .init({ + resources, + lng: "en", // language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources + // you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage + // if you're using a language detector, do not define the lng option + + interpolation: { + escapeValue: false // react already safes from xss + } + }); + + export default i18n; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 0d21890166ccb38bac7545b07857681029bfc474..cad26d1a7b85f7080418b942468d67be70c6b2fb 100644 --- a/src/index.css +++ b/src/index.css @@ -1,6 +1,6 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + font-family: "Roboto", BlinkMacSystemFont, 'Segoe UI', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; -webkit-font-smoothing: antialiased; diff --git a/src/pages/commitGraphPage/CommitPage.module.scss b/src/pages/commitGraphPage/CommitPage.module.scss index 064930c4ba585392aa47cd7eeaa99ed4d9cb152f..c26a632badab6b36de71366e5a312ed70006fc4f 100644 --- a/src/pages/commitGraphPage/CommitPage.module.scss +++ b/src/pages/commitGraphPage/CommitPage.module.scss @@ -8,3 +8,21 @@ width: 80%; margin-left: 10%; } + +.header { + display: flex; + justify-content: center; + align-items: center; + width: 100%; +} + +.button { + background: #F5CA7B; + border-radius: 5px; + border: none; + width: 3.5rem; + height: 3.5rem; + font-size: 2rem; + position: relative; + left: 20%; +} diff --git a/src/pages/commitGraphPage/CommitPage.tsx b/src/pages/commitGraphPage/CommitPage.tsx index f05eb4689f36ed50a22adc005134de23d071ec42..7406d818b2680b851a2a19c6e2f7d54ece834a32 100644 --- a/src/pages/commitGraphPage/CommitPage.tsx +++ b/src/pages/commitGraphPage/CommitPage.tsx @@ -6,9 +6,19 @@ import styles from './CommitPage.module.scss'; import { queryTypes, Commit } from '../../utils/queryType' import "react-loader-spinner/dist/loader/css/react-spinner-loader.css"; import Loader from "react-loader-spinner"; +import { useCommitContext } from '../../context/commitPageContext'; +import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; export const CommitPage = () => { - const commitData = useGitlabApi(queryTypes.AllCommits); + const commitData = useGitlabApi(queryTypes.AllCommitsWithoutPagination); + const { t, i18n } = useTranslation(); + const context = useCommitContext(); + + useEffect(() => { + i18n.changeLanguage(context.language) + }, [context.language]) + if (commitData.isLoading) { return ( @@ -24,9 +34,16 @@ export const CommitPage = () => { return ( <div className={styles.pageContainer}> - <h1>Charts for issues</h1> + <div className={styles.header}> + <h1>{t("Charts for issues")}</h1> + <button + className={styles.button} + onClick={() => context.setLanguage(context.language === "no" ? "en" : "no")}> + {context.language} + </button> + </div> <BarChart data={commitData.data as Commit[]} title="Commits per day"/> <PieChart data={commitData.data as Commit[]} title={"Commits per member"}/> </div> ) -} \ No newline at end of file +} diff --git a/src/utils/queryType.ts b/src/utils/queryType.ts index 06d7cc5ce68dc5ff8e99b37cbc114bb6c6de4f3e..e531aa103b65998215f07918cd5d38ca1ec0a609 100644 --- a/src/utils/queryType.ts +++ b/src/utils/queryType.ts @@ -6,7 +6,7 @@ export enum queryTypes { Languages = "languages", Access="access_requests", AllIssuesWithoutPagination = "issues/?scope=all", - AllCommitsWithoutPagination = "commits/?scope=all", + AllCommitsWithoutPagination = "repository/commits/?per_page=1000", } export type User = { diff --git a/src/utils/victory/useVictory.tsx b/src/utils/victory/useVictory.tsx index dcfb40b618d3e7033bdbd142ead70b87bb219b06..e2cf7e449fb12d3a6bc1a7c62037cac316e7bfdb 100644 --- a/src/utils/victory/useVictory.tsx +++ b/src/utils/victory/useVictory.tsx @@ -62,16 +62,21 @@ export const useVictory = (initData: Commit[] | Issue[]) => { return { anonData, animals }; } - function getEntriesPerDayBarChartData(startDate: Date, endDate: Date) : ICommitsPerDay[]{ + function getEntriesPerDayBarChartData(startDateInput: Date, endDateInput: Date) : ICommitsPerDay[]{ let commitsPerDayData = [] let anon = anonymizeData(initData); - startDate = startDate ?? new Date(); - endDate = endDate ?? new Date(); + let startDate = new Date(startDateInput); + let endDate = new Date(endDateInput); for (let day = startDate; day <= endDate; day.setDate(day.getDate() + 1)) { - let amount: number = anon.anonData.filter(entry => entry.date.getDate() === day.getDate()).length; - commitsPerDayData.push({ date: `${day.getDate()}.${day.getMonth()}`, amount: amount}); + anon.anonData.forEach(entry => { + console.log(entry) + }) + let amount: number = anon.anonData.filter(entry => + entry.date.getMonth() === day.getMonth() && entry.date.getDate() === day.getDate() + ).length; + commitsPerDayData.push({ date: `${day.getDate()}.${day.getMonth() + 1}`, amount: amount}); } return commitsPerDayData; }; diff --git a/yarn.lock b/yarn.lock index 90e8a46d0addbf11d8be2b2b4e970dd23239db95..2313b8fc9e7c68c6da3a45a9b3f095d47f8046f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1967,6 +1967,221 @@ dependencies: "@babel/types" "^7.3.0" +"@types/canvasjs@^1.9.7": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@types/canvasjs/-/canvasjs-1.9.7.tgz#bbb3042cea23c577a4d5f72e97f00619ac5b7d22" + integrity sha512-/CfA3VtyTYVXDHvMy8F5hsvRUTiBX7TGe+nAHNONoJlNHbqakeIzxxt1MSNH619s8Oiu4CcFBMmJVg50El/0lw== + +"@types/d3-array@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.1.tgz#0ff28ee7052a2e504cb951d17df7437c33d442d6" + integrity sha512-D/G7oG0czeszALrkdUiV68CDiHDxXf+M2mLVqAyKktGd12VKQQljj1sHJGBKjcK4jRH1biBd6ZPQPHpJ0mNa0w== + +"@types/d3-axis@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.1.tgz#6afc20744fa5cc0cbc3e2bd367b140a79ed3e7a8" + integrity sha512-zji/iIbdd49g9WN0aIsGcwcTBUkgLsCSwB+uH+LPVDAiKWENMtI3cJEWt+7/YYwelMoZmbBfzA3qCdrZ2XFNnw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.1.tgz#ae5f17ce391935ca88b29000e60ee20452c6357c" + integrity sha512-B532DozsiTuQMHu2YChdZU0qsFJSio3Q6jmBYGYNp3gMDzBmuFFgPt9qKA4VYuLZMp4qc6eX7IUFUEsvHiXZAw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.1.tgz#54c8856c19c8e4ab36a53f73ba737de4768ad248" + integrity sha512-eQfcxIHrg7V++W8Qxn6QkqBNBokyhdWSAS73AbkbMzvLQmVVBviknoz2SRS/ZJdIOmhcmmdCRE/NFOm28Z1AMw== + +"@types/d3-color@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.0.2.tgz#53f2d6325f66ee79afd707c05ac849e8ae0edbb0" + integrity sha512-WVx6zBiz4sWlboCy7TCgjeyHpNjMsoF36yaagny1uXfbadc9f+5BeBf7U+lRmQqY3EHbGQpP8UdW8AC+cywSwQ== + +"@types/d3-contour@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.1.tgz#9ff4e2fd2a3910de9c5097270a7da8a6ef240017" + integrity sha512-C3zfBrhHZvrpAAK3YXqLWVAGo87A4SvJ83Q/zVJ8rFWJdKejUnDYaWZPkA8K84kb2vDA/g90LTQAz7etXcgoQQ== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.0.tgz#c09953ac7e5460997f693d2d7bf3522e0d4a88e6" + integrity sha512-iGm7ZaGLq11RK3e69VeMM6Oqj2SjKUB9Qhcyd1zIcqn2uE8w9GFB445yCY46NOQO3ByaNyktX1DK+Etz7ZaX+w== + +"@types/d3-dispatch@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz#a1b18ae5fa055a6734cb3bd3cbc6260ef19676e3" + integrity sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw== + +"@types/d3-drag@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.1.tgz#fb1e3d5cceeee4d913caa59dedf55c94cb66e80f" + integrity sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.0.tgz#f3c61fb117bd493ec0e814856feb804a14cfc311" + integrity sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A== + +"@types/d3-ease@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" + integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== + +"@types/d3-fetch@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.1.tgz#f9fa88b81aa2eea5814f11aec82ecfddbd0b8fe0" + integrity sha512-toZJNOwrOIqz7Oh6Q7l2zkaNfXkfR7mFSJvGvlD/Ciq/+SQ39d5gynHJZ/0fjt83ec3WL7+u3ssqIijQtBISsw== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.3.tgz#76cb20d04ae798afede1ea6e41750763ff5a9c82" + integrity sha512-z8GteGVfkWJMKsx6hwC3SiTSLspL98VNpmvLpEFJQpZPq6xpA1I8HNBDNSpukfK0Vb0l64zGFhzunLgEAcBWSA== + +"@types/d3-format@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.1.tgz#194f1317a499edd7e58766f96735bdc0216bb89d" + integrity sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== + +"@types/d3-geo@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.2.tgz#e7ec5f484c159b2c404c42d260e6d99d99f45d9a" + integrity sha512-DbqK7MLYA8LpyHQfv6Klz0426bQEf7bRTvhMy44sNGVyZoWn//B0c+Qbeg8Osi2Obdc9BLLXYAKpyWege2/7LQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.0.2.tgz#ca63f2f4da15b8f129c5b7dffd71d904cba6aca2" + integrity sha512-+krnrWOZ+aQB6v+E+jEkmkAx9HvsNAD+1LCD0vlBY3t+HwjKnsBFbpVLx6WWzDzCIuiTWdAxXMEnGnVXpB09qQ== + +"@types/d3-interpolate@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-polygon@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.0.tgz#5200a3fa793d7736fa104285fa19b0dbc2424b93" + integrity sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw== + +"@types/d3-quadtree@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz#433112a178eb7df123aab2ce11c67f51cafe8ff5" + integrity sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw== + +"@types/d3-random@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.1.tgz#5c8d42b36cd4c80b92e5626a252f994ca6bfc953" + integrity sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ== + +"@types/d3-scale-chromatic@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" + integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== + +"@types/d3-scale@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.1.tgz#fbe8238e2eff27af577d2b7d0b933ae50a546970" + integrity sha512-GDuXcRcR6mKcpUVMhPNttpOzHi2dP6YcDqLZYSZHgwTZ+sfCa8e9q0VEBwZomblAPNMYpVqxojnSyIEb4s/Pwg== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.1.tgz#e57b01ab69b18b380f68db97b76ceefe62f17191" + integrity sha512-aJ1d1SCUtERHH65bB8NNoLpUOI3z8kVcfg2BGm4rMMUwuZF4x6qnIEKjT60Vt0o7gP/a/xkRVs4D9CpDifbyRA== + +"@types/d3-shape@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.0.2.tgz#4b1ca4ddaac294e76b712429726d40365cd1e8ca" + integrity sha512-5+ButCmIfNX8id5seZ7jKj3igdcxx+S9IDBiT35fQGTLZUfkFgTv+oBH34xgeoWDKpWcMITSzBILWQtBoN5Piw== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.0.tgz#ee7b6e798f8deb2d9640675f8811d0253aaa1946" + integrity sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw== + +"@types/d3-time@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + +"@types/d3-timer@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" + integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + +"@types/d3-transition@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.1.tgz#c9a96125567173d6163a6985b874f79154f4cc3d" + integrity sha512-Sv4qEI9uq3bnZwlOANvYK853zvpdKEm1yz9rcc8ZTsxvRklcs9Fx4YFuGA3gXoQN/c/1T6QkVNjhaRO/cWj94g== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.1.tgz#4bfc7e29625c4f79df38e2c36de52ec3e9faf826" + integrity sha512-7s5L9TjfqIYQmQQEUcpMAcBOahem7TRoSO/+Gkz02GbMVuULiZzjF2BOdw291dbO2aNon4m2OdFsRGaCq2caLQ== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.0.0.tgz#d102ec6ea5741e51a1ff7b8228850db0665ccd27" + integrity sha512-7rMMuS5unvbvFCJXAkQXIxWTo2OUlmVXN5q7sfQFesuVICY55PSP6hhbUhWjTTNpfTTB3iLALsIYDFe7KUNABw== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + "@types/eslint@^7.2.6": version "7.2.6" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz" @@ -1985,6 +2200,11 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/geojson@*": + version "7946.0.8" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" + integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz" @@ -2194,6 +2414,13 @@ dependencies: source-map "^0.6.1" +"@types/victory@^33.1.5": + version "33.1.5" + resolved "https://registry.yarnpkg.com/@types/victory/-/victory-33.1.5.tgz#de1ee8ddc685582b9e394baff03606f87d627d4b" + integrity sha512-Lpi1kAlZ4+gY7oH3tRcmJs4YhTIJTTJxkQkyYTK7CtTHl+S6Xf7E7e207eq6D/Dn9UQAB7PCrNrzTGtO5+9GGQ== + dependencies: + "@types/react" "*" + "@types/webpack-sources@*": version "2.1.0" resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz" @@ -3467,6 +3694,16 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz" integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== +canvasjs-react-charts@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/canvasjs-react-charts/-/canvasjs-react-charts-1.0.5.tgz#bdcc06f7bd50a24f69cca9615dafabc0a2a7b063" + integrity sha512-8P3KnAvCqftmqf4O/xG6PlIDcTr0IvzuE4l6ACXIOROKtFmnmUu/xPEeq+0vI9Xvh7zXjzZvRqw0p1uxXr034g== + +canvasjs@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/canvasjs/-/canvasjs-1.8.3.tgz#181a526bbce09c1909431d9471f808494fe970cf" + integrity sha512-60eUT0VjqRgYqdIQcOkXg0Zptfbl4HefA/O51YEf1m/P0uXvE3icI/1KPrXpY9aVxn8gG/BB8DzVoTGCcyBnYg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz" @@ -3756,6 +3993,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" @@ -6228,6 +6470,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" @@ -6378,6 +6627,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" @@ -10351,6 +10605,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +robust-predicates@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" + integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== + rollup-plugin-babel@^4.3.3: version "4.4.0" resolved "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz" @@ -10405,6 +10664,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" @@ -10422,7 +10686,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==