diff --git a/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.module.scss b/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.module.scss new file mode 100644 index 000000000..b12f4e737 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.module.scss @@ -0,0 +1,7 @@ +.header{ + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 1rem; +} \ No newline at end of file diff --git a/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.tsx b/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.tsx index 2ee82e653..f60616f35 100644 --- a/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.tsx +++ b/frontend/src/PagesAdmin/RecruitmentAdminPage/RecruitmentAdminPage.tsx @@ -13,7 +13,7 @@ import { reverse } from '~/named-urls'; import { ROUTES } from '~/routes'; import { dbT, getObjectFieldOrNumber, lowerCapitalize } from '~/utils'; import { AdminPageLayout } from '../AdminPageLayout/AdminPageLayout'; - +import styles from './RecruitmentAdminPage.module.scss'; export function RecruitmentAdminPage() { const navigate = useNavigate(); const [recruitments, setRecruitments] = useState([]); @@ -99,11 +99,14 @@ export function RecruitmentAdminPage() { const backendUrl = ROUTES.backend.admin__samfundet_recruitment_changelist; const header = ( - <> +
- + +
); return ( diff --git a/frontend/src/PagesAdmin/RecruitmentApplicantAdminPage/components/RecruitmentInterviewNotesForm/RecruitmentInterviewNotesForm.module.scss b/frontend/src/PagesAdmin/RecruitmentApplicantAdminPage/components/RecruitmentInterviewNotesForm/RecruitmentInterviewNotesForm.module.scss index f8489e26f..d36118ad6 100755 --- a/frontend/src/PagesAdmin/RecruitmentApplicantAdminPage/components/RecruitmentInterviewNotesForm/RecruitmentInterviewNotesForm.module.scss +++ b/frontend/src/PagesAdmin/RecruitmentApplicantAdminPage/components/RecruitmentInterviewNotesForm/RecruitmentInterviewNotesForm.module.scss @@ -1,4 +1,4 @@ -@import 'src/constants.scss'; +@use 'src/constants' as *; .textBox, .markdownWrapper { diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.module.scss b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.module.scss new file mode 100644 index 000000000..d94503f59 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.module.scss @@ -0,0 +1,16 @@ +.charts_group { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 3rem; + background-color: rgba(201, 201, 201, 0.25); +} + +.chart_wrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1rem; +} \ No newline at end of file diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.tsx b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.tsx new file mode 100644 index 000000000..ce4cc6d80 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/ApplicantCountCharts/ApplicantCountCharts.tsx @@ -0,0 +1,53 @@ +import { Chart } from '~/Components'; +import type { CartesianChartsData } from '~/Components/Chart/CartesianCharts/utils/types'; +import styles from './ApplicantCountCharts.module.scss'; + +type ApplicantCountChartsProps = { + indexedHistoricUniqueApplicants: CartesianChartsData[]; + indexedHistoricUniqueApplicantsSpring: CartesianChartsData[]; + indexedHistoricUniqueApplicantsAutumn: CartesianChartsData[]; +}; + +export function ApplicantCountCharts({ + indexedHistoricUniqueApplicants, + indexedHistoricUniqueApplicantsSpring, + indexedHistoricUniqueApplicantsAutumn, +}: ApplicantCountChartsProps) { + return ( +
+
+ +
+
+ +
+
+ +
+
+ ); +} diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.module.scss b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.module.scss new file mode 100644 index 000000000..d0cd00bdc --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.module.scss @@ -0,0 +1,21 @@ +.charts_container { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.charts_group { + display: flex; + overflow-x: scroll; + gap: 3rem; + background-color: rgba(201, 201, 201, 0.25); + border: 2px solid black; +} + +.chart_wrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1rem; +} \ No newline at end of file diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.tsx b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.tsx new file mode 100644 index 000000000..9976eb156 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/CampusDistributionCharts/CampusDistributionCharts.tsx @@ -0,0 +1,47 @@ +import { Chart, H4 } from '~/Components'; +import type { CircularChartData } from '~/Components/Chart/CircularCharts'; +import styles from './CampusDistributionCharts.module.scss'; + +type CampusDistributionChartsProps = { + historicCampusDistribution: Array<{ semester: string; distribution: CircularChartData[] }>; +}; + +export function CampusDistributionCharts({ historicCampusDistribution }: CampusDistributionChartsProps) { + if (historicCampusDistribution.length === 0) { + return
Loading campus distribution data...
; + } + + return ( + <> +

These boxes contain the exact same data so that you can scroll to compare semesters.

+
+
+ {historicCampusDistribution.map((data) => ( +
+ +
+ ))} +
+
+ {historicCampusDistribution.map((data) => ( +
+ +
+ ))} +
+
+ + ); +} diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.module.scss b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.module.scss new file mode 100644 index 000000000..26776ae26 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.module.scss @@ -0,0 +1,3 @@ +.under_construction { + background-color: yellow; +} \ No newline at end of file diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.tsx b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.tsx new file mode 100644 index 000000000..0a8477362 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/RecruitmentHistoricStatisticsAdminPage.tsx @@ -0,0 +1,137 @@ +import { type ReactNode, useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { H1, type Tab, TabView } from '~/Components'; +import type { CartesianChartsData } from '~/Components/Chart/CartesianCharts'; +import type { CircularChartData } from '~/Components/Chart/CircularCharts'; +import { AdminPageLayout } from '~/PagesAdmin/AdminPageLayout/AdminPageLayout'; +import { useTitle } from '~/hooks'; +import { KEY } from '~/i18n/constants'; +import { ApplicantCountCharts } from './ApplicantCountCharts/ApplicantCountCharts'; +import { CampusDistributionCharts } from './CampusDistributionCharts/CampusDistributionCharts'; +import styles from './RecruitmentHistoricStatisticsAdminPage.module.scss'; +import { + indexed_historic_unique_applicants, + indexed_historic_unique_applicants_h, + indexed_historic_unique_applicants_v, +} from './mock-applicant-count'; +import { type CampusApplicantDataset, mock_campus_applicant_data } from './mock-campus-distribution'; + +const mapApplicantCountData = (data: { number: number; label: string }[]): CartesianChartsData[] => { + /** + * ####################################################################### + * TODO: + * This map will probably have to change to + * adhere to the final backend solution. + * There will also probably be raw application count + * data in backend, where we calculate "safe-to-send" indexed data + * ####################################################################### + */ + return data.map((dataItem) => ({ + value: dataItem.number, + label: dataItem.label, + })); +}; + +const computeWeightedDistribution = (data: CampusApplicantDataset) => { + /** + * ################################################################ + * TODO: + * This computation should probably be done in backend, or we should + * store the data in such a way that no computation is needed + * ################################################################ + */ + return data.map((semesterData) => { + // Calculate the raw weighted values for each campus + const rawWeightedValues = semesterData.campus_applicant_data.map((campus) => ({ + label: campus.label, + weightedValue: campus.applicants / campus.student_campus_count, + })); + + // Calculate the total of all weighted values + const totalWeightedValue = rawWeightedValues.reduce((sum, campus) => sum + campus.weightedValue, 0); + + // Normalize values to percentages (adding up to 100%) + const normalizedDistribution: CircularChartData[] = rawWeightedValues.map((campus) => ({ + label: campus.label, + value: Number(((campus.weightedValue / totalWeightedValue) * 100).toFixed(2)), + })); + + // Return object with semester and normalized campus distribution + return { + semester: semesterData.semester, + distribution: normalizedDistribution, + }; + }); +}; + +export function RecruitmentHistoricStatisticsAdminPage() { + const { t } = useTranslation(); + + useTitle(t(KEY.recruitment_overview)); + + // ---------------------------------------------------------------------------------------------------------------------------------------- + /** + * ##################### + * TODO: + * This will be replaced + * with actuall queries + * ##################### + * + */ + const [indexedHistoricUniqueApplicants, setindexedHistoricUniqueApplicants] = useState([]); + const [indexedHistoricUniqueApplicantsSpring, setIndexedHistoricUniqueApplicantsSpring] = useState< + CartesianChartsData[] + >([]); + const [indexedHistoricUniqueApplicantsAutumn, setIndexedHistoricUniqueApplicantsAutumn] = useState< + CartesianChartsData[] + >([]); + + /* Campus distribution data state */ + const [historicCampusDistribution, setHistoricCampusDistribution] = useState< + Array<{ semester: string; distribution: CircularChartData[] }> + >([]); + + useEffect(() => { + /* Applicant count state */ + setindexedHistoricUniqueApplicants(mapApplicantCountData(indexed_historic_unique_applicants)); + setIndexedHistoricUniqueApplicantsSpring(mapApplicantCountData(indexed_historic_unique_applicants_v)); + setIndexedHistoricUniqueApplicantsAutumn(mapApplicantCountData(indexed_historic_unique_applicants_h)); + + /* Campus distribution state */ + setHistoricCampusDistribution(computeWeightedDistribution(mock_campus_applicant_data)); + }, []); + // ---------------------------------------------------------------------------------------------------------------------------------------- + + const tabs: Tab[] = useMemo(() => { + return [ + { + key: 1, + label: 'Indexed historic applicant count', + value: ( + + ), + }, + { + key: 2, + label: 'Weighted historic campus distribution', + value: , + }, + ]; + }, [ + indexedHistoricUniqueApplicants, + indexedHistoricUniqueApplicantsSpring, + indexedHistoricUniqueApplicantsAutumn, + historicCampusDistribution, + ]); + + return ( + +

This page is under construction, it is displaying mock data!

+ +
+ ); +} diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/index.ts b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/index.ts new file mode 100644 index 000000000..d80b8b380 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/index.ts @@ -0,0 +1 @@ +export { RecruitmentHistoricStatisticsAdminPage } from './RecruitmentHistoricStatisticsAdminPage'; diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-applicant-count.ts b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-applicant-count.ts new file mode 100644 index 000000000..ff791519d --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-applicant-count.ts @@ -0,0 +1,76 @@ +// applicant numbers // +// - total number of applications for "this" recruitment [x] + +// - total number of unique applicantsfor "this" recruitment [x] + +// - historic data - last 5 years (indexed) +// - both V/H + +// v17 is baseline +export const indexed_historic_unique_applicants = [ + { label: 'v12', number: 110 }, + { label: 'h12', number: 115 }, + { label: 'v13', number: 110 }, + { label: 'h13', number: 115 }, + { label: 'v14', number: 110 }, + { label: 'h14', number: 115 }, + { label: 'v15', number: 110 }, + { label: 'h15', number: 115 }, + { label: 'v16', number: 110 }, + { label: 'h16', number: 115 }, + { label: 'v17', number: 100 }, + { label: 'h17', number: 120 }, + { label: 'v18', number: 110 }, + { label: 'h18', number: 115 }, + { label: 'v19', number: 110 }, + { label: 'h19', number: 115 }, + { label: 'v20', number: 110 }, + { label: 'h20', number: 135 }, + { label: 'v21', number: 130 }, + { label: 'h21', number: 150 }, + { label: 'v22', number: 110 }, + { label: 'h22', number: 115 }, + { label: 'v23', number: 110 }, + { label: 'h23', number: 115 }, + { label: 'v24', number: 110 }, + { label: 'h24', number: 160 }, + { label: 'v25', number: 110 }, + { label: 'h25', number: 115 }, +]; + +// only V - v17 is baseline +export const indexed_historic_unique_applicants_v = [ + { label: 'v12', number: 110 }, + { label: 'v13', number: 110 }, + { label: 'v14', number: 110 }, + { label: 'v15', number: 110 }, + { label: 'v16', number: 110 }, + { label: 'h16', number: 115 }, + { label: 'v17', number: 100 }, + { label: 'v18', number: 110 }, + { label: 'v19', number: 110 }, + { label: 'v20', number: 110 }, + { label: 'v21', number: 130 }, + { label: 'v22', number: 110 }, + { label: 'v23', number: 110 }, + { label: 'v24', number: 110 }, + { label: 'v25', number: 110 }, +]; + +// only H - v17 is baseline +export const indexed_historic_unique_applicants_h = [ + { label: 'h12', number: 115 }, + { label: 'h13', number: 115 }, + { label: 'h14', number: 115 }, + { label: 'h15', number: 115 }, + { label: 'h16', number: 115 }, + { label: 'h17', number: 120 }, + { label: 'h18', number: 115 }, + { label: 'h19', number: 115 }, + { label: 'h20', number: 135 }, + { label: 'h21', number: 150 }, + { label: 'h22', number: 115 }, + { label: 'h23', number: 115 }, + { label: 'h24', number: 160 }, + { label: 'h25', number: 115 }, +]; diff --git a/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-campus-distribution.ts b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-campus-distribution.ts new file mode 100644 index 000000000..32fff9fb2 --- /dev/null +++ b/frontend/src/PagesAdmin/RecruitmentHistoricStatisticsAdminPage/mock-campus-distribution.ts @@ -0,0 +1,205 @@ +// campus numbers percentage distribution + +// campus numbers weighted distribution (antall søkere delt på antall studenter på det campus) +// - line diagram for each campus + +/* + * THIS MOCK DATA IS MEANT TO COMMUNICATE WHAT KIND OF DATA WE NEED FOR THE ACTUALL IMPLEMENTATION + * WEIGHTED NUMBERS SHOULD BE COMPUTED IN BACKEND + */ + +interface CampusApplicantData { + label: string; + applicants: number; + student_campus_count: number; +} + +interface SemesterCampusData { + semester: string; + campus_applicant_data: CampusApplicantData[]; +} + +export type CampusApplicantDataset = SemesterCampusData[]; + +export const mock_campus_applicant_data: CampusApplicantDataset = [ + { + semester: 'v18', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'h18', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'v19', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'h19', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'v20', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'h20', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'v21', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'h21', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'v22', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'h22', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'v23', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'h23', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'v24', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, + { + semester: 'h24', + campus_applicant_data: [ + { label: 'Gløs', applicants: 800, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 200, student_campus_count: 1000 }, + { label: 'BI', applicants: 600, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 150, student_campus_count: 2000 }, + { label: 'Øya', applicants: 450, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 100, student_campus_count: 7000 }, + { label: 'HHS', applicants: 470, student_campus_count: 3000 }, + ], + }, + { + semester: 'v25', + campus_applicant_data: [ + { label: 'Gløs', applicants: 600, student_campus_count: 20000 }, + { label: 'DMMH', applicants: 300, student_campus_count: 1000 }, + { label: 'BI', applicants: 400, student_campus_count: 3000 }, + { label: 'Tunga', applicants: 100, student_campus_count: 2000 }, + { label: 'Øya', applicants: 350, student_campus_count: 4000 }, + { label: 'Dragvoll', applicants: 400, student_campus_count: 7000 }, + { label: 'HHS', applicants: 370, student_campus_count: 3000 }, + ], + }, +]; diff --git a/frontend/src/PagesAdmin/index.ts b/frontend/src/PagesAdmin/index.ts index 980a14d2e..631716e33 100644 --- a/frontend/src/PagesAdmin/index.ts +++ b/frontend/src/PagesAdmin/index.ts @@ -17,6 +17,7 @@ export { RecruitmentFormAdminPage } from './RecruitmentFormAdminPage'; export { RecruitmentGangAdminPage } from './RecruitmentGangAdminPage'; export { RecruitmentGangAllApplicantsAdminPage } from './RecruitmentGangAllApplicantsAdminPage'; export { RecruitmentGangOverviewPage } from './RecruitmentGangOverviewPage'; +export { RecruitmentHistoricStatisticsAdminPage } from './RecruitmentHistoricStatisticsAdminPage'; export { RecruitmentOpenToOtherPositionsPage } from './RecruitmentOpenToOtherPositionsPage'; export { RecruitmentOverviewPage } from './RecruitmentOverviewPage'; export { RecruitmentPositionFormAdminPage } from './RecruitmentPositionFormAdminPage'; diff --git a/frontend/src/router/router.tsx b/frontend/src/router/router.tsx index 1047bd69b..8e8be6bcf 100644 --- a/frontend/src/router/router.tsx +++ b/frontend/src/router/router.tsx @@ -51,6 +51,7 @@ import { RecruitmentGangAdminPage, RecruitmentGangAllApplicantsAdminPage, RecruitmentGangOverviewPage, + RecruitmentHistoricStatisticsAdminPage, RecruitmentOpenToOtherPositionsPage, RecruitmentOverviewPage, RecruitmentPositionFormAdminPage, @@ -454,6 +455,16 @@ export const router = createBrowserRouter( path={ROUTES.frontend.admin_recruitment} element={} />} /> + } + /> + } + />