{"version":3,"sources":["ddh-styles.tsx","components/IconRenderer.tsx","datatypes/CollapsedState.ts","components/ContentMarkdown.tsx","components/DDHPageContext.tsx","components/Loading.tsx","components/CollapsibleSection.tsx","components/HelpTooltip.tsx","components/ContentLink.tsx","util.ts","datatypes/Navigation.ts","components/LanguageChooser.tsx","components/NavBar.tsx","datatypes/MobileTitle.ts","components/NavMenu.tsx","components/PageFooter.tsx","components/PageHeader.tsx","datatypes/TableOfContents.ts","hooks/usePageTitle.ts","pagetypes/MobileTitlePage.tsx","App.tsx","hooks/useRefreshToken.ts","index.tsx","ddh-translations.ts"],"names":["getLinkStyle","linkUrl","linkUrlLower","toLowerCase","startsWith","getCollapseIcon","isExpanded","iconType","IconType","FontAwesome","iconId","faMinusSquare","faPlusSquare","RenderIcon","props","iconSize","iconSizeProp","icon","size","undefined","globalCollapsedState","getGlobalCollapsedState","key","getGlobalExpandedState","result","setGlobalCollapsedState","value","setGlobalExpandedState","collapsiblePlugin","endSection","endingNode","ctx","allHeaders","push","headerText","currentHeader","referenceUrl","currentReferenceUrl","nodes","headerBuffer","nodesToRemove","tree","children","forEach","node","type","length","trim","nodeEndsSection","newSectionInfo","m","match","nodeStartsSection","newSectionName","newSectionReferenceUrl","filter","n","includes","x","nodesToMove","slice","replaceNode","position","end","column","line","offset","ContentMarkdown","useState","lastContent","setLastContent","lastHash","setLastHash","changedAnchor","scrollTo","changedContent","source","anchor","element","document","querySelector","scrollIntoView","scrollToAnchor","ddhRenderers","link","LinkRenderer","collapsibleSection","collapseSectionsByDefault","CollapsibleSectionRendererCollapsed","CollapsibleSectionRendererExpanded","table","TableRenderer","tableRow","TableRowRenderer","highlightedTerms","text","p","searchTerms","findChunks","findChunksWholeWords","highlightClassName","searchWords","textToHighlight","defaultTextRenderer","TextRenderer","inline","paragraph","InlineParagraphRenderer","renderers","escapeHtml","className","astPlugins","tableAltRow","alt","obj","results","idx","lastIdx","textToHighlightLower","idxTmp","matches","map","word","index","indexOf","createHighlight","sort","a","b","start","CollapsibleSectionRenderer","collapseByDefault","linkClassName","headerTitle","referenceLink","defaultCollapsed","newWindow","isExternalLink","href","isDocumentLink","linkShouldOpenInNewWindow","cssClass","DDHPageContext","React","createContext","pageTitle","titleBar","setPageTitle","useDDHPageContext","useContext","Loading","t","useTranslation","src","Reference","url","target","title","rel","faFileAlt","SectionIcon","ToolTip","sectionKey","tooltip","id","sanitizeHtmlId","placement","CollapsibleSection","rememberCollapsedState","groupId","window","location","pathname","globalCollapsed","globalOrDefaultCollapsed","collapsed","setCollapsed","currentSectionKey","setCurrentSectionKey","toggleContainer","e","preventDefault","rowClassName","innerClassName","onClick","sectionIcon","isOpen","HelpTooltip","setIsOpen","toggleTooltip","useCallback","prev","faQuestionCircle","toggle","ContentLink","contentKey","to","verHash","verHashExpire","fetchServerUrl","filename","hash","Date","now","encodeURIComponent","uuid","verHashExpirationInSeconds","fetch","distinct","values","compareForSort","us","them","reverseCompareForSort","replace","sortByMember","list","valueFunc","usValue","themValue","Array","i","cmp","reverseSortByMember","capitalizeFirstWord","split","txt","toUpperCase","prepareUriString","decodeURIComponent","parseQueryString","queryString","substring","param","parts","console","error","sum","val","statsKey","storageAvailable","storage","localStorage","setItem","removeItem","DOMException","code","name","DDH_STATS_KEY","getStatsKey","tmpKey","getItem","statsKeyTmp","datePart","parseInt","navigationItems","faHome","translationKey","faClipboardCheck","faIndustry","faQuestion","faSearch","faBook","faTasks","faLink","faEnvelopeOpenText","faAddressCard","LanguageChooser","i18n","currentLanguageName","availableLanguages","find","l","abbreviation","language","UncontrolledDropdown","DropdownToggle","caret","role","DropdownMenu","tag","DropdownItem","changeLanguage","Input","checked","readOnly","htmlFor","Icon","NavBar","log","faExclamationCircle","faBars","nav","xs","style","whiteSpace","clearMobileTitle","isMobile","shouldShowMobileTitle","VIEWED_OTHER_PAGE","hasViewedOtherPage","forceStandardHomePage","storeMobileTitleState","isHomePage","_isMobile","device","UAParser","getDevice","NavMenu","homePageView","ListGroup","ListGroupItem","NavLink","action","exact","width","PageFooter","PageHeader","forceRefresh","clickHeader","height","getErrorNode","pageId","getPageTitle","subtitle","MobileTitlePage","library","add","faListAlt","dom","watch","HomePage","lazy","TopicPage","RequirementsSearchPage","TableOfContentsPage","AnswerDisplay","Version","Feedback","Contact","App","locale","refresh","refreshToken","setRefreshToken","useRefreshToken","pageState","setPageState","titleUpdate","titleBarUpdate","iconUpdate","appTitle","useEffect","docTitle","usePageTitle","showMobileTitle","Provider","tabIndex","fallback","path","component","render","pageTitleKey","pageTitleIcon","loadFunc","then","resp","json","catch","err","getTableOfContents","getGlossary","getTOCDocuments","getTOCRequirements","ReactDOM","getElementById","resources","en","translation","enResources","fr","frResources","es","esResources","Set","use","LanguageDetector","initReactI18next","init","fallbackLng","debug","process","interpolation","escapeValue","detection","order","missingKeyHandler"],"mappings":"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","file":"static/js/main.4117941f.chunk.js","sourcesContent":["import React from \"react\";\r\nimport { RenderIcon, IconType } from \"./components/IconRenderer\";\r\nimport { faMinusSquare, faPlusSquare } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nfunction getLinkStyle(linkUrl: string): string | null {\r\n var linkUrlLower = linkUrl.toLowerCase();\r\n\r\n if (\r\n linkUrlLower.startsWith(\"/page/browse-\") ||\r\n linkUrlLower.startsWith(\"/page/applicable-safeguards-agreements\") ||\r\n linkUrlLower.startsWith(\"/page/other-resources\") ||\r\n linkUrlLower.startsWith(\"/requirements-search\") ||\r\n linkUrlLower.startsWith(\"/table-of-contents\")\r\n )\r\n return \"search-link\";\r\n else if (\r\n linkUrlLower.startsWith(\"http://\") ||\r\n linkUrlLower.startsWith(\"https://\")\r\n )\r\n return \"external-link\";\r\n else if (linkUrlLower.startsWith(\"/page/glossary-\")) return \"glossary-link\";\r\n else if (linkUrlLower.startsWith(\"/page/requirement-\"))\r\n return \"requirements-link\";\r\n\r\n return null;\r\n}\r\n\r\nexport function getCollapseIcon(isExpanded: boolean) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport { getLinkStyle };\r\n","import React from \"react\";\r\nimport {\r\n IconName,\r\n IconProp,\r\n SizeProp,\r\n} from \"@fortawesome/fontawesome-svg-core\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\n// FontAwesome - this will include all\r\n// import { library } from '@fortawesome/fontawesome-svg-core';\r\n// import { far } from '@fortawesome/free-regular-svg-icons';\r\n// import { fas } from '@fortawesome/free-solid-svg-icons';\r\n// library.add(far, fas);\r\n\r\nexport enum IconType {\r\n FontAwesome,\r\n}\r\n\r\nexport interface IconLocator {\r\n iconType: IconType;\r\n iconId: string | IconProp;\r\n}\r\n\r\nexport interface RenderIconProps {\r\n iconType: IconType;\r\n iconId: string | IconProp;\r\n iconSize?: SizeProp | string | undefined;\r\n}\r\n\r\n/**\r\n * Used to render an icon, allowing for multiple icon libraries to be used.\r\n * @param props\r\n */\r\nexport function RenderIcon(props: RenderIconProps) {\r\n const { iconType, iconId, iconSize } = props;\r\n\r\n if (iconType === IconType.FontAwesome) {\r\n const iconSizeProp = iconSize as SizeProp;\r\n return (\r\n \r\n );\r\n } else {\r\n return <>;\r\n }\r\n}\r\n","// Used to remember collapsed state for sections across pages within the same session.\r\n//\r\n// Currently, this is implemented with a dictionary (so that separate browser windows\r\n// maintain their own collapsed state). This could be replaced with another implementation\r\n// if collapsed state was necessary between windows.\r\n\r\nvar globalCollapsedState: { [id: string]: boolean } = {};\r\n\r\nexport function getGlobalCollapsedState(key: string | null): boolean | null {\r\n if (key && globalCollapsedState[key] !== undefined) {\r\n return globalCollapsedState[key];\r\n }\r\n return null;\r\n}\r\n\r\nexport function getGlobalExpandedState(key: string | null): boolean | null {\r\n var result = getGlobalCollapsedState(key);\r\n if (result == null) return null;\r\n return !result;\r\n}\r\n\r\nexport function setGlobalCollapsedState(key: string | null, value: boolean) {\r\n if (key) {\r\n globalCollapsedState[key] = value;\r\n }\r\n}\r\n\r\nexport function setGlobalExpandedState(key: string | null, value: boolean) {\r\n if (key) {\r\n globalCollapsedState[key] = !value;\r\n }\r\n}\r\n","import React, { useState } from \"react\";\r\nimport ReactMarkdown, { renderers } from \"react-markdown\";\r\nimport Highlighter from \"react-highlight-words\";\r\n\r\nimport { getLinkStyle } from \"../ddh-styles\";\r\nimport CollapsibleSection from \"./CollapsibleSection\";\r\n\r\nimport {\r\n ContentLink,\r\n isExternalLink,\r\n isDocumentLink,\r\n linkShouldOpenInNewWindow,\r\n} from \"./ContentLink\";\r\n\r\n// Built-in CSS classes:\r\n// - Applies .markdown-content to all markdown blocks\r\n// - Applies .markdown-inline when inline prop = true\r\n// - Applies .table to all markdown tables\r\n// - Applies .table-light to markdown table rows\r\n// - Applies .h4 (rather than the default .h3) to collapsible section headers\r\n// - Applies search-highlight to highlighted words\r\n\r\n/**\r\n * Plugin for react-markdown that creates a CollapsibleSection control.\r\n *\r\n * In markdown, this is represented as:\r\n *\r\n * ::(Header Text)(/path/to/document/reference)\r\n *\r\n * ...\r\n *\r\n * ::\r\n */\r\nfunction collapsiblePlugin() {\r\n // Tests that a node is a paragraph, has 1 child, and that child's value is in the format \"\"::(SECTION NAME)\"\"\r\n function nodeStartsSection(node: any) {\r\n if (\r\n node.type === \"paragraph\" &&\r\n node.children &&\r\n node.children.length === 1 &&\r\n node.children[0].value\r\n ) {\r\n var m = node.children[0].value.match(\r\n /^::\\((.+?)\\)(\\(([^)]+?)\\))?\\s*$/\r\n );\r\n if (m) {\r\n return [m[1], m[3] || null];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // Tests that a node is a paragraph, has 1 child, that child's value is \"::\"\r\n function nodeEndsSection(node: any) {\r\n return (\r\n node.type === \"paragraph\" &&\r\n node.children &&\r\n node.children.length === 1 &&\r\n node.children[0].value &&\r\n node.children[0].value.trim() === \"::\"\r\n );\r\n }\r\n\r\n interface collapsibleTransformContext {\r\n currentHeader: string | null;\r\n currentReferenceUrl: string | null;\r\n allHeaders: any[];\r\n headerBuffer: any[];\r\n nodesToRemove: any[];\r\n }\r\n\r\n function endSection(endingNode: any, ctx: collapsibleTransformContext) {\r\n ctx.allHeaders.push({\r\n headerText: ctx.currentHeader,\r\n referenceUrl: ctx.currentReferenceUrl,\r\n nodes: ctx.headerBuffer,\r\n });\r\n\r\n if (endingNode != null) {\r\n ctx.nodesToRemove.push(endingNode);\r\n }\r\n\r\n ctx.currentHeader = null;\r\n ctx.headerBuffer = [];\r\n }\r\n\r\n function transformer(tree: any) {\r\n var ctx: collapsibleTransformContext = {\r\n currentHeader: null,\r\n currentReferenceUrl: null,\r\n allHeaders: [],\r\n headerBuffer: [],\r\n nodesToRemove: [],\r\n };\r\n\r\n tree.children.forEach((node: any) => {\r\n if (ctx.currentHeader != null && nodeEndsSection(node)) {\r\n // End an existing collapsible section when we hit a ::\r\n endSection(node, ctx);\r\n } else {\r\n // Start an existing section when we hit a ::(SECTION NAME)\r\n var newSectionInfo = nodeStartsSection(node);\r\n if (newSectionInfo != null) {\r\n var [newSectionName, newSectionReferenceUrl] =\r\n newSectionInfo;\r\n\r\n if (ctx.currentHeader != null) {\r\n endSection(null, ctx);\r\n }\r\n ctx.currentHeader = newSectionName;\r\n ctx.currentReferenceUrl = newSectionReferenceUrl;\r\n ctx.headerBuffer.push(node);\r\n } else if (ctx.currentHeader != null) {\r\n // Otherwise, continue processing if we're in a collapsible section\r\n ctx.headerBuffer.push(node);\r\n }\r\n }\r\n });\r\n\r\n tree.children = tree.children.filter(\r\n (n: any) => !ctx.nodesToRemove.includes(n)\r\n );\r\n\r\n // Once we have a set of collapsible sections, modify the tree\r\n ctx.allHeaders.forEach((x) => {\r\n var nodesToMove = x.nodes.slice(1, x.nodes.length);\r\n tree.children = tree.children.filter(\r\n (n: any) => !nodesToMove.includes(n)\r\n );\r\n\r\n var replaceNode = x.nodes[0];\r\n replaceNode.type = \"collapsibleSection\";\r\n replaceNode.value = x.headerText;\r\n replaceNode.children = nodesToMove;\r\n replaceNode.referenceUrl = x.referenceUrl;\r\n replaceNode.position.end = {\r\n column: nodesToMove[nodesToMove.length - 1].position.end.column,\r\n line: nodesToMove[nodesToMove.length - 1].position.end.line,\r\n offset: nodesToMove[nodesToMove.length - 1].position.end.offset,\r\n };\r\n });\r\n\r\n return tree;\r\n }\r\n\r\n return transformer;\r\n}\r\n\r\ninterface ContentMarkdownProps {\r\n /**\r\n * The markdown content to be shown.\r\n */\r\n source: string;\r\n\r\n /**\r\n * The CSS class used to format the text block. This is applied alongside .markdown-content\r\n */\r\n className?: string | undefined;\r\n\r\n /**\r\n * If true, render the block of text as inline.\r\n *\r\n * Applies the .markdown-inline CSS class and uses the InlineParagraphRenderer for paragraphs.\r\n */\r\n inline?: boolean | undefined;\r\n\r\n /**\r\n * A list of terms that should be highlighted in the text.\r\n */\r\n highlightedTerms?: string[] | null | undefined;\r\n\r\n /**\r\n * An anchor to scroll to after displaying the text.\r\n */\r\n scrollTo?: string | null | undefined;\r\n\r\n /**\r\n * If true, collapses all collapsible sections after displaying the text.\r\n */\r\n collapseSectionsByDefault?: boolean | undefined;\r\n}\r\n\r\nexport default function ContentMarkdown(props: ContentMarkdownProps) {\r\n const [lastContent, setLastContent] = useState(null);\r\n const [lastHash, setLastHash] = useState(null);\r\n\r\n // Detect state changes\r\n var changedAnchor = false;\r\n if ((props.scrollTo || null) !== lastHash) {\r\n changedAnchor = true;\r\n }\r\n var changedContent = false;\r\n if ((props.source || null) !== lastContent) {\r\n setLastContent(props.source || null);\r\n changedContent = true;\r\n }\r\n\r\n // Function to modify content\r\n const scrollToAnchor = (anchor: string | null) => {\r\n if (anchor != null) {\r\n var element = document.querySelector(`a[name='${anchor}']`);\r\n if (element) {\r\n element.scrollIntoView();\r\n setLastHash(anchor);\r\n return;\r\n }\r\n }\r\n\r\n if (lastHash) setLastHash(null);\r\n };\r\n\r\n // Apply scroll\r\n if (changedAnchor || changedContent) scrollToAnchor(props.scrollTo || null);\r\n\r\n // Collect renderers\r\n var ddhRenderers: any = {};\r\n ddhRenderers.link = LinkRenderer;\r\n ddhRenderers.collapsibleSection = props.collapseSectionsByDefault\r\n ? CollapsibleSectionRendererCollapsed\r\n : CollapsibleSectionRendererExpanded;\r\n ddhRenderers.table = TableRenderer;\r\n ddhRenderers.tableRow = TableRowRenderer;\r\n if (props.highlightedTerms) {\r\n ddhRenderers.text = (p: any) =>\r\n TextRenderer(p, props.highlightedTerms || null);\r\n }\r\n if (props.inline === true) ddhRenderers.paragraph = InlineParagraphRenderer;\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nfunction TestingRenderer(props: any, typeName: string) {\r\n console.log(typeName);\r\n console.log(props);\r\n return `[Replaced and logged ${typeName}]`;\r\n}\r\n\r\nvar tableAltRow = true;\r\nfunction TableRenderer(props: any) {\r\n tableAltRow = true;\r\n return {props.children}
;\r\n}\r\n\r\nfunction TableRowRenderer(props: any) {\r\n var alt = tableAltRow;\r\n tableAltRow = !tableAltRow;\r\n if (alt) {\r\n return {props.children};\r\n } else {\r\n return {props.children};\r\n }\r\n}\r\n\r\nconst defaultTextRenderer: any = renderers.text;\r\n\r\nfunction createHighlight(\r\n word: string,\r\n textToHighlightLower: string,\r\n index: number\r\n) {\r\n return {\r\n word: word,\r\n index: textToHighlightLower.indexOf(word.toLowerCase(), index),\r\n };\r\n}\r\n\r\n// Whole word search for highlighting renderer\r\nfunction findChunksWholeWords(obj: any) {\r\n const searchWords: string[] = obj.searchWords;\r\n const textToHighlight: string = obj.textToHighlight;\r\n\r\n var results: any = [];\r\n var idx = 0;\r\n var lastIdx = 0;\r\n var textToHighlightLower = textToHighlight.toLowerCase();\r\n while (idx < textToHighlight.length) {\r\n let idxTmp = idx;\r\n var matches = searchWords\r\n .map((x) => createHighlight(x, textToHighlightLower, idxTmp))\r\n .filter((x) => x.index > -1);\r\n if (matches.length === 0) break;\r\n\r\n matches = matches.sort((a, b) => (a.index < b.index ? -1 : 1));\r\n var m = matches[0];\r\n if (m.index + m.word.length === idx) {\r\n break;\r\n }\r\n idx = m.index + m.word.length;\r\n if (textToHighlight.length <= idx) break;\r\n\r\n if (textToHighlight[idx].match(/[\\s\\n-]/)) {\r\n results.push({\r\n start: m.index,\r\n end: m.index + m.word.length,\r\n });\r\n }\r\n\r\n if (idx === lastIdx) break;\r\n lastIdx = idx;\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction TextRenderer(props: any, searchTerms: string[] | null) {\r\n if (props.children && searchTerms && searchTerms.length > 0) {\r\n return (\r\n \r\n );\r\n } else {\r\n return defaultTextRenderer(props);\r\n }\r\n}\r\n\r\nfunction CollapsibleSectionRenderer(props: any, collapseByDefault: boolean) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction CollapsibleSectionRendererCollapsed(props: any) {\r\n return CollapsibleSectionRenderer(props, true);\r\n}\r\n\r\nfunction CollapsibleSectionRendererExpanded(props: any) {\r\n return CollapsibleSectionRenderer(props, false);\r\n}\r\n\r\nfunction InlineParagraphRenderer(props: any) {\r\n return <>{props.children};\r\n}\r\n\r\nfunction LinkRenderer(props: any) {\r\n const newWindow =\r\n isExternalLink(props.href) ||\r\n isDocumentLink(props.href) ||\r\n linkShouldOpenInNewWindow(props.href);\r\n const cssClass = getLinkStyle(props.href) || \"\";\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n","import React, { useCallback, useContext, useState } from \"react\";\r\nimport { IconLocator } from \"./IconRenderer\";\r\n\r\nexport interface DDHPageState {\r\n pageTitle: string;\r\n titleBar: string;\r\n icon: IconLocator | null;\r\n setPageTitle: (\r\n title: string,\r\n titleBar?: string | null,\r\n icon?: IconLocator | null\r\n ) => void;\r\n}\r\n\r\nexport const DDHPageContext = React.createContext({\r\n pageTitle: \"\",\r\n titleBar: \"\",\r\n icon: null,\r\n setPageTitle: (\r\n headerTitle: string,\r\n titleBar?: string | null,\r\n icon?: IconLocator | null\r\n ) => {},\r\n});\r\n\r\nexport function DDHPageContextProvider(props: any) {\r\n const [pageState, setPageState] = useState<\r\n Omit\r\n >({\r\n pageTitle: \"\",\r\n titleBar: \"\",\r\n icon: null,\r\n });\r\n\r\n const setPageTitle = useCallback(\r\n (\r\n titleUpdate: string,\r\n titleBarUpdate?: string | null,\r\n iconUpdate?: IconLocator | null\r\n ) => {\r\n setPageState({\r\n pageTitle: titleUpdate,\r\n titleBar: titleBarUpdate ?? \"\",\r\n icon: iconUpdate ?? null,\r\n });\r\n },\r\n []\r\n );\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nexport function useDDHPageContext() {\r\n return useContext(DDHPageContext);\r\n}\r\n","import React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport default function Loading() {\r\n const { t } = useTranslation();\r\n return (\r\n
\r\n {t(\"Loading\")}...\r\n
\r\n \"Loading...\"\r\n
\r\n
\r\n );\r\n}\r\n","import React, { ReactNode, useState } from \"react\";\r\nimport { Collapse, Row } from \"reactstrap\";\r\nimport { getCollapseIcon } from \"../ddh-styles\";\r\nimport HelpTooltip from \"./HelpTooltip\";\r\nimport { sanitizeHtmlId } from \"../util\";\r\nimport { IconLocator, RenderIcon, IconType } from \"./IconRenderer\";\r\nimport { faFileAlt } from \"@fortawesome/free-regular-svg-icons\";\r\nimport {\r\n getGlobalCollapsedState,\r\n setGlobalCollapsedState,\r\n} from \"../datatypes/CollapsedState\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\ninterface CollapsibleSectionProps {\r\n /**\r\n * The content that will be shown in the header of the section\r\n */\r\n headerTitle: string | ReactNode;\r\n\r\n /**\r\n * The contents of the section\r\n */\r\n children: ReactNode | ReactNode[];\r\n\r\n /**\r\n * The text of the help tooltip that will be shown to the right of the section header\r\n */\r\n tooltip?: string | null | undefined;\r\n\r\n /**\r\n * The icon for the section that will be shown to the left of the section header\r\n */\r\n sectionIcon?: IconLocator | null;\r\n\r\n /**\r\n * Determines whether the section is collapsed by default\r\n */\r\n defaultCollapsed: boolean;\r\n\r\n /**\r\n * The CSS classes for the header text. The default is \"h3\".\r\n */\r\n linkClassName?: string | null | undefined;\r\n\r\n /**\r\n * The CSS classes for the Row that contains the entire header. The default is \"section-header\".\r\n */\r\n rowClassName?: string | null | undefined;\r\n\r\n /**\r\n * The document reference that will be shown as a \"page\" icon to the right of the section header.\r\n */\r\n referenceLink?: string | null | undefined;\r\n\r\n /**\r\n * A unique identifier for this section. This is used to tell React when a section has updated\r\n * and to identify collapsed state if rememberCollapsedState is true.\r\n */\r\n sectionKey?: string;\r\n\r\n /**\r\n * If true, RAINS will track the collapsed state of this header and remember it if the user navigates back.\r\n *\r\n * See ../data/CollapsedState.ts for this logic.\r\n */\r\n rememberCollapsedState?: boolean | undefined;\r\n}\r\n\r\n// Renders the document reference, if one was specified for this section\r\nexport function Reference({ url }: { url?: string | null }) {\r\n const { t } = useTranslation();\r\n if (!url) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\n// Renders the icon associated with this section, if one was specified\r\nexport function SectionIcon({ icon }: { icon: IconLocator | null }) {\r\n if (!icon) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n// Renders the help tooltip associated with this section, if one was specified\r\nexport interface ToolTipProps {\r\n sectionKey?: string;\r\n text?: string | null;\r\n}\r\n\r\nexport function ToolTip(props: ToolTipProps) {\r\n const { text, sectionKey } = props;\r\n\r\n if (!(text && sectionKey)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n// Creates a unique ID for tracking collased state based on the current URL + the content\r\nfunction getUniqueGroupId(src: string | ReactNode): string | null {\r\n if (typeof src == \"string\") return `${window.location.pathname}_${src}`;\r\n return null;\r\n}\r\n\r\nexport default function CollapsibleSection(props: CollapsibleSectionProps) {\r\n const { t } = useTranslation();\r\n const {\r\n headerTitle,\r\n children,\r\n defaultCollapsed,\r\n tooltip,\r\n sectionKey,\r\n referenceLink,\r\n } = props;\r\n\r\n // Default to rememberCollapsedState = true\r\n var rememberCollapsedState = props.rememberCollapsedState;\r\n if (rememberCollapsedState === undefined) rememberCollapsedState = true;\r\n\r\n // Create a unique key for this section if rememberCollapsedState = true\r\n const groupId = rememberCollapsedState\r\n ? sectionKey || getUniqueGroupId(headerTitle)\r\n : null;\r\n\r\n // Use the groupId to get the saved collapsed state\r\n const globalCollapsed = rememberCollapsedState\r\n ? getGlobalCollapsedState(groupId)\r\n : null;\r\n\r\n // If saved collapsed state is set, use that; otherwise, use the default\r\n const globalOrDefaultCollapsed =\r\n globalCollapsed != null ? globalCollapsed : defaultCollapsed;\r\n\r\n // Track the collapsed state and the current section ID\r\n const [collapsed, setCollapsed] = useState(\r\n globalOrDefaultCollapsed\r\n );\r\n const [currentSectionKey, setCurrentSectionKey] =\r\n useState(sectionKey);\r\n\r\n if (\r\n sectionKey &&\r\n sectionKey !== currentSectionKey &&\r\n collapsed !== globalOrDefaultCollapsed\r\n ) {\r\n setCurrentSectionKey(sectionKey);\r\n setCollapsed(defaultCollapsed);\r\n }\r\n\r\n const toggleContainer = function (e: any) {\r\n e.preventDefault();\r\n setGlobalCollapsedState(groupId, !collapsed);\r\n setCollapsed(!collapsed);\r\n return false;\r\n };\r\n\r\n const rowClassName = props.rowClassName || \"section-header\";\r\n const innerClassName = props.linkClassName || \"h3\";\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n {getCollapseIcon(!collapsed)}\r\n \r\n
\r\n
\r\n \r\n \r\n {headerTitle}\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n","import React, { useCallback, useState } from \"react\";\r\nimport { RenderIcon, IconType } from \"./IconRenderer\";\r\nimport { Tooltip } from \"reactstrap\";\r\nimport { Placement } from \"popper.js\";\r\nimport { faQuestionCircle } from \"@fortawesome/free-regular-svg-icons\";\r\n\r\ninterface HelpTooltipProps {\r\n /**\r\n * A unique ID for the tooltip. Used to tie the button to the tooltip control.\r\n */\r\n id: string;\r\n /**\r\n * The text of the tooltip\r\n */\r\n tooltip: string;\r\n /**\r\n * Passed to the bootstrap tooltip's placement\r\n */\r\n placement?: Placement | undefined;\r\n}\r\n\r\n/**\r\n * Wrapper around boostrap's tooltip, which creates both the link and the tooltip.\r\n * @param props\r\n */\r\nexport default function HelpTooltip(props: HelpTooltipProps) {\r\n const { tooltip, placement, id } = props;\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const toggleTooltip = useCallback(() => setIsOpen((prev) => !prev), []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {tooltip}\r\n \r\n \r\n );\r\n}\r\n","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport interface LinkProps {\r\n /**\r\n * The URL of the link.\r\n */\r\n href: string;\r\n\r\n /**\r\n * A unique ID for the link.\r\n */\r\n contentKey?: string | number | undefined;\r\n\r\n /**\r\n * If true, the link should open in a new window.\r\n */\r\n newWindow?: boolean | undefined;\r\n\r\n /**\r\n * The CSS class of the link\r\n */\r\n className?: string | undefined;\r\n\r\n /**\r\n * The event that should trigger when the user clicks the link.\r\n *\r\n * This can be combined with both href and links.\r\n */\r\n onClick?: () => void | undefined;\r\n\r\n /**\r\n * The content of the link.\r\n */\r\n children: any;\r\n}\r\n\r\n/**\r\n * Tests whether a URL represents an external link, if it has a full URL starting with \"http://\" or \"https://\"\"\r\n * @param url\r\n */\r\nexport function isExternalLink(url: string) {\r\n return url.match(/^(https?:)?\\/\\//) !== null;\r\n}\r\n\r\n/**\r\n * Tests whether a URL is a link to a PDF that will be opened in browser.\r\n * @param url\r\n */\r\nexport function isDocumentLink(url: string) {\r\n return url.match(/\\.pdf$/) !== null;\r\n}\r\n\r\n/**\r\n * Tests whether a URL is a link we open in a new window by default.\r\n *\r\n * Currently, this is only glossary links, which have IDs starting with \"glossary-\"\r\n * @param url\r\n */\r\nexport function linkShouldOpenInNewWindow(url: string) {\r\n return url.match(/\\/page\\/glossary-/) !== null;\r\n}\r\n\r\n/**\r\n * Builds a link that:\r\n * - Uses\r\n * @param props\r\n */\r\nexport function ContentLink(props: LinkProps) {\r\n const { href, contentKey, newWindow, className, children, onClick } = props;\r\n const { t } = useTranslation();\r\n\r\n // Force using ... if the file is a document\r\n // Otherwise use the propery that was provided\r\n var useAHref = newWindow || isDocumentLink(href);\r\n\r\n if (useAHref) {\r\n if (newWindow)\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n else\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n}\r\n","import { v4 as uuid } from \"uuid\";\r\n\r\n// Amount of time a version hash should be active (30 minutes x 60 seconds)\r\nconst verHashExpirationInSeconds = 30 * 60;\r\n\r\n// The current version hash\r\nvar verHash: string | null = null;\r\n\r\n// The Date.now() value when the version hash will expire.\r\nvar verHashExpire: number | null = null;\r\n\r\n/**\r\n * Retrieves a unique hash that can be used to ensure web requests are not cached.\r\n * If the hash has expired (30 minutes after first use), then it will be recreated;\r\n * otherwise, the current version hash will be returned.\r\n */\r\nfunction getVersionHash() {\r\n if (verHashExpire === null || Date.now() > verHashExpire) {\r\n verHash = encodeURIComponent(uuid());\r\n verHashExpire = Date.now() + verHashExpirationInSeconds * 1000;\r\n }\r\n return verHash;\r\n}\r\n\r\n/**\r\n * Executes a web request for the given URL. Appends a \"ver\" parameter to the URL with\r\n * a version hash that changes every 30 minutes, ensuring files don't get cached.\r\n * @param filename The URL of the request.\r\n */\r\nexport function fetchServerUrl(filename: string) {\r\n var hash = getVersionHash();\r\n var url = `${filename}${filename.includes(\"?\") ? \"&\" : \"?\"}ver=${hash}`;\r\n return fetch(url);\r\n}\r\n\r\n/**\r\n * Returns the unique values from the given array.\r\n * @param values An array of values\r\n */\r\nexport function distinct(values: T[]): T[] {\r\n return values.filter((value, idx) => values.indexOf(value) === idx);\r\n}\r\n\r\n/**\r\n * A comparison function for sorting a list in ascending order\r\n * @param us The first item for comparison\r\n * @param them The second item for comparison\r\n */\r\nexport function compareForSort(us: T, them: T): number {\r\n return us === them ? 0 : us < them ? -1 : 1;\r\n}\r\n\r\n/**\r\n * A comparison function for sorting a list in descending order\r\n * @param us The first item for comparison\r\n * @param them The second item for comparison\r\n */\r\nexport function reverseCompareForSort(us: T, them: T): number {\r\n return -compareForSort(us, them);\r\n}\r\n\r\n/**\r\n * Returns a valid HTML ID based on the given string. Replaces whitespace characters\r\n * and all characters other than A-Z, 0-9, and underscores with '-'.\r\n * @param text Text to be sanitized for use as an HTML ID\r\n */\r\nexport function sanitizeHtmlId(text: string): string {\r\n return text.replace(/\\s/g, \"-\").replace(/[^_a-zA-Z0-9]/g, \"-\");\r\n}\r\n\r\n/**\r\n * Sorts a list by comparing a particular value from each item in the list (either a\r\n * member of each object, or a value calculated from each list element.)\r\n * @param list The list to sort.\r\n * @param valueFunc A function that returns a value that will be used to sort the list.\r\n */\r\nexport function sortByMember(\r\n list: TObj[],\r\n valueFunc: (obj: TObj) => any | ((obj: TObj) => any)[]\r\n): TObj[] {\r\n list.sort((us, them) => {\r\n var usValue = valueFunc(us);\r\n var themValue = valueFunc(them);\r\n\r\n if (usValue instanceof Array && themValue instanceof Array) {\r\n for (var i = 0; i < usValue.length; i++) {\r\n var cmp = compareForSort(usValue[i], themValue[i]);\r\n if (cmp !== 0) return cmp;\r\n }\r\n return 0;\r\n } else {\r\n return compareForSort(usValue, themValue);\r\n }\r\n });\r\n return list;\r\n}\r\n\r\n/**\r\n * Sorts a list in reverse order by comparing a particular value from each item in the\r\n * list (either a member of each object, or a value calculated from each list element.)\r\n * @param list The list to sort.\r\n * @param valueFunc A function that returns a value that will be used to sort the list.\r\n */\r\nexport function reverseSortByMember(\r\n list: TObj[],\r\n valueFunc: (obj: TObj) => any | ((obj: TObj) => any)[]\r\n): TObj[] {\r\n list.sort((us, them) => {\r\n var usValue = valueFunc(us);\r\n var themValue = valueFunc(them);\r\n\r\n if (usValue instanceof Array && themValue instanceof Array) {\r\n for (var i = 0; i < usValue.length; i++) {\r\n var cmp = reverseCompareForSort(usValue[i], themValue[i]);\r\n if (cmp !== 0) return cmp;\r\n }\r\n return 0;\r\n } else {\r\n return reverseCompareForSort(usValue, themValue);\r\n }\r\n });\r\n\r\n return list;\r\n}\r\n\r\n/**\r\n * Capitalizes the first word in a string.\r\n * @param txt The text to capitalize\r\n */\r\nexport function capitalize(txt: string | null): string | null {\r\n if (!txt) return null;\r\n if (txt.length === 0) return \"\";\r\n return txt[0].toUpperCase() + txt.slice(1);\r\n}\r\n\r\n/**\r\n * Capitalizes the first word in a string, as long as that word doesn't have any other capital letters\r\n * @param text The text to capitalize\r\n */\r\nexport function capitalizeFirstWord(text: string) {\r\n if (!text) return null;\r\n if (text.length === 0) return \"\";\r\n\r\n var words = text.split(/\\s+/);\r\n if (words[0].match(/^[^A-Z]+$/)) return capitalize(text);\r\n\r\n return text;\r\n}\r\n\r\n/**\r\n * Prepares a string from a URI for use by URL decoding its value.\r\n * @param text A string from a URI\r\n */\r\nexport function prepareUriString(text: string) {\r\n return decodeURIComponent(text.trim());\r\n}\r\n\r\n/**\r\n * Parses a query string from a URI into a dictionary, URL decoding both parameter\r\n * names and values. Assumes that each query string parameter name is unique.\r\n * @param queryString A query string from a URI\r\n */\r\nexport function parseQueryString(queryString: string): {\r\n [key: string]: string;\r\n} {\r\n var result: { [key: string]: string } = {};\r\n\r\n if (queryString) {\r\n queryString = queryString.substring(1);\r\n queryString.split(\"&\").forEach((param) => {\r\n var parts = param.split(\"=\");\r\n if (parts && parts.length === 2) {\r\n result[prepareUriString(parts[0])] = prepareUriString(parts[1]);\r\n } else {\r\n console.error(\r\n `Could not parse query string parameter '${param}' into key/value`\r\n );\r\n }\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function arraysEqual(a: T[] | null, b: T[] | null) {\r\n if (a === null && b === null) return true;\r\n else if (a === null || b === null) return false;\r\n return (\r\n a.filter((x) => !b.includes(x)).length === 0 &&\r\n b.filter((x) => !a.includes(x)).length === 0\r\n );\r\n}\r\n\r\n/**\r\n * Returns the intersection of two lists.\r\n *\r\n * Primarily used for comparing libraries, where \"null\" indicates all libraries match.\r\n * If one list is null, all values from the other list are returned. If both lists are\r\n * null, null is returned.\r\n * @param a A list of values, or null.\r\n * @param b A list of values, or null.\r\n */\r\nexport function intersection(a: T[] | null, b: T[] | null): T[] | null {\r\n if (a === null && b === null) return null;\r\n if (a === null) return b;\r\n if (b === null) return a;\r\n return a.filter((x) => b.includes(x));\r\n}\r\n\r\n/**\r\n * Returns true if any members of two lists are the same.\r\n *\r\n * Primarily used for comparing libraries, where \"null\" indicates all libraries match.\r\n * If one or both lists are null, then true is always returned.\r\n * @param a A list of values, or null.\r\n * @param b A list of values, or null.\r\n */\r\nexport function intersects(a: T[] | null, b: T[] | null): boolean {\r\n if (a === null || b === null) return true;\r\n return a.filter((x) => b.includes(x)).length > 0;\r\n}\r\n\r\n/**\r\n * Filters the array to only objects that match a type definition. Casts the array to that type definition.\r\n * @param lst\r\n */\r\nexport function ofType(lst: any[]): TFiltered[] {\r\n return lst.filter((o) => (o as TFiltered) !== null) as TFiltered[];\r\n}\r\n\r\n/**\r\n * Flattens a list of lists of libraries, returning only unique values.\r\n *\r\n * Because library filtering uses \"null\" to represent a match on any library,\r\n * returns null if any value in the top list is null.\r\n */\r\nexport function flattenLibraryList(lst: (string[] | null)[]): string[] | null {\r\n if (lst.filter((l) => l === null).length > 0) return null;\r\n\r\n return distinct((lst.filter((l) => l !== null) as string[][]).flat());\r\n}\r\n\r\n/**\r\n * Returns true if any casing of the value is included in the list.\r\n *\r\n * This test works by calling toLowerCase on all values before comparing the result.\r\n * @param lst A list of strings.\r\n * @param value A value to search for within the list.\r\n */\r\nexport function caseInsensitiveIncludes(lst: string[], value: string): boolean {\r\n var valueLower = value.toLowerCase();\r\n return lst.filter((x) => x.toLowerCase() === valueLower).length > 0;\r\n}\r\n\r\nexport function sum(values: number[]) {\r\n var result = 0;\r\n values.forEach((val) => (result += val));\r\n return result;\r\n}\r\nexport function escapeRegExp(str: string) {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\r\n}\r\n\r\n// Amount of time a stats key should be active (60 seconds x 60 minutes x 24 hours)\r\nconst statsKeyExpirationInSeconds = 60 * 60 * 24;\r\n\r\n// The current search stats key\r\nvar statsKey: string | null = null;\r\n\r\nexport function storageAvailable() {\r\n var storage = window.localStorage;\r\n try {\r\n var x = \"__storage_test__\";\r\n storage.setItem(x, x);\r\n storage.removeItem(x);\r\n return true;\r\n } catch (e) {\r\n return (\r\n e instanceof DOMException &&\r\n // everything except Firefox\r\n (e.code === 22 ||\r\n // Firefox\r\n e.code === 1014 ||\r\n // test name field too, because code might not be present\r\n // everything except Firefox\r\n e.name === \"QuotaExceededError\" ||\r\n // Firefox\r\n e.name === \"NS_ERROR_DOM_QUOTA_REACHED\") &&\r\n // acknowledge QuotaExceededError only if there's something already stored\r\n storage &&\r\n storage.length !== 0\r\n );\r\n }\r\n}\r\n\r\nconst DDH_STATS_KEY = \"DDH Stats Key\";\r\n\r\n// Function to get the stats key from local storage or the current session\r\nexport function getStatsKey() {\r\n if (statsKey == null) {\r\n if (storageAvailable()) {\r\n var tmpKey = localStorage.getItem(DDH_STATS_KEY);\r\n if (tmpKey) {\r\n const [statsKeyTmp, datePart] = tmpKey.split(\"||\");\r\n if (\r\n parseInt(datePart) + statsKeyExpirationInSeconds >=\r\n Date.now()\r\n ) {\r\n statsKey = uuid();\r\n localStorage.setItem(\r\n DDH_STATS_KEY,\r\n `${statsKey}||${Date.now()}`\r\n );\r\n } else {\r\n statsKey = statsKeyTmp;\r\n }\r\n } else {\r\n statsKey = uuid();\r\n }\r\n localStorage.setItem(DDH_STATS_KEY, `${statsKey}||${Date.now()}`);\r\n } else {\r\n statsKey = uuid();\r\n }\r\n }\r\n return statsKey!;\r\n}\r\n","import { IconProp } from \"@fortawesome/fontawesome-svg-core\";\r\nimport {\r\n faAddressCard,\r\n faBook,\r\n faClipboardCheck,\r\n faEnvelopeOpenText,\r\n faFileAlt,\r\n faHome,\r\n faIndustry,\r\n faLink,\r\n faQuestion,\r\n faSearch,\r\n faTasks,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { IconType } from \"../components/IconRenderer\";\r\n\r\nexport interface NavigationItem {\r\n translationKey: string;\r\n url: string;\r\n iconType: IconType;\r\n iconId: string | IconProp;\r\n}\r\n\r\nexport const navigationItems: NavigationItem[] = [\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faHome,\r\n translationKey: \"HomePage\",\r\n url: \"/\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faClipboardCheck,\r\n translationKey: \"ApplicableSafeguardsAgreements\",\r\n url: \"/page/applicable-safeguards-agreements\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faIndustry,\r\n translationKey: \"ApplicationSpecificGuidance\",\r\n url: \"/page/browse-by-industry\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faQuestion,\r\n translationKey: \"BrowseQuestions\",\r\n url: \"/page/browse-questions\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faSearch,\r\n translationKey: \"RequirementsSearch\",\r\n url: \"/requirements-search\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faBook,\r\n translationKey: \"Glossary\",\r\n url: \"/glossary\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faFileAlt,\r\n translationKey: \"TOCDocuments\",\r\n url: \"/safeguards-documents\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faTasks,\r\n translationKey: \"TOCRequirements\",\r\n url: \"/safeguards-requirements\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faLink,\r\n translationKey: \"OtherResources\",\r\n url: \"/page/other-resources\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faEnvelopeOpenText,\r\n translationKey: \"Feedback\",\r\n url: \"/feedback\",\r\n },\r\n {\r\n iconType: IconType.FontAwesome,\r\n iconId: faAddressCard,\r\n translationKey: \"Contact\",\r\n url: \"/contact\",\r\n },\r\n];\r\n","import React from \"react\";\r\nimport {\r\n UncontrolledDropdown,\r\n DropdownToggle,\r\n DropdownMenu,\r\n DropdownItem,\r\n Input,\r\n} from \"reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { availableLanguages } from \"../ddh-translations\";\r\n\r\nexport function LanguageChooser() {\r\n const { i18n, t } = useTranslation();\r\n\r\n const currentLanguageName =\r\n availableLanguages.find((l) => l.abbreviation === i18n.language)\r\n ?.name ?? t(\"ChangeLanguage\");\r\n\r\n return (\r\n \r\n \r\n \r\n 🌐\r\n {\" \"}\r\n {currentLanguageName}\r\n \r\n \r\n {availableLanguages.map(({ name, abbreviation }) => (\r\n i18n.changeLanguage(abbreviation)}\r\n tag=\"li\"\r\n >\r\n
\r\n \r\n \r\n
\r\n \r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n","import { faBars, faExclamationCircle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport Button from \"reactstrap/lib/Button\";\r\nimport Col from \"reactstrap/lib/Col\";\r\nimport Row from \"reactstrap/lib/Row\";\r\nimport { navigationItems } from \"../datatypes/Navigation\";\r\nimport { ContentLink } from \"./ContentLink\";\r\nimport ContentMarkdown from \"./ContentMarkdown\";\r\nimport { IconLocator, IconType, RenderIcon } from \"./IconRenderer\";\r\nimport { LanguageChooser } from \"./LanguageChooser\";\r\n\r\ninterface NavBarProps {\r\n /**\r\n * The title of the page to show in the nav bar\r\n */\r\n pageTitle: string;\r\n\r\n /**\r\n * The icon to be shown at the left of the title\r\n */\r\n icon: IconLocator | null;\r\n}\r\n\r\n/**\r\n * Renders the navbar icon if one was specified\r\n * @param icon\r\n */\r\nfunction Icon(props: { icon: IconLocator | null }) {\r\n const { icon } = props;\r\n\r\n if (!icon) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n/**\r\n * Renders the nav bar, including:\r\n * - \"Skip to main\" content link (for accessibility requirements)\r\n * - Page icon and title (if specified)\r\n * - \"Disclaimer\" dropdown button\r\n * - Dropdown menu for narrow screens\r\n * @param props\r\n */\r\nexport default function NavBar(props: NavBarProps) {\r\n const { t } = useTranslation();\r\n console.log(`Rendering with title \"${props.pageTitle}\"`);\r\n\r\n return (\r\n <>\r\n \r\n Skip to main content\r\n \r\n \r\n \r\n {props.pageTitle}\r\n \r\n
    \r\n
  • \r\n \r\n \r\n \r\n {t(\"DisclaimerLabel\")}\r\n \r\n \r\n \r\n \r\n \r\n
  • \r\n
  • \r\n \r\n \r\n {t(\"Menu\")}\r\n \r\n \r\n {navigationItems.map((nav) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t(nav.translationKey)}\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
  • \r\n\r\n
  • \r\n \r\n
  • \r\n
\r\n \r\n \r\n );\r\n}\r\n","import { UAParser } from \"ua-parser-js\";\r\nimport { storageAvailable } from \"../util\";\r\n\r\n// Logic for mobile title screen, which is shown in place of the home page:\r\n// - If the device is mobile or tablet\r\n// - If the user hasn't viewed another page\r\n// - Clear this state if the user clicks the link in the header\r\n\r\n// Trigger mobile home page if:\r\n// - Path is \"/\"\r\n// - Browser is mobile or tablet\r\n// - The user hasn't viewed the home page before\r\n// - The user hasn't navigated away from the home page\r\n\r\n/**\r\n * Should be called in App whenever the page changes. Stores whether the user has navigated away from the home page.\r\n *\r\n * Returns true if the current page is the home page, the browser is a phone or tablet, and the user has not navigated away from the home page (or the state has been cleared).\r\n */\r\nexport function showMobileTitle() {\r\n var isHomePage = window.location.pathname === \"/\";\r\n storeMobileTitleState(isHomePage);\r\n return isHomePage && isMobile() && shouldShowMobileTitle();\r\n}\r\n\r\n/**\r\n * Reset the mobile title state, returning the user to the mobile home page.\r\n *\r\n * Returns true if the browser is a phone or tablet and the user navigated away from the home page, indicating that the app should force a refresh to the home page.\r\n */\r\nexport function clearMobileTitle() {\r\n if (isMobile() && !shouldShowMobileTitle()) {\r\n clearMobileTitleState();\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function forceStandardHomePage() {\r\n if (isMobile() && shouldShowMobileTitle()) {\r\n storeMobileTitleState(false);\r\n }\r\n}\r\n\r\nconst VIEWED_OTHER_PAGE = \"DDH Viewed Other Page\";\r\nvar hasViewedOtherPage = false;\r\nfunction storeMobileTitleState(isHomePage: boolean) {\r\n if (isHomePage) return;\r\n\r\n if (storageAvailable()) {\r\n localStorage.setItem(VIEWED_OTHER_PAGE, \"true\");\r\n } else {\r\n hasViewedOtherPage = false;\r\n }\r\n}\r\n\r\nfunction shouldShowMobileTitle() {\r\n if (storageAvailable()) {\r\n return localStorage.getItem(VIEWED_OTHER_PAGE) === null;\r\n } else {\r\n return hasViewedOtherPage;\r\n }\r\n}\r\n\r\nfunction clearMobileTitleState() {\r\n if (storageAvailable()) {\r\n localStorage.removeItem(VIEWED_OTHER_PAGE);\r\n } else {\r\n hasViewedOtherPage = false;\r\n }\r\n}\r\n\r\nvar _isMobile: boolean | null = null;\r\n\r\nfunction isMobile(): boolean {\r\n if (_isMobile === null) {\r\n var device = new UAParser().getDevice();\r\n _isMobile = device.type === \"mobile\" || device.type === \"tablet\";\r\n }\r\n return _isMobile;\r\n}\r\n","import React from \"react\";\r\nimport { NavLink } from \"react-router-dom\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ListGroup, ListGroupItem, Row, Col } from \"reactstrap\";\r\n\r\nimport { RenderIcon } from \"./IconRenderer\";\r\nimport { navigationItems } from \"../datatypes/Navigation\";\r\nimport { forceStandardHomePage } from \"../datatypes/MobileTitle\";\r\n\r\ninterface NavMenuProps {\r\n homePageView?: boolean | undefined;\r\n}\r\n\r\n/**\r\n * Renders the sidebar navigation menu for larger screen sizes.\r\n */\r\nexport default function NavMenu(props: NavMenuProps) {\r\n const { homePageView } = props;\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {navigationItems.map((nav) => (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {t(nav.translationKey)}\r\n
\r\n \r\n ))}\r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nexport function PageFooter() {\r\n const { t } = useTranslation();\r\n return (\r\n
\r\n {t(\"TableOfContents\")}\r\n  | \r\n {t(\"VersionInfo\")}\r\n  | \r\n \r\n {t(\"SecurityPrivacyLabel\")}\r\n \r\n  | \r\n \r\n {t(\"NNSA\")}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ContentLink } from \"./ContentLink\";\r\nimport { clearMobileTitle } from \"../datatypes/MobileTitle\";\r\n\r\ninterface PageHeaderProps {\r\n forceRefresh: () => void;\r\n}\r\n\r\n/**\r\n * Renders the page header, including the RAINS logo, RAINS title, and NNSA logo.\r\n * Handles screen size changes.\r\n */\r\nexport default function PageHeader(props: PageHeaderProps) {\r\n const { forceRefresh } = props;\r\n const { t } = useTranslation();\r\n\r\n const clickHeader = () => {\r\n if (clearMobileTitle()) forceRefresh();\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {t(\"ApplicationAcronym\")}\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n {t(\"ApplicationTitle\")}\r\n \r\n
\r\n

\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\n","import { fetchServerUrl } from \"../util\";\r\nimport { i18n } from \"../ddh-translations\";\r\n\r\n/**\r\n * Defines a node in the table of contents.\r\n */\r\nexport interface DDHTOCNode {\r\n /**\r\n * A unique key, if multiple nodes have children with the same pageId or title\r\n */\r\n key: string | null;\r\n\r\n /**\r\n * The page ID that this links to. If a pageId or url is not provided, this node is not rendered as a link.\r\n */\r\n pageId: string | null;\r\n\r\n /**\r\n * The title of the node.\r\n */\r\n title: string;\r\n\r\n /**\r\n * The URL that this links to. If pageId is provided, url is ignored. If pageId or url is not provided, this node is not rendered as a link.\r\n */\r\n url: string | null;\r\n\r\n /**\r\n * The child nodes under this node. If empty, this node does not expand.\r\n */\r\n children: DDHTOCNode[];\r\n}\r\n\r\n/** Loads table of contents nodes from file */\r\nfunction getErrorNode(): DDHTOCNode[] {\r\n return [\r\n {\r\n key: null,\r\n pageId: null,\r\n title: i18n.t(\"TOCError\"),\r\n url: null,\r\n children: [],\r\n },\r\n ];\r\n}\r\n\r\nexport function getGlossary(locale: string): Promise {\r\n return fetchServerUrl(`/api/toc/glossary?locale=${locale}`)\r\n .then((resp) => resp.json())\r\n .then((result) => result.nodes)\r\n .catch((err) => {\r\n console.error(err);\r\n return getErrorNode();\r\n });\r\n}\r\n\r\nexport function getTableOfContents(locale: string): Promise {\r\n return fetchServerUrl(`/api/toc?locale=${locale}`)\r\n .then((resp) => resp.json())\r\n .then((result) => result.nodes)\r\n .catch((err) => {\r\n console.error(err);\r\n return getErrorNode();\r\n });\r\n}\r\n\r\nexport function getTOCDocuments(locale: string): Promise {\r\n return fetchServerUrl(`/api/toc/documents?locale=${locale}`)\r\n .then((resp) => resp.json())\r\n .then((result) => result.nodes)\r\n .catch((err) => {\r\n console.error(err);\r\n return getErrorNode();\r\n });\r\n}\r\n\r\nexport function getTOCRequirements(locale: string): Promise {\r\n return fetchServerUrl(`/api/toc/requirements?locale=${locale}`)\r\n .then((resp) => resp.json())\r\n .then((result) => result.nodes)\r\n .catch((err) => {\r\n console.error(err);\r\n return getErrorNode();\r\n });\r\n}\r\n","import { useEffect } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nfunction getPageTitle(title: string, subtitle?: string | null) {\r\n if (subtitle) {\r\n return `${subtitle} | ${title}`;\r\n }\r\n return title;\r\n}\r\n\r\nexport function usePageTitle(subtitle?: string | null) {\r\n const { t } = useTranslation();\r\n const appTitle = t(\"ApplicationTitle\");\r\n\r\n useEffect(() => {\r\n var docTitle = getPageTitle(appTitle, subtitle);\r\n\r\n console.log(`Setting document title to \"${docTitle}\"`);\r\n document.title = docTitle;\r\n\r\n return () => {\r\n document.title = getPageTitle(appTitle);\r\n };\r\n }, [appTitle, subtitle]);\r\n}\r\n","import React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport NavMenu from \"../components/NavMenu\";\r\nimport { PageFooter } from \"../components/PageFooter\";\r\n\r\nexport function MobileTitlePage() {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n

\r\n
\r\n {t(\"ApplicationTitle\")}\r\n
\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import { dom, library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport {\r\n faBook,\r\n faClipboardCheck,\r\n faExclamationCircle,\r\n faIndustry,\r\n faLink,\r\n faListAlt,\r\n faQuestion,\r\n faSearch,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\n// JavaScript and CSS\r\nimport \"bootstrap/dist/js/bootstrap.bundle.min.js\";\r\nimport React, { lazy, Suspense, useCallback, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { BrowserRouter, Route, Switch } from \"react-router-dom\";\r\n// Data\r\nimport { DDHPageContext, DDHPageState } from \"./components/DDHPageContext\";\r\nimport { IconLocator } from \"./components/IconRenderer\";\r\n// Components\r\nimport Loading from \"./components/Loading\";\r\nimport NavBar from \"./components/NavBar\";\r\nimport NavMenu from \"./components/NavMenu\";\r\nimport { PageFooter } from \"./components/PageFooter\";\r\nimport PageHeader from \"./components/PageHeader\";\r\nimport { showMobileTitle } from \"./datatypes/MobileTitle\";\r\nimport {\r\n getGlossary,\r\n getTableOfContents,\r\n getTOCDocuments,\r\n getTOCRequirements,\r\n} from \"./datatypes/TableOfContents\";\r\nimport { usePageTitle } from \"./hooks/usePageTitle\";\r\nimport { useRefreshToken } from \"./hooks/useRefreshToken\";\r\nimport { MobileTitlePage } from \"./pagetypes/MobileTitlePage\";\r\n\r\nlibrary.add(\r\n faClipboardCheck,\r\n faIndustry,\r\n faQuestion,\r\n faSearch,\r\n faListAlt,\r\n faLink,\r\n faExclamationCircle\r\n);\r\ndom.watch();\r\n\r\nconst HomePage = lazy(() => import(\"./pagetypes/HomePage\"));\r\nconst TopicPage = lazy(() => import(\"./pagetypes/TopicPage\"));\r\nconst RequirementsSearchPage = lazy(\r\n () => import(\"./pagetypes/RequirementsSearchPage\")\r\n);\r\nconst TableOfContentsPage = lazy(\r\n () => import(\"./pagetypes/TableOfContentsPage\")\r\n);\r\nconst AnswerDisplay = lazy(() => import(\"./pagetypes/AnswerDisplay\"));\r\nconst Version = lazy(() => import(\"./components/Version\"));\r\nconst Feedback = lazy(() => import(\"./pagetypes/Feedback\"));\r\nconst Contact = lazy(() => import(\"./pagetypes/Contact\"));\r\n\r\nexport interface AppProps {}\r\n\r\nexport function App(props: AppProps) {\r\n const { t, i18n } = useTranslation();\r\n const locale = i18n.language;\r\n\r\n const { refresh } = useRefreshToken();\r\n\r\n const [pageState, setPageState] = useState<\r\n Omit\r\n >({\r\n pageTitle: \"\",\r\n titleBar: \"\",\r\n icon: null,\r\n });\r\n\r\n const setPageTitle = useCallback(\r\n (\r\n titleUpdate: string,\r\n titleBarUpdate?: string | null,\r\n iconUpdate?: IconLocator | null\r\n ) => {\r\n setPageState({\r\n pageTitle: titleUpdate,\r\n titleBar: titleBarUpdate ?? \"\",\r\n icon: iconUpdate ?? null,\r\n });\r\n },\r\n []\r\n );\r\n\r\n usePageTitle(pageState.titleBar);\r\n\r\n if (showMobileTitle()) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n <>\r\n refresh()} />\r\n \r\n \r\n
\r\n
\r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n \r\n getTableOfContents(locale)\r\n }\r\n />\r\n )}\r\n />\r\n (\r\n \r\n getGlossary(locale)\r\n }\r\n />\r\n )}\r\n />\r\n (\r\n \r\n getTOCDocuments(locale)\r\n }\r\n />\r\n )}\r\n />\r\n (\r\n \r\n getTOCRequirements(locale)\r\n }\r\n />\r\n )}\r\n />\r\n \r\n \r\n \r\n \r\n
\r\n \r\n

