{"version":3,"file":"StudyModelSectionBlock.chunk.56d9d64920af67eb6746.js","mappings":"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","sources":["webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/Components/StudyModelLayout.vertical.module.css?abc7","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/Utils/studyModelGridUtils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectCard/SubjectCard.module.css?ebb2","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/StudyModelLayout.module.css?1860","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/Utils/layoutPositionUtils.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/Components/StudyModelLayout.horizontal.module.css?dea3","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/Components/StudyModelLayout.horizontal.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/Components/StudyModelLayout.vertical.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelLayout/StudyModelLayout.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectCard/SubjectCard.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectOverlayAction/SubjectOverlayAction.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectOverlayAction/SubjectOverlayAction.module.css?b506","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectOverlayContent/SubjectOverlayContent.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectOverlayContent/SubjectOverlayContent.module.css?9f26","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/SubjectCardWithOverlay/SubjectCardWithOverlay.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/Components/StudyModelGridSemesters/StudyModelGridSemesters.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/Components/StudyModelGridContent/StudyModelGridContent.module.css?071a","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/Components/StudyModelGridContent/StudyModelGridContent.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/Components/StudyModelGridHiddenTabContent/StudyModelGridHiddenTabContent.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/StudyModelGrid.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelSectionAccordionItemContent/StudyModelSectionAccordionItemContent.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelSectionAccordionItemContent/StudyModelSectionAccordionItemContent.module.css?87ec","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelSectionAccordionItemWithFetch/StudyModelSectionAccordionItemWithFetch.module.css?a1c6","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelSectionAccordionItemWithFetch/StudyModelSectionAccordionItemWithFetch.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/StudyModelSection.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Sections/StudyModelSection/StudyModelSection.module.css?31ca","webpack://Kristiania.Web/./Features/Blocks/StudyModelSectionBlock/ViewModel/StudyModelSectionBlockViewModelType.csharp.ts","webpack://Kristiania.Web/./Features/Blocks/StudyModelSectionBlock/View/StudyModelSectionBlockUtils.ts","webpack://Kristiania.Web/./Features/Blocks/StudyModelSectionBlock/View/StudyModelSectionBlock.tsx","webpack://Kristiania.Web/./Features/Layouts/Components/PageSectionHeading/PageSectionHeading.tsx","webpack://Kristiania.Web/./Features/Layouts/Components/PageSectionHeading/PageSectionHeading.module.css?ed34","webpack://Kristiania.Web/./Features/Pages/CampusStudyPage/View/Utils/StudyModelUtils.ts","webpack://Kristiania.Web/./Features/Partials/ActivityIndicator/ActivityIndicator.module.css?6d48","webpack://Kristiania.Web/./Features/Partials/ActivityIndicator/ActivityIndicator.tsx","webpack://Kristiania.Web/./Features/Partials/Controls/HtmlHeading.tsx","webpack://Kristiania.Web/./Features/Partials/Controls/Utils/asHtmlString.ts","webpack://Kristiania.Web/./Features/Partials/Controls/Utils/globalHtmlStringFallback.ts","webpack://Kristiania.Web/./Features/Partials/Controls/Utils/isHtmlString.ts","webpack://Kristiania.Web/./Features/Partials/FetchData/useFetchData.ts","webpack://Kristiania.Web/./Features/Partials/StudySubjects/StudySubjects.tsx","webpack://Kristiania.Web/./Features/Partials/StudySubjects/StudySubjects.module.css?4b6a","webpack://Kristiania.Web/./Features/Partials/Utils/usePrevious.ts","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/Overlay.tsx","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/Overlay.module.css?6508","webpack://Kristiania.Web/./Features/StudyPage/Campus/Components/Overlay/WithOverlay.tsx","webpack://Kristiania.Web/./Features/Utils/MouseButton.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useClickProxyAllowingTextSelection.ts","webpack://Kristiania.Web/./Features/Utils/Hooks/useDebounce.ts","webpack://Kristiania.Web/./node_modules/lodash/_arrayAggregator.js","webpack://Kristiania.Web/./node_modules/lodash/_baseAggregator.js","webpack://Kristiania.Web/./node_modules/lodash/_baseLt.js","webpack://Kristiania.Web/./node_modules/lodash/_createAggregator.js","webpack://Kristiania.Web/./node_modules/lodash/groupBy.js","webpack://Kristiania.Web/./node_modules/lodash/max.js","webpack://Kristiania.Web/./node_modules/lodash/min.js","webpack://Kristiania.Web/./node_modules/lodash/orderBy.js","webpack://Kristiania.Web/./node_modules/lodash/toInteger.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"StudyModelLayout\":\"q5KPrem3WXizlGFDtUZq\",\"DashLine\":\"IXc6QWfonUYxdQHqCy6F\",\"SeparatorLine\":\"iX_Ll2OQ4kbFnw9yt9JX\",\"Heading\":\"QUxSa4Gf_FEZxO9soRq0\",\"Heading--first\":\"Si0q1ikPNuMzCDy2OOpw\",\"Heading--second\":\"yezKBqN03RcFUYEeKx27\",\"SingleColumnLayout\":\"X41N9E_vU6mhZFRV_1wi\",\"Semester\":\"GnV_BKFmH9doUqHyWlgZ\",\"Subject\":\"xXy5Rg98me1SyGcUuMCw\",\"Semester--both\":\"aQvmrRSiRRTpRQjePazB\",\"Semester--first\":\"wL44L8mmSyLwCcpHPaap\",\"Semester--second\":\"Cjgje0BbnsLg6SlFoNNN\",\"EmptyMessage\":\"iTBJ8XFGLjJ8ICxj3B7m\",\"ContainerWithLayoutExceedingWrapper\":\"dT6kOO1SWAAgm3_8NHMn\"};","import { FormattedText } from '~/Features/Txt/TxtBase';\n\nexport const getPointsLabel = (messageFormat: string, points: number) =>\n points <= 0 ? undefined : FormattedText(messageFormat, { points });\n","// extracted by mini-css-extract-plugin\nexport default {\"SubjectCard\":\"jkzRoAa60jRsn7WFC38b\",\"Header\":\"YG1nlAZdhHLMRy9GYzR4\",\"PillTag--points\":\"iFv6rrcS3ouLeLPVmLv7\",\"Footer\":\"k1UzcGuDdqoVJEx_3umq\",\"Button\":\"H8BBXS4M_AkAanZLMEqS\",\"Inner\":\"Lv5sVd5u45Hei4dM91D6\",\"Name\":\"cLkCE07zhLnMWRjri1dT\",\"Code\":\"scgJDiGbZP69e6JD2e1j\",\"PillTag\":\"RNsXkIAukZjr8f4x_HXA\",\"Variant--rounded\":\"W_ipeNxzDR7tVIgpSCZn\",\"Variant--default\":\"dCe39Zi8EWFdbgMcdTXQ\",\"ContainerWithStretchingCards\":\"g8GJRoyN3YYrck7buLCF\"};","// extracted by mini-css-extract-plugin\nexport default {\"StudyModelLayout\":\"gIhCJK5vlYW4N6yeTlUe\",\"Heading\":\"PH6z9gi7b9kHBB9jOhSt\",\"DashLine\":\"hUrOK4f2t5d89i_al5eu\",\"SeparatorLine\":\"PVTUTdX7fee_uJTuRkiD\",\"EmptyMessage\":\"j63E7KHNRdoBT4f15C6d\"};","import min from 'lodash/min';\nimport round from 'lodash/round';\nimport sum from 'lodash/sum';\nimport sumBy from 'lodash/sumBy';\nimport type { BaseSubjectProps } from '../StudyModelLayout';\n\nexport type GridPosition = { lineNumber: number; span: number };\n\nexport const toCssGridPosition = (position: GridPosition) => `${position.lineNumber} / span ${position.span}`;\n\nexport const horizontalLayoutGridRowPositionForSemester = {\n first: 1,\n second: 3,\n both: toCssGridPosition({ lineNumber: 1, span: 3 }),\n};\n\nconst pointsSelector = (subject: BaseSubjectProps) => subject.points;\n\nconst calculateForSingleRow = (subjects: BaseSubjectProps[]) => {\n const allPoints = subjects.map(pointsSelector);\n const allPointsNumber = sum(allPoints);\n const smallestAmountOfPoints = min(allPoints);\n\n if (smallestAmountOfPoints === undefined) {\n throw new Error('Array was empty');\n }\n\n const columnsCount = getColumnsCount(allPoints, allPointsNumber, smallestAmountOfPoints);\n const columnWidth = allPointsNumber / columnsCount;\n\n const gridColumnMapping = calculateSubjectsPosition([], subjects, [], columnsCount, columnWidth);\n\n return {\n columnsCount,\n gridColumnMapping,\n };\n};\n\nconst calculateForTwoRows = (subjects: BaseSubjectProps[]) => {\n const firstSemesterSubjects = subjects.filter(subject => subject.semester === 'first');\n const secondSemesterSubjects = subjects.filter(subject => subject.semester === 'second');\n const bothSemestersSubjects = subjects.filter(subject => subject.semester === 'both');\n\n const firstSemesterPoints = sumBy(firstSemesterSubjects, pointsSelector);\n const secondSemesterPoints = sumBy(secondSemesterSubjects, pointsSelector);\n const bothSemestersPoints = sumBy(bothSemestersSubjects, pointsSelector);\n\n const allPoints = subjects.map(pointsSelector);\n\n const smallestAmountOfPoints = min(allPoints);\n\n if (smallestAmountOfPoints === undefined) {\n throw new Error('Array was empty');\n }\n\n const longerSemesterExclusivePoints =\n firstSemesterPoints >= secondSemesterPoints ? firstSemesterPoints : secondSemesterPoints;\n\n const longerSemesterPoints = longerSemesterExclusivePoints + bothSemestersPoints;\n const columnsCount = getColumnsCount(allPoints, longerSemesterPoints, smallestAmountOfPoints);\n const columnWidth = longerSemesterPoints / columnsCount;\n\n const gridColumnMapping = calculateSubjectsPosition(\n bothSemestersSubjects,\n firstSemesterSubjects,\n secondSemesterSubjects,\n columnsCount,\n columnWidth\n );\n\n return {\n columnsCount,\n gridColumnMapping,\n };\n};\n\nexport const resolveHorizontalGridLayout = (subjects: BaseSubjectProps[], useSingleRow = false) => {\n if (subjects.length === 0) {\n return {\n columnsCount: 1,\n gridColumnMapping: {},\n };\n }\n\n return useSingleRow ? calculateForSingleRow(subjects) : calculateForTwoRows(subjects);\n};\n\nconst MAX_COLUMNS_COUNT = 48;\n\nconst getColumnsCount = (allPoints: number[], longestSemesterPoints: number, smallestAmountOfPoints: number) => {\n let potentialWidth = smallestAmountOfPoints;\n let numberOfColumns: number | undefined = undefined;\n let localMinimum = Infinity;\n let nextDivider = 2;\n\n while (true) {\n const numberOfColumnsCandidate = round(longestSemesterPoints / potentialWidth);\n\n if (numberOfColumnsCandidate > MAX_COLUMNS_COUNT) {\n return numberOfColumns ?? MAX_COLUMNS_COUNT;\n }\n\n const columnWidth = longestSemesterPoints / numberOfColumnsCandidate;\n const sumOfPointsThatWillNotPerfectlyFitIntoCalculatedNumberOfColumns = sum(\n allPoints.map(point => point % columnWidth)\n );\n\n if (sumOfPointsThatWillNotPerfectlyFitIntoCalculatedNumberOfColumns === 0) {\n return numberOfColumnsCandidate;\n }\n\n if (sumOfPointsThatWillNotPerfectlyFitIntoCalculatedNumberOfColumns < localMinimum) {\n localMinimum = sumOfPointsThatWillNotPerfectlyFitIntoCalculatedNumberOfColumns;\n numberOfColumns = numberOfColumnsCandidate;\n }\n\n potentialWidth = round(smallestAmountOfPoints / nextDivider, 2);\n nextDivider = nextDivider + 1;\n }\n};\n\nconst INITIAL_GRID_POSITION = 2;\n\nconst calculateSubjectsPosition = (\n allYearSubjects: BaseSubjectProps[],\n firstSemesterSubjects: BaseSubjectProps[],\n secondSemesterSubjects: BaseSubjectProps[],\n columnsCount: number,\n columnWidth: number\n) => {\n let allYearPosition = INITIAL_GRID_POSITION;\n\n const result: Record = {};\n\n const performPlacementAndGetNewPosition = (subject: BaseSubjectProps, position: number) => {\n const span = round(subject.points / columnWidth);\n\n result[subject.code] = {\n lineNumber: position,\n span,\n };\n\n return position + span;\n };\n\n for (const subject of allYearSubjects) {\n allYearPosition = performPlacementAndGetNewPosition(subject, allYearPosition);\n }\n\n let firstSemesterPosition = allYearPosition;\n let secondSemesterPosition = allYearPosition;\n\n let firstSemesterLastItem: string | undefined = undefined;\n let secondSemesterLastItem: string | undefined = undefined;\n\n for (const subject of firstSemesterSubjects) {\n firstSemesterPosition = performPlacementAndGetNewPosition(subject, firstSemesterPosition);\n\n firstSemesterLastItem = subject.code;\n }\n\n for (const subject of secondSemesterSubjects) {\n secondSemesterPosition = performPlacementAndGetNewPosition(subject, secondSemesterPosition);\n\n secondSemesterLastItem = subject.code;\n }\n\n // Due to rounding in calculations of columns count and width in rare cases it might happen that subjects will\n // fill less or more columns than calculated. In order to mitigate this issue we are either shortening last item's\n // span or stretching it to the border if it's in the longer semester.\n const adjustLastItem = (lastPosition: number, lastItemId: string | undefined, stretch: boolean) => {\n if (!lastItemId) {\n return;\n }\n\n const diff = lastPosition - columnsCount - INITIAL_GRID_POSITION;\n\n if ((diff < 0 && stretch) || diff > 0) {\n const item = result[lastItemId];\n\n item.span = item.span - diff;\n }\n };\n\n adjustLastItem(firstSemesterPosition, firstSemesterLastItem, firstSemesterPosition >= secondSemesterPosition);\n adjustLastItem(secondSemesterPosition, secondSemesterLastItem, secondSemesterPosition >= firstSemesterPosition);\n\n return result;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyModelLayout\":\"C70d_1unGsLcavciTBWP\",\"DashLine\":\"_jBcyRZzOe6QMtbojFs5\",\"SeparatorLine\":\"ihFnGka9xDug5NPWFh0C\",\"Heading\":\"nPbPqGrz5Ue0OKa68YnY\",\"Heading--first\":\"z7vhCTYrC3rO2VoUPlYT\",\"Heading--second\":\"_MLObcIsnBTnfP4F5AQg\",\"SingleColumnLayout\":\"BmcqUdDDA0H_3qYnNDr6\",\"Subject\":\"Ka1VIQ2BSAPjauIEHrxP\",\"EmptyMessage\":\"Ne2VoAetibC1d058GWVB\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport subjectCardStyles from '../../SubjectCard/SubjectCard.module.css';\nimport type { BaseSubjectProps, StudyModelLayoutProps } from '../StudyModelLayout';\nimport baseStyles from '../StudyModelLayout.module.css';\nimport type { GridPosition } from '../Utils/layoutPositionUtils';\nimport {\n horizontalLayoutGridRowPositionForSemester,\n resolveHorizontalGridLayout,\n toCssGridPosition,\n} from '../Utils/layoutPositionUtils';\nimport horizontalStyles from './StudyModelLayout.horizontal.module.css';\n\nconst renderEmptyMessage = (message: string) => (\n {message}\n);\n\nconst renderSubjects = (\n subjects: TSubjectProps[],\n gridColumnMapping: Record,\n renderSubject: (subject: TSubjectProps) => ReactNode,\n gridRowResolver: (subject: TSubjectProps) => CSSProperties['gridRow']\n) =>\n subjects.map(subject => (\n \n {renderSubject(subject)}\n \n ));\n\nexport const StudyModelHorizontalLayout = (\n props: StudyModelLayoutProps\n) => {\n const { subjects, firstHeading, secondHeading, renderSubject, noSubjectsMessage } = props;\n\n const useSingleRow = !secondHeading;\n const { columnsCount, gridColumnMapping } = React.useMemo(\n () => resolveHorizontalGridLayout(subjects, useSingleRow),\n [useSingleRow, subjects]\n );\n\n if (useSingleRow) {\n return (\n \n );\n }\n\n return (\n \n
\n \n {firstHeading}\n
\n \n {secondHeading}\n \n {subjects.length > 0\n ? renderSubjects(\n subjects,\n gridColumnMapping,\n renderSubject,\n subject => horizontalLayoutGridRowPositionForSemester[subject.semester]\n )\n : renderEmptyMessage(noSubjectsMessage)}\n
\n
\n );\n};\n\ninterface StudyModelSingleRowHorizontalLayoutProps\n extends Pick<\n StudyModelLayoutProps,\n 'firstHeading' | 'subjects' | 'renderSubject' | 'noSubjectsMessage'\n > {\n columnsCount: number;\n gridColumnMapping: Record;\n}\n\nexport const StudyModelSingleRowHorizontalLayout = (\n props: StudyModelSingleRowHorizontalLayoutProps\n) => {\n const { columnsCount, firstHeading, subjects, renderSubject, gridColumnMapping, noSubjectsMessage } = props;\n\n return (\n \n \n {firstHeading}\n \n {subjects.length > 0\n ? renderSubjects(subjects, gridColumnMapping, renderSubject, () => 1)\n : renderEmptyMessage(noSubjectsMessage)}\n \n );\n};\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { BaseSubjectProps, StudyModelLayoutProps } from '../StudyModelLayout';\nimport baseStyles from '../StudyModelLayout.module.css';\nimport verticalStyles from './StudyModelLayout.vertical.module.css';\n\nconst renderSubjects = (\n subjects: TSubjectProps[],\n renderSubject: StudyModelLayoutProps['renderSubject']\n) =>\n subjects.map(subject => (\n
\n {renderSubject(subject)}\n
\n ));\n\nconst renderEmptyMessage = (message: string) => (\n {message}\n);\n\nexport const StudyModelVerticalLayout = (\n props: StudyModelLayoutProps\n) => {\n const { subjects, firstHeading, secondHeading, renderSubject, noSubjectsMessage } = props;\n\n const useSingleColumn = !secondHeading;\n\n if (useSingleColumn) {\n return (\n \n );\n }\n\n const firstSemesterSubjects = subjects.filter(subject => subject.semester === 'first');\n const secondSemesterSubjects = subjects.filter(subject => subject.semester === 'second');\n const bothSemestersSubjects = subjects.filter(subject => subject.semester === 'both');\n\n return (\n
\n
\n
\n {firstHeading}\n
\n
\n {secondHeading}\n
\n {subjects.length > 0 ? (\n <>\n \n {renderSubjects(bothSemestersSubjects, renderSubject)}\n \n \n {renderSubjects(firstSemesterSubjects, renderSubject)}\n \n \n {renderSubjects(secondSemesterSubjects, renderSubject)}\n \n \n ) : (\n renderEmptyMessage(noSubjectsMessage)\n )}\n
\n
\n );\n};\n\ntype StudyModelSingleColumnVerticalLayoutProps = Pick<\n StudyModelLayoutProps,\n 'firstHeading' | 'subjects' | 'renderSubject' | 'noSubjectsMessage'\n>;\n\nexport const StudyModelSingleColumnVerticalLayout = (\n props: StudyModelSingleColumnVerticalLayoutProps\n) => {\n const { firstHeading, subjects, renderSubject, noSubjectsMessage } = props;\n\n return (\n \n
\n {firstHeading}\n
\n {subjects.length > 0 ? (\n \n {renderSubjects(subjects, renderSubject)}\n \n ) : (\n renderEmptyMessage(noSubjectsMessage)\n )}\n
\n );\n};\n","import * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { useWindowWidthDetection } from '~/Utils/Hooks/useWindowWidthDetection';\nimport { MediaBreakpoints } from '~/Utils/MediaBreakpoints';\nimport { StudyModelHorizontalLayout } from './Components/StudyModelLayout.horizontal';\nimport { StudyModelVerticalLayout } from './Components/StudyModelLayout.vertical';\n\nexport type Semesters = 'first' | 'second' | 'both';\n\nexport interface BaseSubjectProps {\n code: string;\n points: number;\n semester: Semesters;\n}\n\nexport interface StudyModelLayoutProps {\n subjects: TSubjectProps[];\n renderSubject: (subject: TSubjectProps) => ReactNode;\n noSubjectsMessage: string;\n firstHeading: string;\n secondHeading?: string;\n}\n\nexport const StudyModelLayout = (\n props: StudyModelLayoutProps\n) => {\n const { subjects, ...restProps } = props;\n\n const isBelowDesktop = useWindowWidthDetection({ condition: 'lessThan', breakpoint: MediaBreakpoints.Desktop });\n const filteredSubjects = React.useMemo(() => subjects.filter(subject => subject.points > 0), [subjects]);\n\n return isBelowDesktop ? (\n \n ) : (\n \n );\n};\n","import classNames from 'classnames';\nimport type { AriaAttributes } from 'react';\nimport * as React from 'react';\nimport { getContentLocale } from '~/Features/Configuration/Utils/languageUtils';\nimport { useTheme } from '~/Features/Layouts/Theme/Context/ThemeContextProvider';\nimport { PillTag } from '~/Features/Partials/PillTag/PillTag';\nimport type { SubjectBaseProps } from '~/Features/StudyPage/Common/Interfaces/SubjectBaseProps';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { assertNever } from '~/Partials/Utils/typeUtils';\nimport { useClickProxyAllowingTextSelection } from '~/Utils/Hooks/useClickProxyAllowingTextSelection';\nimport styles from './SubjectCard.module.css';\n\nexport interface SubjectCardProps extends SubjectBaseProps {\n onClick?: () => void;\n className?: string;\n additionalAriaProps?: AriaAttributes;\n}\n\nexport const SubjectCard: React.FC = props => {\n const contextualTheme = useTheme();\n const {\n subjectName,\n subjectCode,\n points,\n translations,\n subjectCategory,\n className,\n onClick,\n additionalAriaProps,\n theme = contextualTheme,\n } = props;\n\n const { withRoundedCorners } = theme;\n const locale = getContentLocale();\n\n const getFooterPillTag = () => {\n const pillTagBase = {\n className: styles.PillTag,\n size: 'small',\n } as const;\n\n switch (subjectCategory) {\n case 'obligatory':\n return null;\n case 'specialization':\n return (\n \n {translations.specialization}\n \n );\n case 'elective':\n return (\n \n {translations.elective}\n \n );\n default:\n assertNever(subjectCategory);\n }\n };\n const { clickableRef, onProxyMouseDown, onProxyMouseUp } = useClickProxyAllowingTextSelection();\n\n return (\n \n

\n \n
\n {subjectName}\n {subjectCode}\n
\n \n

\n
\n {getFooterPillTag()}\n \n {points.toLocaleString(locale)} {translations.pointsUnit}\n \n
\n
\n );\n};\n","import React from 'react';\nimport { ActivityIndicator } from '~/Partials/ActivityIndicator/ActivityIndicator';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonSize } from '~/Partials/Button/ButtonSize.csharp';\nimport { ButtonTier } from '~/Partials/Button/ButtonTier.csharp';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { useFetchData } from '~/Partials/FetchData/useFetchData';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport styles from './SubjectOverlayAction.module.css';\n\nexport interface SubjectOverlayActionTranslations {\n errorMessage: string;\n buttonLabel: string;\n loadingMessage: string;\n}\n\nexport interface SubjectOverlayActionProps {\n subjectCode: string;\n fetchSubjectLinkUrl: string;\n translations: SubjectOverlayActionTranslations;\n shouldMakeRequest: boolean;\n}\n\nexport const SubjectOverlayAction: React.FC = props => {\n const { fetchSubjectLinkUrl, shouldMakeRequest, subjectCode, translations } = props;\n\n const { error, loading, data } = useFetchData({\n url: fetchSubjectLinkUrl,\n params: {\n subjectCode,\n },\n shouldMakeRequest,\n });\n\n const renderControl = () => (\n <>\n {translations.buttonLabel}\n \n \n );\n\n const actionBaseConfig = (withButtonPrefix = false) => ({\n [withButtonPrefix ? 'buttonSize' : 'size']: ButtonSize.Large,\n [withButtonPrefix ? 'buttonTier' : 'tier']: ButtonTier.Primary,\n [withButtonPrefix ? 'buttonType' : 'type']: ButtonType.Solid,\n className: styles.Control,\n });\n\n return (\n
\n {loading && (\n
\n {translations.loadingMessage}\n \n
\n )}\n {!data || error ? (\n \n ) : (\n \n {renderControl()}\n \n )}\n {error &&
{translations.errorMessage}
}\n
\n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"SubjectOverlayAction\":\"iCNqjCRL4lMHUFqVaQaB\",\"Spinner\":\"hBPWJKzPvKQ1Yf2ZsRz9\",\"Control\":\"yWrwquZkc56N0bYjqb7s\",\"Error\":\"bzbCKWqnOt3avkRUQn9Q\"};","import * as React from 'react';\nimport type { SubjectOverlayActionProps } from '../SubjectOverlayAction/SubjectOverlayAction';\nimport { SubjectOverlayAction } from '../SubjectOverlayAction/SubjectOverlayAction';\nimport { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { AlertSection } from '~/Partials/AlertSection/AlertSection';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport styles from './SubjectOverlayContent.module.css';\n\nexport interface SubjectOverlayAlert {\n heading?: string;\n message?: HtmlString;\n variant?: AlertSectionVariant;\n}\n\nexport interface SubjectOverlayContentMessages {\n outdated: SubjectOverlayAlert;\n fallback: SubjectOverlayAlert;\n}\n\nexport interface SubjectOverlayContentProps extends SubjectOverlayActionProps {\n subjectName: string;\n messages: SubjectOverlayContentMessages;\n subjectDescription?: HtmlString;\n isDescriptionOutdated?: boolean;\n}\n\nexport const SubjectOverlayContent: React.FC = props => {\n const { subjectName, subjectDescription, messages, isDescriptionOutdated, ...restProps } = props;\n\n const subjectHasDescription = subjectDescription && subjectDescription.value;\n\n const renderAlert = (alert: SubjectOverlayAlert) => (\n
\n \n {alert.message && }\n \n
\n );\n\n return (\n
\n

{subjectName}

\n {subjectHasDescription && isDescriptionOutdated && renderAlert(messages.outdated)}\n {subjectHasDescription ? (\n \n ) : (\n messages.fallback.heading && renderAlert(messages.fallback)\n )}\n \n
\n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Heading\":\"E3lyE2pUr4JODpEYbHMe\",\"Description\":\"vyo8UTe2MiSR4m0iLBYR\",\"Alert\":\"rWx_83oChqBoukpvdK1A\"};","import * as React from 'react';\nimport type { SubjectCardProps } from '../SubjectCard/SubjectCard';\nimport { SubjectCard } from '../SubjectCard/SubjectCard';\nimport type { SubjectOverlayContentProps } from '../SubjectOverlayContent/SubjectOverlayContent';\nimport { SubjectOverlayContent } from '../SubjectOverlayContent/SubjectOverlayContent';\nimport { WithOverlay } from '~/Features/StudyPage/Campus/Components/Overlay/WithOverlay';\nimport type { StrictOmit } from '~/Partials/Utils/typeUtils';\n\ntype CombinedChildrenProps = StrictOmit &\n StrictOmit;\n\nexport interface SubjectCardWithOverlayProps extends CombinedChildrenProps {\n subjectOverlayLabel: string;\n closeOverlayLabel: string;\n}\n\nexport const SubjectCardWithOverlay: React.FC = props => {\n const { subjectCode, subjectName, subjectOverlayLabel, closeOverlayLabel, ...restProps } = props;\n\n return (\n (\n \n )}\n overlayLabel={subjectOverlayLabel}\n closeLabel={closeOverlayLabel}\n >\n {triggerButtonProps => {\n const { onClick, ...ariaProps } = triggerButtonProps;\n\n return (\n \n );\n }}\n \n );\n};\n","import * as React from 'react';\nimport { StudyModelLayout } from '../../../StudyModelLayout/StudyModelLayout';\nimport { SubjectCardWithOverlay } from '../../../SubjectCardWithOverlay/SubjectCardWithOverlay';\nimport type { SubjectOverlayActionTranslations } from '../../../SubjectOverlayAction/SubjectOverlayAction';\nimport type { SubjectOverlayContentMessages } from '../../../SubjectOverlayContent/SubjectOverlayContent';\nimport type { AvailableYearProps, ExtendedSubjectProps } from '../../StudyModelGrid';\nimport type { SubjectBaseTranslations } from '~/Features/StudyPage/Common/Interfaces/SubjectBaseProps';\n\nexport interface StudyModelGridSemestersTranslations extends SubjectBaseTranslations, SubjectOverlayActionTranslations {\n openSubjectOverlay: string;\n closeOverlay: string;\n noSubjectsMessage: string;\n}\n\nexport interface StudyModelGridSemestersProps {\n selectedYearProps: AvailableYearProps;\n currentYearSubjects: ExtendedSubjectProps[];\n getSubjectInfoUrl: string;\n overlayContentMessages: SubjectOverlayContentMessages;\n translations: StudyModelGridSemestersTranslations;\n className: string;\n}\n\nexport const StudyModelGridSemesters: React.FC = props => {\n const {\n selectedYearProps,\n currentYearSubjects,\n getSubjectInfoUrl,\n overlayContentMessages,\n className,\n translations,\n } = props;\n const { openSubjectOverlay, closeOverlay, noSubjectsMessage, ...restTranslations } = translations;\n\n return (\n
\n (\n \n )}\n />\n
\n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyModelGridContent\":\"XtdQZg9bKtEzGXT39oxb\",\"StudyPoints\":\"NPFkgrIiXfIBoY50mCiN\",\"SelectorContainer\":\"wpyTqNTlEGsGZ_xfFehk\",\"SpecializationSelectorContainer\":\"L7NlqGAknErj1_Ksfbxg\",\"OptionSelectorContainer\":\"BK3qq6WSy_IM14HivUP2\",\"OptionSelector\":\"Wc0G2UOdAM4L2tA07AtA\",\"Semesters\":\"osNFPrEfj_WDLlms79Vw\"};","import classNames from 'classnames';\nimport sumBy from 'lodash/sumBy';\nimport * as React from 'react';\nimport { getPointsLabel } from '../../Utils/studyModelGridUtils';\nimport type {\n StudyModelGridSemestersProps,\n StudyModelGridSemestersTranslations,\n} from '../StudyModelGridSemesters/StudyModelGridSemesters';\nimport { StudyModelGridSemesters } from '../StudyModelGridSemesters/StudyModelGridSemesters';\nimport { Collapse } from '~/Partials/Collapse/Collapse';\nimport { ComboSelector } from '~/Partials/ComboSelector/ComboSelector';\nimport { hasAny } from '~/Partials/Utils/utils';\nimport styles from './StudyModelGridContent.module.css';\n\nexport interface StudyModelGridContentTranslations extends StudyModelGridSemestersTranslations {\n specialization: string;\n studyOptions: string;\n studyPointsFormat: string;\n}\n\nexport interface StudyModelGridContentProps\n extends Pick<\n StudyModelGridSemestersProps,\n 'selectedYearProps' | 'currentYearSubjects' | 'getSubjectInfoUrl' | 'overlayContentMessages'\n > {\n specializationOptions: Map;\n studyOptions: Map;\n onSpecializationSelected: (newValue: string) => void;\n onStudyOptionSelected: (newValue: string) => void;\n translations: StudyModelGridContentTranslations;\n selectedSpecialization?: string;\n selectedStudyOption?: string;\n}\n\nexport const StudyModelGridContent: React.FC = props => {\n const {\n specializationOptions,\n selectedSpecialization,\n onSpecializationSelected,\n selectedStudyOption,\n onStudyOptionSelected,\n studyOptions,\n currentYearSubjects,\n translations,\n ...semesterViewProps\n } = props;\n const { specialization, studyOptions: studyOptionsLabel, studyPointsFormat, ...restTranslations } = translations;\n\n const currentYearPoints = sumBy(currentYearSubjects, subject => subject.points);\n\n const hasAnySpecializations = hasAny(currentYearSubjects, subject => !!subject.specialization);\n const hasAnyStudyOptions = hasAny(currentYearSubjects, subject => !!subject.studyOption);\n\n const pointsLabel = getPointsLabel(studyPointsFormat, currentYearPoints);\n\n return (\n
\n {specializationOptions.size > 0 && (\n \n \n \n )}\n {studyOptions.size > 0 && (\n \n \n \n )}\n {pointsLabel && {pointsLabel}}\n \n
\n );\n};\n","import * as React from 'react';\nimport type { ExtendedSubjectProps } from '../../StudyModelGrid';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { List } from '~/Partials/List/List';\n\nexport interface StudyModelGridHiddenTabContentProps {\n year: number;\n allSubjects: ExtendedSubjectProps[];\n}\n\nexport const StudyModelGridHiddenTabContent: React.FC = React.memo(props => {\n const { year, allSubjects } = props;\n\n const subjectsForYear = allSubjects.filter(subject => subject.year === year);\n\n return (\n (\n
  • \n {subject.code}\n {subject.name}\n \n
  • \n )}\n />\n );\n});\n","import first from 'lodash/first';\nimport sumBy from 'lodash/sumBy';\nimport * as React from 'react';\nimport verticalLayoutStyles from '../StudyModelLayout/Components/StudyModelLayout.vertical.module.css';\nimport type { BaseSubjectProps, StudyModelLayoutProps } from '../StudyModelLayout/StudyModelLayout';\nimport type { SubjectCategory } from '~/Features/StudyPage/Common/Interfaces/SubjectCategory';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { BookmarkContainer } from '~/Partials/BookmarkContainer/BookmarkContainer';\nimport type { BookmarkTabProps } from '~/Partials/BookmarkTabs/BookmarkTabs';\nimport type { TabKey } from '~/Partials/TabList/Tab';\nimport { firstKey } from '~/Partials/Utils/utils';\nimport type {\n StudyModelGridContentProps,\n StudyModelGridContentTranslations,\n} from './Components/StudyModelGridContent/StudyModelGridContent';\nimport { StudyModelGridContent } from './Components/StudyModelGridContent/StudyModelGridContent';\nimport { StudyModelGridHiddenTabContent } from './Components/StudyModelGridHiddenTabContent/StudyModelGridHiddenTabContent';\nimport { getPointsLabel } from './Utils/studyModelGridUtils';\n\ninterface StudyModelGridTranslations extends StudyModelGridContentTranslations {\n selectYear: string;\n totalStudyPointsFormat: string;\n}\n\nexport interface AvailableYearProps\n extends BookmarkTabProps,\n Pick, 'firstHeading' | 'secondHeading'> {\n isDefault?: boolean;\n}\n\nexport interface StudyOption {\n label: string;\n isDefault?: boolean;\n}\n\nexport interface ExtendedSubjectProps extends BaseSubjectProps {\n name: string;\n description: HtmlString;\n category: SubjectCategory;\n year: number;\n specialization?: string;\n studyOption?: StudyOption;\n isDescriptionOutdated?: boolean;\n}\n\nexport interface StudyModelGridProps\n extends Pick<\n StudyModelGridContentProps,\n 'specializationOptions' | 'studyOptions' | 'getSubjectInfoUrl' | 'overlayContentMessages'\n > {\n subjects: ExtendedSubjectProps[];\n availableYears: AvailableYearProps[];\n translations: StudyModelGridTranslations;\n}\n\nexport const StudyModelGrid: React.FC = props => {\n const {\n availableYears,\n subjects,\n specializationOptions,\n studyOptions,\n getSubjectInfoUrl,\n overlayContentMessages,\n translations,\n } = props;\n const { selectYear, totalStudyPointsFormat, ...restTranslations } = translations;\n\n const [selectedSpecialization, setSelectedSpecialization] = React.useState(firstKey(specializationOptions));\n const [selectedStudyOption, setSelectedStudyOption] = React.useState(firstKey(studyOptions));\n const [selectedYear, setSelectedYear] = React.useState(\n (availableYears.find(year => year.isDefault) ?? first(availableYears))?.uniqueId\n );\n\n const selectedYearProps = React.useMemo(\n () => availableYears.find(year => year.uniqueId === selectedYear),\n [availableYears, selectedYear]\n );\n\n const filteredSubjects = React.useMemo(\n () =>\n subjects\n .filter(subject => !subject.specialization || subject.specialization === selectedSpecialization)\n .filter(subject => !subject.studyOption || subject.studyOption.label === selectedStudyOption),\n [subjects, selectedSpecialization, selectedStudyOption]\n );\n\n const currentYearSubjects = React.useMemo(() => {\n if (selectedYearProps === undefined) {\n return [];\n }\n\n return filteredSubjects.filter(subject => subject.year === selectedYearProps.uniqueId);\n }, [filteredSubjects, selectedYearProps]);\n\n const totalPoints = sumBy(\n filteredSubjects.filter(subject => subject.year > 0),\n subject => subject.points\n );\n\n const HiddenTabContent = React.useMemo>(\n () => tabProps => {\n const { uniqueId } = tabProps;\n\n return ;\n },\n [subjects]\n );\n\n if (selectedYear === undefined || !selectedYearProps) {\n return null;\n }\n\n return (\n \n \n \n );\n};\n","import classNames from 'classnames';\nimport React from 'react';\nimport { mapSemestersToModel } from '~/Pages/CampusStudyPage/View/Utils/StudyModelUtils';\nimport type { LegacyStudyModelViewModel } from '~/Pages/CampusStudyPage/ViewModel/StudyModel/LegacyStudyModelViewModel.csharp';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkVariant } from '~/Partials/Link/LinkVariant.csharp';\nimport { List } from '~/Partials/List/List';\nimport { StudySubjects } from '~/Partials/StudySubjects/StudySubjects';\nimport styles from './StudyModelSectionAccordionItemContent.module.css';\n\ninterface StudyModelSectionAccordionItemContentProps {\n heading: string;\n prerequisitesHeading: string;\n data: LegacyStudyModelViewModel;\n className?: string;\n}\n\nexport const StudyModelSectionAccordionItemContent: React.FC = props => {\n const { heading, prerequisitesHeading, data, className } = props;\n\n const renderPrerequisites = () => {\n if (data.prerequisites.subjects.length <= 0) {\n return null;\n }\n\n const { subjects } = data.prerequisites;\n\n return (\n
    \n

    {prerequisitesHeading}

    \n {\n const { url, name } = prerequisite;\n\n return (\n
  • \n {url ? (\n \n ) : (\n {name}\n )}\n
  • \n );\n }}\n />\n
    \n );\n };\n\n return (\n
    \n

    {heading}

    \n {renderPrerequisites()}\n \n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"AccordionItemContent\":\"PGqu4_weSCopT3LE9ePU\",\"Heading\":\"tWsr9B4YZkqggfTMIud2\",\"PrerequisitesContainer\":\"U27XPDqUsnxFv98wmfzk\",\"PrerequisitesHeading\":\"b0c8mvl_N_TiXfaT3zZJ\",\"Prerequisites\":\"ylFiC_wyuOqC1_nWC8FY\",\"Prerequisite\":\"NSXm3GgyzMMKk1DIIuIg\"};","// extracted by mini-css-extract-plugin\nexport default {\"AccordionItemWrapper\":\"J8sGFfXPPmzvpUfeysB9\",\"AccordionItem\":\"oZp8a7M6cCPxse0JpnwP\",\"AccordionContent\":\"HGcmvRYA8LoELZISyctA\",\"Error\":\"O9z_yuGMpqFc2Krh3EyF\"};","import classNames from 'classnames';\nimport React from 'react';\nimport { StudyModelSectionAccordionItemContent } from '../StudyModelSectionAccordionItemContent/StudyModelSectionAccordionItemContent';\nimport type { LegacyStudyModelViewModel } from '~/Pages/CampusStudyPage/ViewModel/StudyModel/LegacyStudyModelViewModel.csharp';\nimport { AccordionItem } from '~/Partials/AccordionComponent/AccordionItem';\nimport { ActivityIndicator } from '~/Partials/ActivityIndicator/ActivityIndicator';\nimport { useFetchData } from '~/Partials/FetchData/useFetchData';\nimport styles from './StudyModelSectionAccordionItemWithFetch.module.css';\n\nexport interface StudyModelSectionAccordionItemWithFetchProps {\n heading: string;\n contentAdditionalInfo: string;\n prerequisitesHeading: string;\n fetchUrl: string;\n translations: StudyModelSectionAccordionItemTranslations;\n className?: string;\n}\n\nexport interface StudyModelSectionAccordionItemTranslations {\n genericErrorMessage: string;\n}\n\nexport const StudyModelSectionAccordionItemWithFetch: React.FC<\n React.PropsWithChildren\n> = props => {\n const { heading, contentAdditionalInfo, prerequisitesHeading, fetchUrl, translations, className } = props;\n const { genericErrorMessage } = translations;\n\n const { loading, error, data } = useFetchData({\n url: fetchUrl,\n });\n\n const renderStudyModelAccordionContent = () => {\n if (loading) {\n return ;\n }\n\n if (error) {\n return {error};\n }\n\n if (data) {\n return (\n \n );\n }\n\n return {genericErrorMessage};\n };\n\n return (\n
    \n \n
    {renderStudyModelAccordionContent()}
    \n \n
    \n );\n};\n","import React from 'react';\nimport type { ReactNode } from 'react';\nimport { AlertSectionVariant } from '~/Blocks/AlertSectionBlock/AlertSectionVariant.csharp';\nimport { PageSectionHeading } from '~/Features/Layouts/Components/PageSectionHeading/PageSectionHeading';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { AlertSection } from '~/Partials/AlertSection/AlertSection';\nimport { ButtonSize } from '~/Partials/Button/ButtonSize.csharp';\nimport { ButtonTier } from '~/Partials/Button/ButtonTier.csharp';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { HtmlDiv } from '~/Partials/Controls/HtmlDiv';\nimport { asHtmlString } from '~/Partials/Controls/Utils/asHtmlString';\nimport { getGlobalHtmlStringFallback } from '~/Partials/Controls/Utils/globalHtmlStringFallback';\nimport { isHtmlString } from '~/Partials/Controls/Utils/isHtmlString';\nimport type { LinkProps } from '~/Partials/Link/Link';\nimport { Link } from '~/Partials/Link/Link';\nimport { LinkType } from '~/Partials/Link/LinkType.csharp';\nimport styles from './StudyModelSection.module.css';\n\nexport interface StudyModelSectionAccordionItemSettings {\n disabledMessageHeading: string;\n isDisabled?: boolean;\n disabledMessage?: string | HtmlString;\n}\n\nexport interface StudyModelSectionProps {\n id: string;\n teaser: string;\n children: ReactNode;\n settings: StudyModelSectionAccordionItemSettings;\n heading?: HtmlString;\n studyProgramLink?: LinkProps & { label: string };\n}\n\nexport const StudyModelSection: React.FC> = props => {\n const { id, heading, teaser, studyProgramLink, settings, children } = props;\n\n const { isDisabled, disabledMessageHeading, disabledMessage } = { ...settings };\n\n const renderModelContent = () => {\n if (isDisabled) {\n const content = disabledMessage || getGlobalHtmlStringFallback('Study model is not available');\n const contentAsHtmlString = isHtmlString(content) ? content : asHtmlString(content);\n\n return (\n \n \n \n );\n }\n\n return children;\n };\n\n return (\n
    \n
    \n
    \n {heading && }\n
    \n {teaser}\n
    \n
    \n
    \n
    {renderModelContent()}
    \n {studyProgramLink && (\n
    \n \n {studyProgramLink.label}\n \n
    \n )}\n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudyModelSection\":\"eXDLkCBTey4RjrTQSVwU\",\"LinkWrapper\":\"lv4eNMiZgLixMXhAvacD\",\"HeaderWrapper\":\"coBlOy78vCNQoCaBJMWq\",\"Header\":\"fIm4MtcrG6MCKKd8iidQ\",\"Heading\":\"A9Jn0XOSrtngUTCr8gcL\",\"StudyModelContent\":\"DwbrqOYPLpXMxa_AUi5a\",\"TeaserWrapper\":\"t78ozlVAuwJUrQItlgiY\",\"Teaser\":\"IKcqvZpEOT2PNX0vgEn0\",\"DescriptionLink\":\"SwVWunM8J0KL5d8Ov54G\"};","// This code was generated by a Reinforced.Typings tool.\n// Changes to this file may cause incorrect behavior and will be lost if\n// the code is regenerated.\n\nexport enum StudyModelSectionBlockViewModelType {\n\tLegacyView = \"legacyView\",\n\tView = \"view\"\n}\n","import max from 'lodash/max';\nimport orderBy from 'lodash/orderBy';\nimport uniq from 'lodash/uniq';\nimport type { ExtendedSubjectProps } from '../../../StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/StudyModelGrid';\nimport type { IStudyModelSectionBlockViewModel } from '../ViewModel/IStudyModelSectionBlockViewModel.csharp';\nimport type { LegacyStudyModelSectionBlockViewModel } from '../ViewModel/Legacy/LegacyStudyModelSectionBlockViewModel.csharp';\nimport type { StudyModelSectionBlockSubjectOption } from '../ViewModel/StudyModelSectionBlockSubjectOption.csharp';\nimport type { StudyModelSectionBlockSubjectViewModel } from '../ViewModel/StudyModelSectionBlockSubjectViewModel.csharp';\nimport type { StudyModelSectionBlockViewModel } from '../ViewModel/StudyModelSectionBlockViewModel.csharp';\nimport { StudyModelSectionBlockViewModelType } from '../ViewModel/StudyModelSectionBlockViewModelType.csharp';\nimport type { StudyModelSectionTranslations } from '../ViewModel/StudyModelSectionTranslations.csharp';\nimport type { StudyModelSettingsViewModel } from '../ViewModel/StudyModelSettingsViewModel.csharp';\nimport type { AvailableYearProps } from '~/Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/StudyModelGrid';\nimport type { StudyModelSectionAccordionItemSettings } from '~/Features/StudyPage/Campus/Sections/StudyModelSection/StudyModelSection';\nimport { asHtmlString } from '~/Partials/Controls/Utils/asHtmlString';\nimport { createArray, capitalize, isTruthy } from '~/Partials/Utils/utils';\n\nexport const mapSubjects = (subjects: StudyModelSectionBlockSubjectViewModel[]): ExtendedSubjectProps[] =>\n subjects.map(subject => ({\n ...subject,\n description: asHtmlString(subject.description),\n }));\n\nexport const mapSettings = (settings: StudyModelSettingsViewModel): StudyModelSectionAccordionItemSettings => {\n const { disableStudyModel, disabledStudyModelHeading, disabledStudyModelMessage } = settings;\n\n return {\n isDisabled: disableStudyModel,\n disabledMessageHeading: disabledStudyModelHeading,\n disabledMessage: disabledStudyModelMessage,\n };\n};\n\nexport const getAvailableYears = (\n subjects: StudyModelSectionBlockSubjectViewModel[],\n translations: StudyModelSectionTranslations\n): AvailableYearProps[] => {\n const buildSemesterHeading = (semesterNumber: number) => `${semesterNumber}. ${translations.semester}`;\n const buildYearLabel = (yearNumber: string) => `${capitalize(yearNumber)} ${translations.year}`;\n\n const yearTranslationsMapper = [\n translations.first,\n translations.second,\n translations.third,\n translations.fourth,\n translations.fifth,\n ];\n\n const getMaxYear = () => {\n const maxYear = max(subjects.map(subject => subject.year)) ?? 0;\n\n if (maxYear > yearTranslationsMapper.length) {\n console.error('Could not render more years due to lack of translations');\n\n return yearTranslationsMapper.length;\n }\n\n return maxYear;\n };\n\n const maxYear = getMaxYear();\n const hasPrerequisites = subjects.find(subject => subject.isPrerequisite) !== undefined;\n\n const availableYearProps: AvailableYearProps[] = [];\n\n if (hasPrerequisites) {\n availableYearProps.push({\n uniqueId: 0,\n label: translations.prerequisites,\n firstHeading: translations.prerequisites,\n secondHeading: '',\n });\n }\n\n if (maxYear === 1) {\n availableYearProps.push({\n uniqueId: 1,\n label: buildYearLabel(translations.single),\n firstHeading: buildSemesterHeading(1),\n secondHeading: buildSemesterHeading(2),\n isDefault: true,\n });\n } else {\n availableYearProps.push(\n ...createArray(\n index => ({\n uniqueId: index + 1,\n label: buildYearLabel(yearTranslationsMapper[index]),\n firstHeading: buildSemesterHeading(2 * index + 1),\n secondHeading: buildSemesterHeading(2 * index + 2),\n isDefault: index === 0,\n }),\n maxYear\n )\n );\n }\n\n return availableYearProps;\n};\n\nexport const mapToOptions = (allPossibleValues: (string | undefined)[]) => {\n const uniqueValues = uniq(allPossibleValues).filter(isTruthy);\n\n return new Map(uniqueValues.map(value => [value, value]));\n};\n\nexport const mapSubjectsOptions = (allValues: (StudyModelSectionBlockSubjectOption | undefined)[]) => {\n const definedOptions = allValues.filter(isTruthy);\n const orderedValues = orderBy(definedOptions, option => option.isDefault, 'desc').map(value => value.label);\n\n return mapToOptions(orderedValues);\n};\n\nexport const isLegacyView = (\n viewModel: IStudyModelSectionBlockViewModel\n): viewModel is LegacyStudyModelSectionBlockViewModel =>\n viewModel.type === StudyModelSectionBlockViewModelType.LegacyView;\n\nexport const isNewView = (viewModel: IStudyModelSectionBlockViewModel): viewModel is StudyModelSectionBlockViewModel =>\n viewModel.type === StudyModelSectionBlockViewModelType.View;\n","import * as React from 'react';\nimport type { IStudyModelSectionBlockViewModel } from '../ViewModel/IStudyModelSectionBlockViewModel.csharp';\nimport type { LegacyStudyModelSectionBlockViewModel } from '../ViewModel/Legacy/LegacyStudyModelSectionBlockViewModel.csharp';\nimport type { StudyModelSectionBlockViewModel } from '../ViewModel/StudyModelSectionBlockViewModel.csharp';\nimport { StudyModelGrid } from '~/Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelGrid/StudyModelGrid';\nimport { StudyModelSectionAccordionItemWithFetch } from '~/Features/StudyPage/Campus/Sections/StudyModelSection/Components/StudyModelSectionAccordionItemWithFetch/StudyModelSectionAccordionItemWithFetch';\nimport { StudyModelSection } from '~/Features/StudyPage/Campus/Sections/StudyModelSection/StudyModelSection';\nimport {\n getAvailableYears,\n isLegacyView,\n isNewView,\n mapSettings,\n mapSubjects,\n mapSubjectsOptions,\n mapToOptions,\n} from './StudyModelSectionBlockUtils';\n\nexport const StudyModelSectionBlock: React.FC = props => {\n const { id, teaser, studyProgramLink, settings, type } = props;\n\n const propsBase = {\n id,\n teaser,\n studyProgramLink,\n settings: mapSettings(settings),\n };\n\n if (isLegacyView(props)) {\n const { heading } = props;\n\n return (\n \n \n \n );\n }\n\n if (isNewView(props)) {\n const { heading } = props;\n\n return (\n \n \n \n );\n }\n\n throw new Error(`Unsupported study model section: ${type}`);\n};\n\nconst LegacyStudyModel: React.FC = props => {\n const { studyModelAttributes, translations } = props;\n const { displayName, subjectToChanges, prerequisitesDisplayName, getStudyModelUrl } = studyModelAttributes;\n\n return (\n \n );\n};\n\nconst StudyModel: React.FC = props => {\n const { translations, subjects, getSubjectInfoUrl, overlayContentMessages } = props;\n const { genericErrorMessage, goToSubject, loading } = translations;\n\n return (\n subject.specialization))}\n studyOptions={mapSubjectsOptions(subjects.map(subject => subject.studyOption))}\n getSubjectInfoUrl={getSubjectInfoUrl}\n overlayContentMessages={overlayContentMessages}\n translations={{\n ...translations,\n errorMessage: genericErrorMessage,\n buttonLabel: goToSubject,\n loadingMessage: loading,\n }}\n />\n );\n};\n","import classNames from 'classnames';\nimport React from 'react';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\nimport { HtmlHeading } from '~/Partials/Controls/HtmlHeading';\nimport styles from './PageSectionHeading.module.css';\n\ninterface PageSectionHeadingProps {\n heading: HtmlString;\n className?: string;\n}\n\nexport const PageSectionHeading: React.FC = props => {\n const { heading, className } = props;\n\n return ;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"PageSectionHeading\":\"FrR9v_ssranAjR5kDzwF\"};","import groupBy from 'lodash/groupBy';\nimport type { LegacySemesterViewModel } from '../../ViewModel/LegacySemesterViewModel.csharp';\nimport type { LegacySubjectViewModel } from '../../ViewModel/Subject/LegacySubjectViewModel.csharp';\nimport type { ProgramSemesterSubjects, StudySubject } from '~/Partials/StudySubjects/StudySubjects';\n\nconst mapSubjectToModel = (subject: LegacySubjectViewModel): StudySubject => ({\n name: subject.name,\n url: subject.url,\n});\n\nexport const mapSemestersToModel = (semesters: LegacySemesterViewModel[]): ProgramSemesterSubjects[] =>\n semesters.map(semester => {\n const result = {\n subjects: [],\n specializations: [],\n } as ProgramSemesterSubjects;\n\n const groupedSubjects = groupBy(semester.subjects, s => s.specialization);\n\n Object.entries(groupedSubjects).forEach(([specialization, subjects]) => {\n specialization\n ? result.specializations.push({\n name: specialization,\n subjects: subjects.map(mapSubjectToModel),\n })\n : (result.subjects = subjects.map(mapSubjectToModel));\n });\n\n return result;\n });\n","// extracted by mini-css-extract-plugin\nexport default {\"Inner\":\"EwPhzUN1NfTBa1XOsTE6\",\"ActivityIndicatorRotate\":\"ZNgVI5R_Ahgk3DnOyUhN\",\"Inner--cover\":\"TVMntCe8qkWIdDcQxQb6\",\"Outer\":\"FxrXNHIEItswETCvk14E\",\"Children\":\"rK8S3lKkJdvsHyzk1dZ1\"};","import classNames from 'classnames';\nimport * as React from 'react';\nimport styles from './ActivityIndicator.module.css';\n\nexport interface ActivityIndicatorProps {\n cover?: boolean;\n active?: boolean;\n modal?: boolean;\n children?: string | React.ReactNode;\n}\n\nconst ModalWrapper: React.FC> = props => {\n const { visible, children } = props;\n\n return (\n \n {children}\n \n );\n};\n\nexport const ActivityIndicator: React.FC> = React.memo(props => {\n const { modal = true, cover, active = true, children } = props;\n\n const Wrapper = modal ? ModalWrapper : React.Fragment;\n const wrapperProps = modal ? { visible: active } : {}; // react.Fragment cannot have any props\n\n return (\n \n \n {children && (\n {children}\n )}\n \n );\n});\n","import * as React from 'react';\nimport type { HtmlString } from '~/Features/Types/HtmlString.csharp';\n\nexport interface HtmlHeadingProps {\n html: HtmlString;\n type: keyof Pick;\n id?: string;\n className?: string;\n}\n\nexport const HtmlHeading: React.FC = props => {\n const { type, html, id, className } = props;\n\n return React.createElement(type, { className, id, dangerouslySetInnerHTML: { __html: html.value } });\n};\n","import type { HtmlString } from '~/Features/Types/HtmlString.csharp';\n\nexport const asHtmlString = (content: string): HtmlString => ({ value: content });\n","import { asHtmlString } from './asHtmlString';\n\nexport const getGlobalHtmlStringFallback = (reason: string) =>\n asHtmlString(`\n Sorry, we couldn't display the appropriate message for the following situation: ${reason}. Please contact our support team so we can fix this as soon as possible. Thank you!\n `);\n","import type { HtmlString } from '~/Features/Types/HtmlString.csharp';\n\nexport function isHtmlString(content: unknown): content is HtmlString {\n return !!content && typeof content === 'object' && 'value' in content && typeof content.value === 'string';\n}\n","import type { AxiosResponse, Canceler } from 'axios';\nimport axios, { isCancel } from 'axios';\nimport * as React from 'react';\nimport { usePrevious } from '../Utils/usePrevious';\nimport { checkEquals } from '../Utils/utils';\nimport { useDebounce } from '~/Utils/Hooks/useDebounce';\nimport { axiosWrapper } from './axiosWrapper';\nimport type { FetchDataAction, FetchDataHookProps, FetchDataHookReturn, FetchDataHookState } from './types';\n\nfunction reducer(\n state: FetchDataHookState,\n action: FetchDataAction\n): FetchDataHookState {\n switch (action.type) {\n case 'SET_DATA':\n return {\n ...state,\n data: action.payload,\n loading: false,\n error: undefined,\n };\n case 'SET_ERROR':\n return {\n ...state,\n loading: false,\n data: undefined,\n error: action.payload,\n };\n case 'START_REQUEST':\n return {\n ...state,\n error: undefined,\n loading: true,\n dataRequested: true,\n };\n default:\n return state;\n }\n}\n\nexport function useFetchData(\n props: FetchDataHookProps\n): FetchDataHookReturn {\n const { url, params, method = 'get', shouldMakeRequest = true, debounceTime = 200, timeout = 0 } = props;\n\n const [{ data, loading, error, dataRequested }, dispatch] = React.useReducer<\n React.Reducer, FetchDataAction>\n >(reducer, {\n data: undefined,\n loading: false,\n error: undefined,\n dataRequested: false,\n });\n\n const previousProps = usePrevious({ url, method, params });\n const requestWithDebounce = useDebounce(request, debounceTime);\n\n const cancelToken = React.useRef();\n\n React.useEffect(() => {\n if (shouldMakeRequest) {\n fetchData();\n }\n\n return () => {\n if (cancelToken.current) {\n cancelToken.current();\n }\n };\n }, []);\n\n React.useEffect(() => {\n const propsChanged = previousProps\n ? previousProps.url !== url || previousProps.method !== method || !checkEquals(previousProps.params, params)\n : false;\n\n if ((propsChanged || !dataRequested) && shouldMakeRequest) {\n fetchData();\n }\n }, [url, method, params, dataRequested, shouldMakeRequest]);\n\n function fetchData() {\n if (cancelToken.current) {\n cancelToken.current();\n }\n\n dispatch({ type: 'START_REQUEST' });\n requestWithDebounce();\n }\n\n function request() {\n axiosWrapper\n .request>({\n url,\n method,\n params,\n timeout,\n cancelToken: new axios.CancelToken(token => {\n cancelToken.current = token;\n }),\n })\n .then(response => {\n cancelToken.current = undefined;\n dispatch({ type: 'SET_DATA', payload: response.data });\n })\n .catch(e => {\n if (isCancel(e)) {\n return;\n }\n\n dispatch({ type: 'SET_ERROR', payload: e.message });\n // eslint-disable-next-line no-console\n console.error(e);\n });\n }\n\n return {\n data,\n loading,\n error,\n };\n}\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport { Link } from '../Link/Link';\nimport { List } from '../List/List';\nimport styles from './StudySubjects.module.css';\n\nexport interface StudySubject {\n name: string;\n url: string;\n code?: string;\n}\n\nexport interface Specialization {\n name: string;\n subjects: StudySubject[];\n}\n\nexport interface ProgramSemesterSubjects {\n subjects: StudySubject[];\n specializations: Specialization[];\n}\n\nexport interface StudySubjectsProps {\n programSemesters: ProgramSemesterSubjects[];\n standalone?: boolean;\n}\n\nexport const StudySubjects: React.FC = props => {\n const { programSemesters, standalone = true } = props;\n\n const renderLabel = (name: string, code?: string) => (code ? `${name} (${code})` : name);\n\n const renderSubjects = (subjects: StudySubject[]): ReactNode => (\n (\n
  • \n {subject.url ? (\n \n ) : (\n \n {subject.name} ({subject.code})\n \n )}\n
  • \n )}\n />\n );\n const renderSpecializations = (specializations: Specialization[]): ReactNode =>\n specializations.length > 0 &&\n specializations.map(spec => (\n \n

    {spec.name}

    \n {renderSubjects(spec.subjects)}\n
    \n ));\n\n return (\n
    \n {programSemesters.length > 0 && (\n (\n
  • \n

    {`${index + 1}. semester`}

    \n {semester.subjects.length > 0 && renderSubjects(semester.subjects)}\n {semester.specializations.length > 0 && renderSpecializations(semester.specializations)}\n
  • \n )}\n />\n )}\n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"StudySubjects\":\"JuhALy8QczD5OXPh8Jie\",\"Semesters\":\"W0u_Qs9eMSSEStSVhPew\",\"SemesterHeading\":\"znWcjXgptppIWxi7smpc\",\"SpecializationHeading\":\"H2JWPpyTuYru0sfFMgBW\",\"SubjectList\":\"IykGDM3lxRMi1jBXbPzv\",\"Subject\":\"Pg5Mv89LsRfU7OAOpWuM\",\"Variant--standalone\":\"G0fuzp0zzsTQyi0bRCF0\"};","import * as React from 'react';\n\nexport function usePrevious(value: T) {\n const ref = React.useRef();\n React.useEffect(() => {\n ref.current = value;\n });\n\n return ref.current as T;\n}\n","import classNames from 'classnames';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { Button } from '~/Partials/Button/Button';\nimport { ButtonType } from '~/Partials/Button/ButtonType.csharp';\nimport { Portal } from '~/Partials/Modal/Portal';\nimport type { ModalWrapperProps } from '~/Partials/ModalWrapper/ModalWrapper';\nimport { ModalWrapper } from '~/Partials/ModalWrapper/ModalWrapper';\nimport { SvgIcon } from '~/Partials/SvgIcon/SvgIcon';\nimport { animationDurationMs } from '~/Utils/AnimationsUtils';\nimport { useIsMounted } from '~/Utils/Hooks/useIsMounted';\nimport styles from './Overlay.module.css';\n\nexport interface OverlayProps extends Pick {\n id: string;\n overlayLabel: string;\n isActive: boolean;\n closeLabel: string;\n className?: string;\n}\n\nconst InvisibleDiv: React.FC = props => {\n const { children } = props;\n\n return
    {children}
    ;\n};\n\nexport const Overlay: React.FC> = props => {\n const { id, overlayLabel, isActive, close, closeLabel, children, className } = props;\n\n const [isAnimationInProgress, setIsAnimationInProgress] = React.useState(false);\n const animatedElement = React.useRef(null);\n const backgroundRef = React.useRef(null);\n const isMounted = useIsMounted();\n\n const isOverlayVisible = isActive || isAnimationInProgress;\n\n // Must be set as an inline style because FocusTrap update handler launches before conditional class styles\n // are applied to the element. This handler searches for tabbable element and checks if it's visible\n // (i.e. neither it nor its parents have display:none) - if not it will throw an error.\n const displayMode = isOverlayVisible ? undefined : 'none';\n\n const labelId = uniqueId('overlayLabel_');\n\n // In order to support SSR (so that the content is indexed), we cannot use the Portal component\n // which is solely client-side. Instead, we use a dummy div that is hidden from the user and after\n // the component is mounted, we replace it with the Portal.\n const WrapperElement = isMounted ? Portal : InvisibleDiv;\n\n return (\n \n \n \n
    \n \n setIsAnimationInProgress(true)}\n onExited={() => setIsAnimationInProgress(false)}\n >\n \n {buttonClickClose => (\n
    \n
    \n \n \n {closeLabel}\n \n
    \n
    \n \n {overlayLabel}\n \n {children}\n
    \n
    \n )}\n \n \n
    \n
    \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"Overlay\":\"QhFNlQLYGSl_aaOQtwwl\",\"Background\":\"lAKZZQugItoUqTlu8DRV\",\"Inner\":\"po18YUo5kkFOZqsiTnKR\",\"TopBanner\":\"eOdUoHIpgD7QwsaR1kGn\",\"Content\":\"fyYha0cYX3WzsCpMkhUB\",\"CloseButton\":\"sZg2Vy20YIsqTNv9TcIX\"};","import isFunction from 'lodash/isFunction';\nimport uniqueId from 'lodash/uniqueId';\nimport * as React from 'react';\nimport type { ReactNode } from 'react';\nimport type { OverlayProps } from './Overlay';\nimport { Overlay } from './Overlay';\n\nexport interface OverlayContainerProps extends Pick {\n content: TContent;\n openLabel: string;\n}\n\nexport interface OverlayTriggerButtonProps\n extends Required<\n Pick, 'aria-controls' | 'aria-expanded' | 'aria-haspopup' | 'onClick'>\n > {\n 'aria-haspopup': 'dialog';\n onClick: () => void; // Overriden base 'onClick' to not expose the event\n}\n\nexport interface WithOverlayProps extends Pick {\n overlayContent: ((close: () => void, isOpen: boolean) => ReactNode) | ReactNode;\n children: (triggerButtonProps: OverlayTriggerButtonProps) => ReactNode;\n}\n\nexport const WithOverlay: React.FC = props => {\n const { overlayContent, children, ...restProps } = props;\n\n const [isActive, setIsActive] = React.useState(false);\n\n const overlayId = uniqueId('overlay_');\n\n const triggerButtonProps: OverlayTriggerButtonProps = {\n onClick: () => setIsActive(true),\n 'aria-expanded': isActive,\n 'aria-controls': overlayId,\n 'aria-haspopup': 'dialog',\n };\n\n const close = () => setIsActive(false);\n\n return (\n <>\n {children(triggerButtonProps)}\n \n {isFunction(overlayContent) ? overlayContent(close, isActive) : overlayContent}\n \n \n );\n};\n","export const enum MouseButton {\n Left = 0,\n Middle = 1,\n Right = 2,\n}\n","import isEmpty from 'lodash/isEmpty';\nimport * as React from 'react';\nimport { findClosestParent } from '~/Partials/Utils/utils';\nimport { MouseButton } from '~/Utils/MouseButton';\n\nconst isNonEmpty = (selection: Selection | null): selection is Selection => !isEmpty(selection?.toString());\n\nconst isLabel = (element: Element): element is HTMLLabelElement => element.tagName.toLowerCase() === 'label';\n\nconst willBeHandledByAssociatedElement = (eventTarget: Element, clickableElement: HTMLElement) => {\n const nearestLabel = findClosestParent(eventTarget, isLabel);\n\n if (nearestLabel === null) {\n return false;\n }\n\n const associatedElementId = nearestLabel.getAttribute('for');\n\n if (!associatedElementId) {\n return false;\n }\n\n return associatedElementId === clickableElement.id;\n};\n\nconst portalContainerId = 'portal-container';\n\n// Due to event propagation from portal to React tree we have to manually exclude these events.\n// https://github.com/facebook/react/issues/11387\nconst willBubbleOutsideOfPortal = (eventTarget: Node | null, clickableElement: HTMLElement) => {\n let potentialPortalContainer = eventTarget;\n let previouslyCheckedElement: Node | null = null;\n\n while (potentialPortalContainer) {\n if (potentialPortalContainer instanceof HTMLElement && potentialPortalContainer.id === portalContainerId) {\n // If we find a container, we are sure that the previous element is a root element for one of the portals.\n // Then we only check whether the clickable element is part of that particular portal's tree so that\n // multiple portals do not interfere with each other.\n // If previouslyCheckedElement is null it means that event target is portal container itself.\n // Then we treat an event as if it would bubble outside the portal.\n return !previouslyCheckedElement || !previouslyCheckedElement.contains(clickableElement);\n }\n\n previouslyCheckedElement = potentialPortalContainer;\n potentialPortalContainer = potentialPortalContainer.parentElement;\n }\n\n return false;\n};\n\nconst shouldIgnoreEvent = (eventTarget: EventTarget, clickableElement: HTMLElement | null) =>\n clickableElement === null ||\n !(eventTarget instanceof Element) ||\n clickableElement.contains(eventTarget) ||\n willBeHandledByAssociatedElement(eventTarget, clickableElement) ||\n willBubbleOutsideOfPortal(eventTarget, clickableElement);\n\nexport const useClickProxyAllowingTextSelection = () => {\n const clickableRef = React.useRef(null);\n\n const onProxyMouseDown = (event: React.MouseEvent) => {\n if (shouldIgnoreEvent(event.target, clickableRef.current)) {\n return;\n }\n\n if (event.button === MouseButton.Left) {\n const userSelection = getSelection();\n\n if (isNonEmpty(userSelection)) {\n userSelection.removeAllRanges();\n }\n }\n\n if (event.button === MouseButton.Middle) {\n event.preventDefault();\n }\n };\n\n const onProxyMouseUp = (event: React.MouseEvent) => {\n if (shouldIgnoreEvent(event.target, clickableRef.current)) {\n return;\n }\n\n if (event.button === MouseButton.Left) {\n if (isNonEmpty(getSelection())) {\n return;\n }\n\n clickableRef.current?.click();\n clickableRef.current?.focus();\n }\n\n if (event.button === MouseButton.Middle) {\n const eventCopy = new MouseEvent('click', { button: event.button, bubbles: true });\n\n clickableRef.current?.dispatchEvent(eventCopy);\n }\n };\n\n return { clickableRef, onProxyMouseDown, onProxyMouseUp };\n};\n","import debounce from 'lodash/debounce';\nimport * as React from 'react';\nimport { useVariableWithStableRef } from './useVariableWithStableRef';\n\nexport function useDebounce(callback: () => void, debounceTime: number) {\n const handlerRef = useVariableWithStableRef(callback);\n\n return React.useCallback(\n debounce(() => handlerRef.current?.(), debounceTime),\n [handlerRef]\n );\n}\n","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseAggregator;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n","var arrayAggregator = require('./_arrayAggregator'),\n baseAggregator = require('./_baseAggregator'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nmodule.exports = createAggregator;\n","var baseAssignValue = require('./_baseAssignValue'),\n createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nmodule.exports = groupBy;\n","var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n identity = require('./identity');\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n","var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n","var baseOrderBy = require('./_baseOrderBy'),\n isArray = require('./isArray');\n\n/**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\nfunction orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n}\n\nmodule.exports = orderBy;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n"],"names":["getPointsLabel","messageFormat","points","undefined","FormattedText","toCssGridPosition","position","concat","lineNumber","span","horizontalLayoutGridRowPositionForSemester","first","second","both","pointsSelector","subject","getColumnsCount","allPoints","longestSemesterPoints","smallestAmountOfPoints","numberOfColumns","potentialWidth","localMinimum","Infinity","nextDivider","numberOfColumnsCandidate","round","columnWidth","sumOfPointsThatWillNotPerfectlyFitIntoCalculatedNumberOfColumns","sum","map","point","calculateSubjectsPosition","allYearSubjects","firstSemesterSubjects","secondSemesterSubjects","columnsCount","allYearPosition","result","performPlacementAndGetNewPosition","code","firstSemesterLastItem","secondSemesterLastItem","firstSemesterPosition","secondSemesterPosition","adjustLastItem","lastPosition","lastItemId","stretch","diff","item","renderEmptyMessage","message","React","className","classNames","baseStyles","renderSubjects","subjects","gridColumnMapping","renderSubject","gridRowResolver","key","style","gridColumn","gridRow","StudyModelHorizontalLayout","props","firstHeading","secondHeading","noSubjectsMessage","useSingleRow","arguments","length","allPointsNumber","min","Error","calculateForSingleRow","filter","semester","bothSemestersSubjects","firstSemesterPoints","sumBy","secondSemesterPoints","bothSemestersPoints","longerSemesterPoints","calculateForTwoRows","resolveHorizontalGridLayout","StudyModelSingleRowHorizontalLayout","horizontalStyles","subjectCardStyles","gridTemplateColumns","StudyModelVerticalLayout","StudyModelSingleColumnVerticalLayout","verticalStyles","StudyModelLayout","restProps","_objectWithoutProperties","_excluded","isBelowDesktop","useWindowWidthDetection","condition","breakpoint","MediaBreakpoints","Desktop","filteredSubjects","_extends","SubjectCard","contextualTheme","useTheme","subjectName","subjectCode","translations","subjectCategory","onClick","additionalAriaProps","theme","withRoundedCorners","locale","getContentLocale","clickableRef","onProxyMouseDown","onProxyMouseUp","useClickProxyAllowingTextSelection","role","onMouseDown","onMouseUp","tabIndex","Button","ref","type","ButtonType","Clear","getFooterPillTag","pillTagBase","styles","size","PillTag","variant","fontColor","specialization","elective","assertNever","toLocaleString","pointsUnit","SubjectOverlayAction","fetchSubjectLinkUrl","shouldMakeRequest","error","loading","data","useFetchData","url","params","renderControl","buttonLabel","SvgIcon","iconName","actionBaseConfig","withButtonPrefix","ButtonSize","Large","ButtonTier","Primary","Solid","loadingMessage","ActivityIndicator","modal","active","disabled","Link","LinkType","href","errorMessage","SubjectOverlayContent","subjectDescription","messages","isDescriptionOutdated","subjectHasDescription","value","renderAlert","alert","_alert$variant","AlertSection","headerType","header","heading","AlertSectionVariant","Warning","HtmlDiv","html","outdated","fallback","SubjectCardWithOverlay","subjectOverlayLabel","closeOverlayLabel","WithOverlay","overlayContent","_","isOpen","overlayLabel","closeLabel","triggerButtonProps","ariaProps","_excluded2","StudyModelGridSemesters","selectedYearProps","currentYearSubjects","getSubjectInfoUrl","overlayContentMessages","openSubjectOverlay","closeOverlay","restTranslations","name","category","description","StudyModelGridContent","specializationOptions","selectedSpecialization","onSpecializationSelected","selectedStudyOption","onStudyOptionSelected","studyOptions","semesterViewProps","studyOptionsLabel","studyPointsFormat","currentYearPoints","hasAnySpecializations","hasAny","hasAnyStudyOptions","studyOption","pointsLabel","Collapse","ComboSelector","options","currentValue","onChange","label","_objectSpread","StudyModelGridHiddenTabContent","year","allSubjects","subjectsForYear","List","items","renderItem","StudyModelGrid","_ref","_availableYears$find","availableYears","selectYear","totalStudyPointsFormat","setSelectedSpecialization","firstKey","setSelectedStudyOption","selectedYear","setSelectedYear","find","isDefault","uniqueId","totalPoints","HiddenTabContent","tabProps","BookmarkContainer","tabsLabel","tabs","currentlySelectedTab","setSelectedTab","upperDescription","StudyModelSectionAccordionItemContent","prerequisitesHeading","renderPrerequisites","prerequisites","prerequisite","LinkVariant","LightBlack","StudySubjects","programSemesters","mapSemestersToModel","semesters","StudyModelSectionAccordionItemWithFetch","contentAdditionalInfo","fetchUrl","genericErrorMessage","AccordionItem","color","contentSpacing","headerContent","StudyModelSection","id","teaser","studyProgramLink","settings","children","isDisabled","disabledMessageHeading","disabledMessage","PageSectionHeading","renderModelContent","content","getGlobalHtmlStringFallback","contentAsHtmlString","isHtmlString","asHtmlString","Info","buttonType","Outline","buttonTier","Tertiary","buttonSize","Medium","StudyModelSectionBlockViewModelType","mapSubjects","mapSettings","disableStudyModel","disabledStudyModelHeading","disabledStudyModelMessage","getAvailableYears","buildSemesterHeading","semesterNumber","buildYearLabel","yearNumber","capitalize","yearTranslationsMapper","third","fourth","fifth","maxYear","getMaxYear","_max","max","console","availableYearProps","isPrerequisite","push","single","createArray","index","mapToOptions","allPossibleValues","uniqueValues","uniq","isTruthy","Map","mapSubjectsOptions","allValues","definedOptions","orderedValues","orderBy","option","StudyModelSectionBlock","propsBase","LegacyView","LegacyStudyModel","View","StudyModel","studyModelAttributes","displayName","subjectToChanges","prerequisitesDisplayName","getStudyModelUrl","goToSubject","HtmlHeading","mapSubjectToModel","specializations","groupedSubjects","groupBy","s","Object","entries","forEach","ModalWrapper","visible","display","cover","Wrapper","wrapperProps","dangerouslySetInnerHTML","__html","reason","reducer","state","action","payload","dataRequested","method","debounceTime","timeout","dispatch","previousProps","usePrevious","requestWithDebounce","useDebounce","axiosWrapper","request","cancelToken","axios","CancelToken","token","current","then","response","catch","e","isCancel","fetchData","checkEquals","standalone","renderLabel","spec","InvisibleDiv","Overlay","isActive","close","isAnimationInProgress","setIsAnimationInProgress","animatedElement","backgroundRef","isMounted","useIsMounted","isOverlayVisible","displayMode","labelId","WrapperElement","Portal","CSSTransition","nodeRef","in","appear","animationDurationMs","onEnter","onExited","isFocusTrapActive","isScrollLocked","shouldHideMainScrollBar","buttonClickClose","title","setIsActive","overlayId","isFunction","MouseButton","isNonEmpty","selection","isEmpty","toString","isLabel","element","tagName","toLowerCase","shouldIgnoreEvent","eventTarget","clickableElement","Element","contains","willBeHandledByAssociatedElement","nearestLabel","findClosestParent","associatedElementId","getAttribute","willBubbleOutsideOfPortal","potentialPortalContainer","previouslyCheckedElement","HTMLElement","parentElement","event","target","button","Left","userSelection","getSelection","removeAllRanges","Middle","preventDefault","_clickableRef$current","_clickableRef$current2","click","focus","_clickableRef$current3","eventCopy","MouseEvent","bubbles","dispatchEvent","callback","handlerRef","useVariableWithStableRef","debounce","_handlerRef$current","call","module","exports","array","setter","iteratee","accumulator","baseEach","collection","other","arrayAggregator","baseAggregator","baseIteratee","isArray","initializer","func","baseAssignValue","createAggregator","hasOwnProperty","prototype","baseExtremum","baseGt","identity","baseLt","baseOrderBy","iteratees","orders","guard","toFinite","remainder"],"sourceRoot":""}