{t(\"Menu\")}

\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","import { useCallback, useState } from \"react\";\r\n\r\nexport function useRefreshToken() {\r\n const [refreshToken, setRefreshToken] = useState(0);\r\n\r\n const refresh = useCallback(() => {\r\n setRefreshToken((p) => p + 1);\r\n }, []);\r\n\r\n return { refreshToken, refresh };\r\n}\r\n","// Polyfill for older browsers\r\nimport \"react-app-polyfill/ie11\";\r\nimport \"react-app-polyfill/stable\";\r\nimport \"core-js\";\r\n\r\n// React and other node components\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"react-app-polyfill/ie9\";\r\n\r\n// CSS\r\nimport \"@progress/kendo-theme-bootstrap/dist/all.css\";\r\nimport \"./static/lumen-bootstrap.min.css\";\r\nimport \"./static/App.css\";\r\n\r\n// Internationalization\r\nimport \"./ddh-translations\";\r\n\r\n// App\r\nimport App from \"./App\";\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n","import i18n, { Resource } from \"i18next\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport LanguageDetector from \"i18next-browser-languagedetector\";\r\n\r\nimport enResources from \"./i18n/resources.en.json\";\r\nimport frResources from \"./i18n/resources.fr.json\";\r\nimport esResources from \"./i18n/resources.es.json\";\r\n\r\ninterface Language {\r\n name: string;\r\n abbreviation: string;\r\n}\r\n\r\nconst availableLanguages: Language[] = [\r\n { name: \"English\", abbreviation: \"en\" },\r\n { name: \"Français\", abbreviation: \"fr\" },\r\n { name: \"Español\", abbreviation: \"es\" },\r\n];\r\nexport { availableLanguages };\r\n\r\nconst resources: Resource = {\r\n en: {\r\n translation: enResources,\r\n },\r\n fr: {\r\n translation: frResources,\r\n },\r\n es: {\r\n translation: esResources,\r\n },\r\n};\r\n\r\nconst missingKeys = new Set();\r\nfunction missingKeyHandler(\r\n langs: readonly string[],\r\n ns: string,\r\n key: string,\r\n fallbackValue: string,\r\n updateMissing: boolean,\r\n options: any\r\n) {\r\n missingKeys.add(key);\r\n\r\n console.warn(\r\n `Found missing translation with key ${key}. \r\n Logging all currently missing translation keys.`\r\n );\r\n\r\n console.warn(missingKeys);\r\n}\r\n\r\ni18n.use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n resources,\r\n // lng: \"en\",\r\n fallbackLng: \"en\",\r\n debug: process.env.NODE_ENV === \"development\",\r\n // keySeparator: false,\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n detection: {\r\n order: [\"localStorage\"],\r\n },\r\n missingKeyHandler:\r\n process.env.NODE_ENV === \"development\"\r\n ? missingKeyHandler\r\n : undefined,\r\n });\r\n\r\nexport { i18n };\r\n"],"sourceRoot":""}