@openedx/frontend-base 1.0.1 → 2.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/dist/runtime/config/index.js.map +1 -1
  3. package/dist/runtime/i18n/index.d.ts +26 -3
  4. package/dist/runtime/i18n/index.js +2 -53
  5. package/dist/runtime/i18n/index.js.map +1 -1
  6. package/dist/runtime/i18n/lib.d.ts +0 -12
  7. package/dist/runtime/i18n/lib.js +0 -12
  8. package/dist/runtime/i18n/lib.js.map +1 -1
  9. package/dist/runtime/index.d.ts +1 -1
  10. package/dist/runtime/index.js +1 -1
  11. package/dist/runtime/index.js.map +1 -1
  12. package/dist/runtime/jest.config.js +1 -1
  13. package/dist/runtime/jest.config.js.map +1 -1
  14. package/dist/runtime/logging/types.js.map +1 -1
  15. package/dist/runtime/react/CombinedAppProvider.js.map +1 -1
  16. package/dist/runtime/react/CurrentAppContext.js.map +1 -1
  17. package/dist/runtime/react/CurrentAppProvider.js.map +1 -1
  18. package/dist/runtime/react/SiteContext.js.map +1 -1
  19. package/dist/runtime/react/SiteProvider.js.map +1 -1
  20. package/dist/runtime/react/hooks/theme/useThemeVariants.js.map +1 -1
  21. package/dist/runtime/slots/Slot.js.map +1 -1
  22. package/dist/runtime/slots/SlotContext.js.map +1 -1
  23. package/dist/runtime/slots/layout/types.js.map +1 -1
  24. package/dist/runtime/slots/types.js.map +1 -1
  25. package/dist/runtime/slots/widget/WidgetContext.js.map +1 -1
  26. package/dist/runtime/slots/widget/WidgetProvider.js.map +1 -1
  27. package/dist/runtime/slots/widget/iframe/IFrameContentWrapper.js.map +1 -1
  28. package/dist/runtime/slots/widget/iframe/IFrameWidget.js.map +1 -1
  29. package/dist/runtime/slots/widget/iframe/hooks.js.map +1 -1
  30. package/dist/runtime/slots/widget/iframe/types.js.map +1 -1
  31. package/dist/runtime/slots/widget/types.js.map +1 -1
  32. package/dist/runtime/testing/initializeMockApp.js.map +1 -1
  33. package/dist/shell/Logo.js.map +1 -1
  34. package/dist/shell/dev/devHeader/BarContext.js.map +1 -1
  35. package/dist/shell/dev/devHeader/BarProvider.js.map +1 -1
  36. package/dist/shell/dev/devHeader/FooContext.js.map +1 -1
  37. package/dist/shell/dev/devHeader/FooProvider.js.map +1 -1
  38. package/dist/shell/dev/slotShowcase/SlotShowcasePage.js.map +1 -1
  39. package/dist/shell/dev/slotShowcase/app.js.map +1 -1
  40. package/dist/shell/footer/CopyrightNotice.js.map +1 -1
  41. package/dist/shell/footer/LanguageMenuItem.js.map +1 -1
  42. package/dist/shell/header/AuthenticatedMenu.js.map +1 -1
  43. package/dist/shell/header/HelpButton.js.map +1 -1
  44. package/dist/shell/header/anonymous-menu/AnonymousMenu.js.map +1 -1
  45. package/dist/shell/header/course-bar/data/service.js.map +1 -1
  46. package/dist/shell/header/course-bar/masquerade/StudioLink.js.map +1 -1
  47. package/dist/shell/header/course-bar/masquerade/data/api.js.map +1 -1
  48. package/dist/shell/header/course-bar/masquerade/hooks.js.map +1 -1
  49. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.js.map +1 -1
  50. package/dist/shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.js.map +1 -1
  51. package/dist/shell/header/course-bar/navigation/CourseTabsNavigation.js.map +1 -1
  52. package/dist/shell/header/helpButtonSlotOperation.js.map +1 -1
  53. package/dist/shell/jest.config.js +1 -1
  54. package/dist/shell/jest.config.js.map +1 -1
  55. package/dist/shell/menus/LinkMenuItem.js.map +1 -1
  56. package/dist/shell/menus/NavDropdownMenuSlot.js.map +1 -1
  57. package/dist/shell/menus/ProfileLinkMenuItem.js.map +1 -1
  58. package/dist/tools/eslint/base.eslint.config.js +2 -2
  59. package/dist/tools/jest/jest.config.js +1 -1
  60. package/dist/tools/jest.config.js +1 -1
  61. package/dist/types.js.map +1 -1
  62. package/package.json +3 -3
  63. package/dist/runtime/i18n/injectIntlWithShim.d.ts +0 -11
  64. package/dist/runtime/i18n/injectIntlWithShim.js +0 -45
  65. package/dist/runtime/i18n/injectIntlWithShim.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MasqueradeUserNameInput.js","sourceRoot":"","sources":["../../../../../../shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAC7C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAQlC,MAAM,UAAU,uBAAuB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAS;IACzE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EACJ,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,GACpD,GAAG,oBAAoB,EAAE,CAAC;IAE3B,MAAM,YAAY,GAAG,CAAC,KAAiC,EAAE,EAAE;QACzD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,6BAA6B,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,aACrF,KAAC,SAAS,IAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,YACzD,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,KAA0C,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GACzF,GACQ,EACZ,KAAC,cAAc,IACb,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC3C,QAAQ,EAAE,CAAC,QAAQ,EACnB,MAAM,EAAE;oBACN,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAC5C,GACD,IACG,CACR,CAAC;AACJ,CAAC","sourcesContent":["import { FormEvent } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n Form, FormControl, FormGroup, StatefulButton,\n} from '@openedx/paragon';\n\nimport { useMasqueradeContext } from '../MasqueradeContext';\nimport messages from './messages';\n\ninterface Props {\n id?: string,\n className?: string,\n autoFocus?: boolean,\n}\n\nexport function MasqueradeUserNameInput({ id, className, autoFocus }: Props) {\n const { formatMessage } = useIntl();\n const {\n userName, setUserName, submitUserName, isSubmitting,\n } = useMasqueradeContext();\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n submitUserName();\n };\n\n return (\n <Form className={`d-flex align-items-center ${className ?? ''}`} onSubmit={handleSubmit}>\n <FormGroup controlId={id} className=\"flex-grow-1 mb-0 mr-2\">\n <FormControl\n autoFocus={autoFocus}\n value={userName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setUserName(event.target.value)}\n />\n </FormGroup>\n <StatefulButton\n type=\"submit\"\n variant=\"brand\"\n state={isSubmitting ? 'pending' : 'default'}\n disabled={!userName}\n labels={{\n default: formatMessage(messages.submit),\n pending: formatMessage(messages.submitting),\n }}\n />\n </Form>\n );\n}\n"]}
1
+ {"version":3,"file":"MasqueradeUserNameInput.js","sourceRoot":"","sources":["../../../../../../shell/header/course-bar/masquerade/masquerade-widget/MasqueradeUserNameInput.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAC7C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAQlC,MAAM,UAAU,uBAAuB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAS;IACzE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EACJ,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,GACpD,GAAG,oBAAoB,EAAE,CAAC;IAE3B,MAAM,YAAY,GAAG,CAAC,KAAiC,EAAE,EAAE;QACzD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,6BAA6B,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,aACrF,KAAC,SAAS,IAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,YACzD,KAAC,WAAW,IACV,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,KAA0C,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GACzF,GACQ,EACZ,KAAC,cAAc,IACb,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC3C,QAAQ,EAAE,CAAC,QAAQ,EACnB,MAAM,EAAE;oBACN,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACvC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAC5C,GACD,IACG,CACR,CAAC;AACJ,CAAC","sourcesContent":["import { FormEvent } from 'react';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n Form, FormControl, FormGroup, StatefulButton,\n} from '@openedx/paragon';\n\nimport { useMasqueradeContext } from '../MasqueradeContext';\nimport messages from './messages';\n\ninterface Props {\n id?: string;\n className?: string;\n autoFocus?: boolean;\n}\n\nexport function MasqueradeUserNameInput({ id, className, autoFocus }: Props) {\n const { formatMessage } = useIntl();\n const {\n userName, setUserName, submitUserName, isSubmitting,\n } = useMasqueradeContext();\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n submitUserName();\n };\n\n return (\n <Form className={`d-flex align-items-center ${className ?? ''}`} onSubmit={handleSubmit}>\n <FormGroup controlId={id} className=\"flex-grow-1 mb-0 mr-2\">\n <FormControl\n autoFocus={autoFocus}\n value={userName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setUserName(event.target.value)}\n />\n </FormGroup>\n <StatefulButton\n type=\"submit\"\n variant=\"brand\"\n state={isSubmitting ? 'pending' : 'default'}\n disabled={!userName}\n labels={{\n default: formatMessage(messages.submit),\n pending: formatMessage(messages.submitting),\n }}\n />\n </Form>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MasqueradeWidgetOption.js","sourceRoot":"","sources":["../../../../../../shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,UAAU,sBAAsB,CAAC,EAAE,MAAM,EAAS;IACtD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAEjE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;qDAEiD;IACjD,MAAM,aAAa,GAAG,aAAa,KAAK,IAAI;QAC1C,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,OAAO,CACL,KAAC,QAAQ,CAAC,IAAI,IACZ,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EACxC,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAE5B,MAAM,CAAC,IAAI,GACE,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { Dropdown } from '@openedx/paragon';\n\nimport { useMasqueradeContext } from '../MasqueradeContext';\nimport { isOptionSelected } from '../hooks';\nimport type { MasqueradeOption } from '../data/api';\n\ninterface Props {\n option: MasqueradeOption,\n}\n\nexport function MasqueradeWidgetOption({ option }: Props) {\n const { active, pendingOption, select } = useMasqueradeContext();\n\n if (!option.name) {\n return null;\n }\n\n /* While a click is pending, the menu mirrors the toggle: only that option\n * is highlighted. Once the server confirms (pendingOption clears), the\n * active-server-state logic takes over again. */\n const isHighlighted = pendingOption !== null\n ? option.name === pendingOption.name\n : isOptionSelected(option, active);\n\n return (\n <Dropdown.Item\n className={isHighlighted ? 'active' : ''}\n href=\"#\"\n onClick={() => select(option)}\n >\n {option.name}\n </Dropdown.Item>\n );\n}\n"]}
1
+ {"version":3,"file":"MasqueradeWidgetOption.js","sourceRoot":"","sources":["../../../../../../shell/header/course-bar/masquerade/masquerade-widget/MasqueradeWidgetOption.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,UAAU,sBAAsB,CAAC,EAAE,MAAM,EAAS;IACtD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAEjE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;qDAEiD;IACjD,MAAM,aAAa,GAAG,aAAa,KAAK,IAAI;QAC1C,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,OAAO,CACL,KAAC,QAAQ,CAAC,IAAI,IACZ,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EACxC,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAE5B,MAAM,CAAC,IAAI,GACE,CACjB,CAAC;AACJ,CAAC","sourcesContent":["import { Dropdown } from '@openedx/paragon';\n\nimport { useMasqueradeContext } from '../MasqueradeContext';\nimport { isOptionSelected } from '../hooks';\nimport type { MasqueradeOption } from '../data/api';\n\ninterface Props {\n option: MasqueradeOption;\n}\n\nexport function MasqueradeWidgetOption({ option }: Props) {\n const { active, pendingOption, select } = useMasqueradeContext();\n\n if (!option.name) {\n return null;\n }\n\n /* While a click is pending, the menu mirrors the toggle: only that option\n * is highlighted. Once the server confirms (pendingOption clears), the\n * active-server-state logic takes over again. */\n const isHighlighted = pendingOption !== null\n ? option.name === pendingOption.name\n : isOptionSelected(option, active);\n\n return (\n <Dropdown.Item\n className={isHighlighted ? 'active' : ''}\n href=\"#\"\n onClick={() => select(option)}\n >\n {option.name}\n </Dropdown.Item>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CourseTabsNavigation.js","sourceRoot":"","sources":["../../../../../shell/header/course-bar/navigation/CourseTabsNavigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { Link, useLocation, useParams } from 'react-router-dom';\nimport { useQuery } from '@tanstack/react-query';\nimport { Slot, useIntl } from '../../../../runtime';\nimport {\n CourseTab,\n courseHomeCourseMetadataQueryKey,\n findActiveTab,\n getCourseHomeCourseMetadata,\n} from '../data/service';\nimport { Container, Nav, Navbar, Skeleton } from '@openedx/paragon';\nimport messages from './messages';\nimport { isClientRoute } from '../utils';\nimport './course-tabs-navigation.scss';\n\ninterface ResolvedTab extends CourseTab {\n pathname: string,\n clientPath: string | null,\n}\n\nconst CourseTabsNavigation = () => {\n const location = useLocation();\n const { courseId = '' } = useParams();\n const intl = useIntl();\n\n const { data = { tabs: [] }, isLoading } = useQuery({\n queryKey: courseHomeCourseMetadataQueryKey(courseId),\n queryFn: () => getCourseHomeCourseMetadata(courseId),\n retry: 2,\n enabled: !!courseId,\n });\n\n const { tabs } = data;\n\n const resolvedTabs: ResolvedTab[] = useMemo(\n () => tabs.map(tab => {\n // Tab URLs from the course_home API are always absolute.\n const pathname = new URL(tab.url).pathname;\n return { ...tab, pathname, clientPath: isClientRoute(pathname) ? pathname : null };\n }),\n [tabs]\n );\n\n const currentTab = useMemo(\n () => (resolvedTabs.length > 0 ? findActiveTab(resolvedTabs, location.pathname)?.tabId ?? null : null),\n [location.pathname, resolvedTabs]\n );\n\n if (isLoading) {\n return <Skeleton className=\"lead mt-3\" />;\n }\n\n if (!courseId || resolvedTabs.length === 0) {\n return null;\n }\n\n return (\n <Navbar expand=\"sm\" className=\"course-tabs-navigation pb-0\" aria-label={intl.formatMessage(messages.courseMaterial)}>\n <Container fluid size=\"xl\">\n <Nav\n variant=\"tabs\"\n activeKey={currentTab}\n >\n <Navbar.Toggle aria-controls=\"course-nav\" />\n <Navbar.Collapse id=\"course-nav\">\n {\n resolvedTabs.map(tab => (\n <Nav.Item key={tab.tabId}>\n <Nav.Link\n {...(tab.clientPath\n ? { to: tab.clientPath, as: Link }\n : { href: tab.url }\n )}\n active={tab.tabId === currentTab}\n >\n {tab.title}\n </Nav.Link>\n </Nav.Item>\n ))\n }\n </Navbar.Collapse>\n <Slot id=\"org.openedx.frontend.slot.header.courseNavigationBar.extraContent.v1\" />\n </Nav>\n </Container>\n </Navbar>\n );\n};\n\nexport default CourseTabsNavigation;\n"]}
1
+ {"version":3,"file":"CourseTabsNavigation.js","sourceRoot":"","sources":["../../../../../shell/header/course-bar/navigation/CourseTabsNavigation.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { Link, useLocation, useParams } from 'react-router-dom';\nimport { useQuery } from '@tanstack/react-query';\nimport { Slot, useIntl } from '../../../../runtime';\nimport {\n CourseTab,\n courseHomeCourseMetadataQueryKey,\n findActiveTab,\n getCourseHomeCourseMetadata,\n} from '../data/service';\nimport { Container, Nav, Navbar, Skeleton } from '@openedx/paragon';\nimport messages from './messages';\nimport { isClientRoute } from '../utils';\nimport './course-tabs-navigation.scss';\n\ninterface ResolvedTab extends CourseTab {\n pathname: string;\n clientPath: string | null;\n}\n\nconst CourseTabsNavigation = () => {\n const location = useLocation();\n const { courseId = '' } = useParams();\n const intl = useIntl();\n\n const { data = { tabs: [] }, isLoading } = useQuery({\n queryKey: courseHomeCourseMetadataQueryKey(courseId),\n queryFn: () => getCourseHomeCourseMetadata(courseId),\n retry: 2,\n enabled: !!courseId,\n });\n\n const { tabs } = data;\n\n const resolvedTabs: ResolvedTab[] = useMemo(\n () => tabs.map(tab => {\n // Tab URLs from the course_home API are always absolute.\n const pathname = new URL(tab.url).pathname;\n return { ...tab, pathname, clientPath: isClientRoute(pathname) ? pathname : null };\n }),\n [tabs]\n );\n\n const currentTab = useMemo(\n () => (resolvedTabs.length > 0 ? findActiveTab(resolvedTabs, location.pathname)?.tabId ?? null : null),\n [location.pathname, resolvedTabs]\n );\n\n if (isLoading) {\n return <Skeleton className=\"lead mt-3\" />;\n }\n\n if (!courseId || resolvedTabs.length === 0) {\n return null;\n }\n\n return (\n <Navbar expand=\"sm\" className=\"course-tabs-navigation pb-0\" aria-label={intl.formatMessage(messages.courseMaterial)}>\n <Container fluid size=\"xl\">\n <Nav\n variant=\"tabs\"\n activeKey={currentTab}\n >\n <Navbar.Toggle aria-controls=\"course-nav\" />\n <Navbar.Collapse id=\"course-nav\">\n {\n resolvedTabs.map(tab => (\n <Nav.Item key={tab.tabId}>\n <Nav.Link\n {...(tab.clientPath\n ? { to: tab.clientPath, as: Link }\n : { href: tab.url }\n )}\n active={tab.tabId === currentTab}\n >\n {tab.title}\n </Nav.Link>\n </Nav.Item>\n ))\n }\n </Navbar.Collapse>\n <Slot id=\"org.openedx.frontend.slot.header.courseNavigationBar.extraContent.v1\" />\n </Nav>\n </Container>\n </Navbar>\n );\n};\n\nexport default CourseTabsNavigation;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"helpButtonSlotOperation.js","sourceRoot":"","sources":["../../../shell/header/helpButtonSlotOperation.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAyB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAEzE,MAAM,UAAU,uBAAuB,CACrC,EAAE,KAAK,EAAE,IAAI,EAAmC;IAEhD,OAAO;QACL,MAAM,EAAE,oDAAoD;QAC5D,EAAE,EAAE,YAAY;QAChB,EAAE,EAAE,oBAAoB,CAAC,MAAM;QAC/B,OAAO,EAAE,CACP,KAAC,UAAU,IACT,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,WAAiC,GACnE,CACH;QACD,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { getAppConfig, WidgetAppendOperation, WidgetOperationTypes } from '../../runtime';\nimport HelpButton from './HelpButton';\n\nexport const helpWidgetId = 'org.openedx.frontend.widget.header.help.v1';\n\nexport function helpButtonSlotOperation(\n { appId, role }: { appId: string, role: string },\n): WidgetAppendOperation {\n return {\n slotId: 'org.openedx.frontend.slot.header.secondaryLinks.v1',\n id: helpWidgetId,\n op: WidgetOperationTypes.APPEND,\n element: (\n <HelpButton\n getUrl={() => getAppConfig(appId).SUPPORT_URL as string | undefined}\n />\n ),\n condition: { active: [role] },\n };\n}\n"]}
1
+ {"version":3,"file":"helpButtonSlotOperation.js","sourceRoot":"","sources":["../../../shell/header/helpButtonSlotOperation.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAyB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAEzE,MAAM,UAAU,uBAAuB,CACrC,EAAE,KAAK,EAAE,IAAI,EAAmC;IAEhD,OAAO;QACL,MAAM,EAAE,oDAAoD;QAC5D,EAAE,EAAE,YAAY;QAChB,EAAE,EAAE,oBAAoB,CAAC,MAAM;QAC/B,OAAO,EAAE,CACP,KAAC,UAAU,IACT,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,WAAiC,GACnE,CACH;QACD,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;KAC9B,CAAC;AACJ,CAAC","sourcesContent":["import { getAppConfig, WidgetAppendOperation, WidgetOperationTypes } from '../../runtime';\nimport HelpButton from './HelpButton';\n\nexport const helpWidgetId = 'org.openedx.frontend.widget.header.help.v1';\n\nexport function helpButtonSlotOperation(\n { appId, role }: { appId: string; role: string },\n): WidgetAppendOperation {\n return {\n slotId: 'org.openedx.frontend.slot.header.secondaryLinks.v1',\n id: helpWidgetId,\n op: WidgetOperationTypes.APPEND,\n element: (\n <HelpButton\n getUrl={() => getAppConfig(appId).SUPPORT_URL as string | undefined}\n />\n ),\n condition: { active: [role] },\n };\n}\n"]}
@@ -21,7 +21,7 @@ module.exports = {
21
21
  'setupTest.js',
22
22
  ],
23
23
  transformIgnorePatterns: [
24
- '/node_modules/(?!(@openedx|@edx)/)',
24
+ '/node_modules/(?!(@openedx|@edx|react-intl|@formatjs|intl-messageformat)/)',
25
25
  ],
26
26
  testPathIgnorePatterns: [
27
27
  '/site.config.test.tsx',
@@ -1 +1 @@
1
- {"version":3,"file":"jest.config.js","sourceRoot":"","sources":["../../shell/jest.config.js"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG;IACf,kBAAkB,EAAE;QAClB,gBAAgB;KACjB;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,4BAA4B;QACvC,iFAAiF,EAAE,6BAA6B;QAChH,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACvD,aAAa,EAAE,gCAAgC;KAChD;IACD,eAAe,EAAE,OAAO;IACxB,sBAAsB,EAAE;QACtB,GAAG,EAAE,mBAAmB;KACzB;IACD,mBAAmB,EAAE;QACnB,gCAAgC;KACjC;IACD,0BAA0B,EAAE;QAC1B,gBAAgB;QAChB,cAAc;KACf;IACD,uBAAuB,EAAE;QACvB,oCAAoC;KACrC;IACD,sBAAsB,EAAE;QACtB,uBAAuB;QACvB,gBAAgB;QAChB,QAAQ;KACT;CACF,CAAC","sourcesContent":["module.exports = {\n setupFilesAfterEnv: [\n './setupTest.js',\n ],\n moduleNameMapper: {\n '\\\\.svg$': '<rootDir>/__mocks__/svg.js',\n '\\\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/__mocks__/file.js',\n '\\\\.(css|scss)$': require.resolve('identity-obj-proxy'),\n 'site.config': '<rootDir>/site.config.test.tsx',\n },\n testEnvironment: 'jsdom',\n testEnvironmentOptions: {\n url: 'http://localhost/',\n },\n collectCoverageFrom: [\n '<rootDir>/**/*.{js,jsx,ts,tsx}',\n ],\n coveragePathIgnorePatterns: [\n '/node_modules/',\n 'setupTest.js',\n ],\n transformIgnorePatterns: [\n '/node_modules/(?!(@openedx|@edx)/)',\n ],\n testPathIgnorePatterns: [\n '/site.config.test.tsx',\n '/node_modules/',\n '/dist/',\n ],\n};\n"]}
1
+ {"version":3,"file":"jest.config.js","sourceRoot":"","sources":["../../shell/jest.config.js"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG;IACf,kBAAkB,EAAE;QAClB,gBAAgB;KACjB;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,4BAA4B;QACvC,iFAAiF,EAAE,6BAA6B;QAChH,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACvD,aAAa,EAAE,gCAAgC;KAChD;IACD,eAAe,EAAE,OAAO;IACxB,sBAAsB,EAAE;QACtB,GAAG,EAAE,mBAAmB;KACzB;IACD,mBAAmB,EAAE;QACnB,gCAAgC;KACjC;IACD,0BAA0B,EAAE;QAC1B,gBAAgB;QAChB,cAAc;KACf;IACD,uBAAuB,EAAE;QACvB,4EAA4E;KAC7E;IACD,sBAAsB,EAAE;QACtB,uBAAuB;QACvB,gBAAgB;QAChB,QAAQ;KACT;CACF,CAAC","sourcesContent":["module.exports = {\n setupFilesAfterEnv: [\n './setupTest.js',\n ],\n moduleNameMapper: {\n '\\\\.svg$': '<rootDir>/__mocks__/svg.js',\n '\\\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/__mocks__/file.js',\n '\\\\.(css|scss)$': require.resolve('identity-obj-proxy'),\n 'site.config': '<rootDir>/site.config.test.tsx',\n },\n testEnvironment: 'jsdom',\n testEnvironmentOptions: {\n url: 'http://localhost/',\n },\n collectCoverageFrom: [\n '<rootDir>/**/*.{js,jsx,ts,tsx}',\n ],\n coveragePathIgnorePatterns: [\n '/node_modules/',\n 'setupTest.js',\n ],\n transformIgnorePatterns: [\n '/node_modules/(?!(@openedx|@edx|react-intl|@formatjs|intl-messageformat)/)',\n ],\n testPathIgnorePatterns: [\n '/site.config.test.tsx',\n '/node_modules/',\n '/dist/',\n ],\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LinkMenuItem.js","sourceRoot":"","sources":["../../../shell/menus/LinkMenuItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,EACL,YAAY,EACb,MAAM,cAAc,CAAC;AAStB,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,WAAW,EAAqB;IACjG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,QAAmC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,6FAA6F;IAC7F,sDAAsD;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,CACL,KAAC,SAAS,IAAC,WAAW,EAAE,QAAQ,YAC7B,UAAU,GACD,CACb,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,OAAO,IAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,YAClG,UAAU,GACH,CACX,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,iBAAiB,EAAE,CAAC;QACzC,OAAO,CACL,KAAC,WAAW,CAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,YAC7B,UAAU,GACM,CACpB,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,CACL,KAAC,QAAQ,CAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,YAC1B,UAAU,GACG,CACjB,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { Dropdown, Hyperlink, NavDropdown, NavLink } from '@openedx/paragon';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { getUrlByRouteRole } from '../../runtime/routing';\nimport {\n MenuItemName\n} from '../../types';\nimport {\n getItemLabel\n} from './data/utils';\n\ninterface LinkMenuItemProps {\n label: MenuItemName,\n role?: string,\n url?: string,\n variant?: 'hyperlink' | 'navLink' | 'navDropdownItem' | 'dropdownItem',\n}\n\nexport default function LinkMenuItem({ label, role, url, variant = 'hyperlink' }: LinkMenuItemProps) {\n const intl = useIntl();\n const location = useLocation();\n const finalLabel = getItemLabel(label, intl);\n\n let finalUrl: string | null | undefined;\n if (role !== undefined) {\n finalUrl = getUrlByRouteRole(role);\n } else if (url !== undefined) {\n finalUrl = url;\n }\n\n // The URL will only be null if the item is an \"app\" menu item, and if the app is not loaded.\n // We automatically hide the link if this is the case.\n if (!finalUrl) {\n return null;\n }\n\n if (variant === 'hyperlink') {\n return (\n <Hyperlink destination={finalUrl}>\n {finalLabel}\n </Hyperlink>\n );\n } else if (variant === 'navLink') {\n return (\n <NavLink href={finalUrl} active={location.pathname.replace(/\\/$/, '') === finalUrl.replace(/\\/$/, '')}>\n {finalLabel}\n </NavLink>\n );\n } else if (variant === 'navDropdownItem') {\n return (\n <NavDropdown.Item href={finalUrl}>\n {finalLabel}\n </NavDropdown.Item>\n );\n } else if (variant === 'dropdownItem') {\n return (\n <Dropdown.Item href={finalUrl}>\n {finalLabel}\n </Dropdown.Item>\n );\n }\n\n // Just return null if the item is something we haven't accounted for above.\n return null;\n}\n"]}
1
+ {"version":3,"file":"LinkMenuItem.js","sourceRoot":"","sources":["../../../shell/menus/LinkMenuItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,EACL,YAAY,EACb,MAAM,cAAc,CAAC;AAStB,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,WAAW,EAAqB;IACjG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,QAAmC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,6FAA6F;IAC7F,sDAAsD;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,CACL,KAAC,SAAS,IAAC,WAAW,EAAE,QAAQ,YAC7B,UAAU,GACD,CACb,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CACL,KAAC,OAAO,IAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,YAClG,UAAU,GACH,CACX,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,iBAAiB,EAAE,CAAC;QACzC,OAAO,CACL,KAAC,WAAW,CAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,YAC7B,UAAU,GACM,CACpB,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,CACL,KAAC,QAAQ,CAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,YAC1B,UAAU,GACG,CACjB,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { Dropdown, Hyperlink, NavDropdown, NavLink } from '@openedx/paragon';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\n\nimport { getUrlByRouteRole } from '../../runtime/routing';\nimport {\n MenuItemName\n} from '../../types';\nimport {\n getItemLabel\n} from './data/utils';\n\ninterface LinkMenuItemProps {\n label: MenuItemName;\n role?: string;\n url?: string;\n variant?: 'hyperlink' | 'navLink' | 'navDropdownItem' | 'dropdownItem';\n}\n\nexport default function LinkMenuItem({ label, role, url, variant = 'hyperlink' }: LinkMenuItemProps) {\n const intl = useIntl();\n const location = useLocation();\n const finalLabel = getItemLabel(label, intl);\n\n let finalUrl: string | null | undefined;\n if (role !== undefined) {\n finalUrl = getUrlByRouteRole(role);\n } else if (url !== undefined) {\n finalUrl = url;\n }\n\n // The URL will only be null if the item is an \"app\" menu item, and if the app is not loaded.\n // We automatically hide the link if this is the case.\n if (!finalUrl) {\n return null;\n }\n\n if (variant === 'hyperlink') {\n return (\n <Hyperlink destination={finalUrl}>\n {finalLabel}\n </Hyperlink>\n );\n } else if (variant === 'navLink') {\n return (\n <NavLink href={finalUrl} active={location.pathname.replace(/\\/$/, '') === finalUrl.replace(/\\/$/, '')}>\n {finalLabel}\n </NavLink>\n );\n } else if (variant === 'navDropdownItem') {\n return (\n <NavDropdown.Item href={finalUrl}>\n {finalLabel}\n </NavDropdown.Item>\n );\n } else if (variant === 'dropdownItem') {\n return (\n <Dropdown.Item href={finalUrl}>\n {finalLabel}\n </Dropdown.Item>\n );\n }\n\n // Just return null if the item is something we haven't accounted for above.\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NavDropdownMenuSlot.js","sourceRoot":"","sources":["../../../shell/menus/NavDropdownMenuSlot.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIvE,OAAO,EACL,YAAY,EACb,MAAM,cAAc,CAAC;AAOtB,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAyB;;IAC3E,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAA,OAAO,CAAC,KAAK,mCAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9D,OAAO,CACL,KAAC,WAAW,IAAU,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,YAC1D,OAAO,IADQ,EAAE,CAEN,CACf,CAAC;AACJ,CAAC","sourcesContent":["import { NavDropdown } from '@openedx/paragon';\nimport { useIntl } from 'react-intl';\n\nimport { useLayoutOptionsForId, useWidgetsForId } from '../../runtime';\nimport {\n MenuItemName\n} from '../../types';\nimport {\n getItemLabel\n} from './data/utils';\n\ninterface DropdownMenuSlotProps {\n id: string,\n label: MenuItemName,\n}\n\nexport default function DropdownMenuSlot({ id, label }: DropdownMenuSlotProps) {\n const intl = useIntl();\n const options = useLayoutOptionsForId(id);\n const widgets = useWidgetsForId(id);\n\n const finalLabel = getItemLabel(options.label ?? label, intl);\n\n return (\n <NavDropdown key={id} title={finalLabel} id={`${id}-dropdown`}>\n {widgets}\n </NavDropdown>\n );\n}\n"]}
1
+ {"version":3,"file":"NavDropdownMenuSlot.js","sourceRoot":"","sources":["../../../shell/menus/NavDropdownMenuSlot.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIvE,OAAO,EACL,YAAY,EACb,MAAM,cAAc,CAAC;AAOtB,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAyB;;IAC3E,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAA,OAAO,CAAC,KAAK,mCAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IAE9D,OAAO,CACL,KAAC,WAAW,IAAU,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,YAC1D,OAAO,IADQ,EAAE,CAEN,CACf,CAAC;AACJ,CAAC","sourcesContent":["import { NavDropdown } from '@openedx/paragon';\nimport { useIntl } from 'react-intl';\n\nimport { useLayoutOptionsForId, useWidgetsForId } from '../../runtime';\nimport {\n MenuItemName\n} from '../../types';\nimport {\n getItemLabel\n} from './data/utils';\n\ninterface DropdownMenuSlotProps {\n id: string;\n label: MenuItemName;\n}\n\nexport default function DropdownMenuSlot({ id, label }: DropdownMenuSlotProps) {\n const intl = useIntl();\n const options = useLayoutOptionsForId(id);\n const widgets = useWidgetsForId(id);\n\n const finalLabel = getItemLabel(options.label ?? label, intl);\n\n return (\n <NavDropdown key={id} title={finalLabel} id={`${id}-dropdown`}>\n {widgets}\n </NavDropdown>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ProfileLinkMenuItem.js","sourceRoot":"","sources":["../../../shell/menus/ProfileLinkMenuItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAQ1C,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,EAA4B;IAC1G,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO;QACV,OAAO,IAAI,CAAC;IAEd,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,OAAO,MAAM,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,QAAQ,EAAE,CAAC;IAE1D,OAAO,CACL,KAAC,YAAY,IACX,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC","sourcesContent":["import { useAuthenticatedUser } from '../../runtime';\nimport { getUrlByRouteRole } from '../../runtime/routing';\nimport { MenuItemName } from '../../types';\n\nimport LinkMenuItem from './LinkMenuItem';\n\ninterface ProfileLinkMenuItemProps {\n label: MenuItemName,\n role: string,\n variant?: 'hyperlink' | 'navLink' | 'navDropdownItem' | 'dropdownItem',\n}\n\nexport default function ProfileLinkMenuItem({ label, role, variant = 'hyperlink' }: ProfileLinkMenuItemProps) {\n const authenticatedUser = useAuthenticatedUser();\n let baseUrl = getUrlByRouteRole(role);\n\n if (!baseUrl)\n return null;\n\n if (baseUrl.endsWith('/')) {\n baseUrl = baseUrl.slice(0, -1);\n }\n\n const url = `${baseUrl}/u/${authenticatedUser?.username}`;\n\n return (\n <LinkMenuItem\n label={label}\n url={url}\n variant={variant}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"ProfileLinkMenuItem.js","sourceRoot":"","sources":["../../../shell/menus/ProfileLinkMenuItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAQ1C,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,EAA4B;IAC1G,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,CAAC;IACjD,IAAI,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO;QACV,OAAO,IAAI,CAAC;IAEd,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,OAAO,MAAM,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,QAAQ,EAAE,CAAC;IAE1D,OAAO,CACL,KAAC,YAAY,IACX,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC","sourcesContent":["import { useAuthenticatedUser } from '../../runtime';\nimport { getUrlByRouteRole } from '../../runtime/routing';\nimport { MenuItemName } from '../../types';\n\nimport LinkMenuItem from './LinkMenuItem';\n\ninterface ProfileLinkMenuItemProps {\n label: MenuItemName;\n role: string;\n variant?: 'hyperlink' | 'navLink' | 'navDropdownItem' | 'dropdownItem';\n}\n\nexport default function ProfileLinkMenuItem({ label, role, variant = 'hyperlink' }: ProfileLinkMenuItemProps) {\n const authenticatedUser = useAuthenticatedUser();\n let baseUrl = getUrlByRouteRole(role);\n\n if (!baseUrl)\n return null;\n\n if (baseUrl.endsWith('/')) {\n baseUrl = baseUrl.slice(0, -1);\n }\n\n const url = `${baseUrl}/u/${authenticatedUser?.username}`;\n\n return (\n <LinkMenuItem\n label={label}\n url={url}\n variant={variant}\n />\n );\n}\n"]}
@@ -93,11 +93,11 @@ module.exports = tseslint.config(eslint.configs.recommended, ...tseslint.configs
93
93
  '@stylistic/brace-style': ['error', '1tbs'],
94
94
  '@stylistic/member-delimiter-style': ['error', {
95
95
  multiline: {
96
- delimiter: 'comma',
96
+ delimiter: 'semi',
97
97
  requireLast: true,
98
98
  },
99
99
  singleline: {
100
- delimiter: 'comma',
100
+ delimiter: 'semi',
101
101
  requireLast: false,
102
102
  }
103
103
  }],
@@ -17,7 +17,7 @@ module.exports = {
17
17
  '/node_modules/',
18
18
  ],
19
19
  transformIgnorePatterns: [
20
- '/node_modules/(?!(@openedx|@edx)/)',
20
+ '/node_modules/(?!(@openedx|@edx|react-intl|@formatjs|intl-messageformat)/)',
21
21
  ],
22
22
  modulePathIgnorePatterns: [
23
23
  '/dist/',
@@ -8,7 +8,7 @@ module.exports = {
8
8
  'cli/**/*.{js,jsx,ts,tsx}',
9
9
  ],
10
10
  transformIgnorePatterns: [
11
- '/node_modules/(?!(@openedx|@edx)/)',
11
+ '/node_modules/(?!(@openedx|@edx|react-intl|@formatjs|intl-messageformat)/)',
12
12
  ],
13
13
  modulePathIgnorePatterns: [
14
14
  '/dist/',
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AA6HA,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,6CAAyB,CAAA;IACzB,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;AACf,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B","sourcesContent":["import { FC, ReactElement, ReactNode } from 'react';\nimport { MessageDescriptor } from 'react-intl';\nimport { RouteObject } from 'react-router';\nimport { SlotOperation } from './runtime/slots/types';\n\n// Apps\n\nexport interface ExternalRoute {\n role: string,\n url: string,\n}\n\nexport type RoleRouteObject = RouteObject & {\n handle?: {\n /**\n * Route roles identify the purpose(s) a route fulfills in the site.\n */\n roles?: string[],\n },\n};\n\nexport type AppConfig = Record<string, unknown>;\n\nexport type AppProvider = FC<{ children?: ReactNode }>;\n\nexport interface App {\n appId: string,\n routes?: RoleRouteObject[],\n providers?: AppProvider[],\n slots?: SlotOperation[],\n externalScripts?: ExternalScriptLoaderClass[],\n config?: AppConfig,\n provides?: Record<string, unknown>,\n}\n\n// External Scripts\n\nexport interface ExternalScriptLoader {\n loadScript(): void,\n}\n\nexport type ExternalScriptLoaderClass = new (data: { config: AppConfig }) => ExternalScriptLoader;\n\n// Site Config\n\nexport interface RequiredSiteConfig {\n siteId: string,\n siteName: string,\n baseUrl: string,\n\n // Backends\n lmsBaseUrl: string,\n\n // Frontends\n loginUrl: string,\n logoutUrl: string,\n}\n\nexport type LocalizedMessages = Record<string, Record<string, string>>;\nexport type SiteMessages = LocalizedMessages[];\n\nexport interface OptionalSiteConfig {\n // Site environment\n environment: EnvironmentTypes,\n\n // Backends\n cmsBaseUrl: string,\n\n // Apps, routes, and URLs\n apps: App[],\n basename: string,\n externalRoutes: ExternalRoute[],\n externalLinkUrlOverrides: string[],\n runtimeConfigJsonUrl: string | null,\n commonAppConfig: AppConfig,\n headerLogoImageUrl: string,\n\n // Theme\n theme: Theme,\n\n // Cookies\n accessTokenCookieName: string,\n languagePreferenceCookieName: string,\n userInfoCookieName: string,\n\n // Paths\n csrfTokenApiPath: string,\n refreshAccessTokenApiPath: string,\n\n // Logging\n ignoredErrorRegex: RegExp | null,\n\n // Analytics\n segmentKey: string | null,\n}\n\nexport type SiteConfig = RequiredSiteConfig & Partial<OptionalSiteConfig>;\n\nexport interface ThemeVariant {\n url: string,\n}\n\nexport interface ThemeDefaults {\n light?: string,\n dark?: string,\n}\n\nexport type ThemeVariants = Record<string, ThemeVariant>;\n\nexport interface Theme {\n core?: ThemeVariant,\n defaults?: ThemeDefaults,\n variants?: ThemeVariants,\n}\n\nexport interface User {\n administrator: boolean,\n email: string,\n name: string,\n roles: string[],\n userId: number,\n username: string,\n avatar: string,\n}\n\nexport enum EnvironmentTypes {\n PRODUCTION = 'production',\n DEVELOPMENT = 'development',\n TEST = 'test',\n}\n\n// Menu Items\n\nexport type MenuItemName = string | MessageDescriptor | ReactElement;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AA6HA,MAAM,CAAN,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,6CAAyB,CAAA;IACzB,+CAA2B,CAAA;IAC3B,iCAAa,CAAA;AACf,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,QAI3B","sourcesContent":["import { FC, ReactElement, ReactNode } from 'react';\nimport { MessageDescriptor } from 'react-intl';\nimport { RouteObject } from 'react-router';\nimport { SlotOperation } from './runtime/slots/types';\n\n// Apps\n\nexport interface ExternalRoute {\n role: string;\n url: string;\n}\n\nexport type RoleRouteObject = RouteObject & {\n handle?: {\n /**\n * Route roles identify the purpose(s) a route fulfills in the site.\n */\n roles?: string[];\n };\n};\n\nexport type AppConfig = Record<string, unknown>;\n\nexport type AppProvider = FC<{ children?: ReactNode }>;\n\nexport interface App {\n appId: string;\n routes?: RoleRouteObject[];\n providers?: AppProvider[];\n slots?: SlotOperation[];\n externalScripts?: ExternalScriptLoaderClass[];\n config?: AppConfig;\n provides?: Record<string, unknown>;\n}\n\n// External Scripts\n\nexport interface ExternalScriptLoader {\n loadScript(): void;\n}\n\nexport type ExternalScriptLoaderClass = new (data: { config: AppConfig }) => ExternalScriptLoader;\n\n// Site Config\n\nexport interface RequiredSiteConfig {\n siteId: string;\n siteName: string;\n baseUrl: string;\n\n // Backends\n lmsBaseUrl: string;\n\n // Frontends\n loginUrl: string;\n logoutUrl: string;\n}\n\nexport type LocalizedMessages = Record<string, Record<string, string>>;\nexport type SiteMessages = LocalizedMessages[];\n\nexport interface OptionalSiteConfig {\n // Site environment\n environment: EnvironmentTypes;\n\n // Backends\n cmsBaseUrl: string;\n\n // Apps, routes, and URLs\n apps: App[];\n basename: string;\n externalRoutes: ExternalRoute[];\n externalLinkUrlOverrides: string[];\n runtimeConfigJsonUrl: string | null;\n commonAppConfig: AppConfig;\n headerLogoImageUrl: string;\n\n // Theme\n theme: Theme;\n\n // Cookies\n accessTokenCookieName: string;\n languagePreferenceCookieName: string;\n userInfoCookieName: string;\n\n // Paths\n csrfTokenApiPath: string;\n refreshAccessTokenApiPath: string;\n\n // Logging\n ignoredErrorRegex: RegExp | null;\n\n // Analytics\n segmentKey: string | null;\n}\n\nexport type SiteConfig = RequiredSiteConfig & Partial<OptionalSiteConfig>;\n\nexport interface ThemeVariant {\n url: string;\n}\n\nexport interface ThemeDefaults {\n light?: string;\n dark?: string;\n}\n\nexport type ThemeVariants = Record<string, ThemeVariant>;\n\nexport interface Theme {\n core?: ThemeVariant;\n defaults?: ThemeDefaults;\n variants?: ThemeVariants;\n}\n\nexport interface User {\n administrator: boolean;\n email: string;\n name: string;\n roles: string[];\n userId: number;\n username: string;\n avatar: string;\n}\n\nexport enum EnvironmentTypes {\n PRODUCTION = 'production',\n DEVELOPMENT = 'development',\n TEST = 'test',\n}\n\n// Menu Items\n\nexport type MenuItemName = string | MessageDescriptor | ReactElement;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/frontend-base",
3
- "version": "1.0.1",
3
+ "version": "2.0.0-alpha.2",
4
4
  "description": "Build tools, setup and config for frontend apps",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -116,7 +116,7 @@
116
116
  "prop-types": "^15.8.1",
117
117
  "react-dev-utils": "12.0.1",
118
118
  "react-focus-on": "^3.10.2",
119
- "react-intl": "^6.6.6",
119
+ "react-intl": "^10.1.20",
120
120
  "react-refresh": "0.18.0",
121
121
  "react-refresh-typescript": "^2.0.9",
122
122
  "react-responsive": "^10.0.0",
@@ -160,7 +160,7 @@
160
160
  "nodemon": "^3.1.4"
161
161
  },
162
162
  "peerDependencies": {
163
- "@openedx/paragon": "^23.20.0",
163
+ "@openedx/paragon": "^23.23.0",
164
164
  "@tanstack/react-query": "^5.81.2",
165
165
  "react": "^18.3.1",
166
166
  "react-dom": "^18.3.1",
@@ -1,11 +0,0 @@
1
- export default injectIntlWithShim;
2
- /**
3
- * This function wraps react-intl's injectIntl function in order to add error logging to the intl
4
- * property's formatMessage function.
5
- *
6
- * @memberof I18n
7
- */
8
- declare function injectIntlWithShim(WrappedComponent: any): React.FC<import("react-intl").WithIntlProps<any>> & {
9
- WrappedComponent: React.ComponentType<any>;
10
- };
11
- import React from 'react';
@@ -1,45 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import React from 'react';
3
- import { injectIntl } from 'react-intl';
4
- import { EnvironmentTypes } from '../../types';
5
- import { getSiteConfig } from '../config';
6
- import { getLoggingService } from '../logging';
7
- import { intlShape } from './lib';
8
- /**
9
- * This function wraps react-intl's injectIntl function in order to add error logging to the intl
10
- * property's formatMessage function.
11
- *
12
- * @memberof I18n
13
- */
14
- const injectIntlWithShim = (WrappedComponent) => {
15
- class ShimmedIntlComponent extends React.Component {
16
- constructor(props) {
17
- super(props);
18
- this.shimmedIntl = Object.create(this.props.intl, {
19
- formatMessage: {
20
- value: (definition, ...args) => {
21
- if (definition === undefined || definition.id === undefined) {
22
- const error = new Error('i18n error: An undefined message was supplied to intl.formatMessage.');
23
- if (getSiteConfig().environment === EnvironmentTypes.DEVELOPMENT) {
24
- console.error(error); // eslint-disable-line no-console
25
- return '!!! Missing message supplied to intl.formatMessage !!!';
26
- }
27
- getLoggingService().logError(error);
28
- return ''; // Fail silently in production
29
- }
30
- return this.props.intl.formatMessage(definition, ...args);
31
- },
32
- },
33
- });
34
- }
35
- render() {
36
- return _jsx(WrappedComponent, Object.assign({}, this.props, { intl: this.shimmedIntl }));
37
- }
38
- }
39
- ShimmedIntlComponent.propTypes = {
40
- intl: intlShape.isRequired,
41
- };
42
- return injectIntl(ShimmedIntlComponent);
43
- };
44
- export default injectIntlWithShim;
45
- //# sourceMappingURL=injectIntlWithShim.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injectIntlWithShim.js","sourceRoot":"","sources":["../../../runtime/i18n/injectIntlWithShim.jsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,CAAC,gBAAgB,EAAE,EAAE;IAC9C,MAAM,oBAAqB,SAAQ,KAAK,CAAC,SAAS;QAChD,YAAY,KAAK;YACf,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBAChD,aAAa,EAAE;oBACb,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE;wBAC7B,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;4BAC5D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;4BAChG,IAAI,aAAa,EAAE,CAAC,WAAW,KAAK,gBAAgB,CAAC,WAAW,EAAE,CAAC;gCACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC;gCACvD,OAAO,wDAAwD,CAAC;4BAClE,CAAC;4BACD,iBAAiB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;4BACpC,OAAO,EAAE,CAAC,CAAC,8BAA8B;wBAC3C,CAAC;wBACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;oBAC5D,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM;YACJ,OAAO,KAAC,gBAAgB,oBAAK,IAAI,CAAC,KAAK,IAAE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;QACtE,CAAC;KACF;IAED,oBAAoB,CAAC,SAAS,GAAG;QAC/B,IAAI,EAAE,SAAS,CAAC,UAAU;KAC3B,CAAC;IAEF,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import React from 'react';\nimport { injectIntl } from 'react-intl';\nimport { EnvironmentTypes } from '../../types';\nimport { getSiteConfig } from '../config';\nimport { getLoggingService } from '../logging';\nimport { intlShape } from './lib';\n\n/**\n * This function wraps react-intl's injectIntl function in order to add error logging to the intl\n * property's formatMessage function.\n *\n * @memberof I18n\n */\nconst injectIntlWithShim = (WrappedComponent) => {\n class ShimmedIntlComponent extends React.Component {\n constructor(props) {\n super(props);\n this.shimmedIntl = Object.create(this.props.intl, {\n formatMessage: {\n value: (definition, ...args) => {\n if (definition === undefined || definition.id === undefined) {\n const error = new Error('i18n error: An undefined message was supplied to intl.formatMessage.');\n if (getSiteConfig().environment === EnvironmentTypes.DEVELOPMENT) {\n console.error(error); // eslint-disable-line no-console\n return '!!! Missing message supplied to intl.formatMessage !!!';\n }\n getLoggingService().logError(error);\n return ''; // Fail silently in production\n }\n return this.props.intl.formatMessage(definition, ...args);\n },\n },\n });\n }\n\n render() {\n return <WrappedComponent {...this.props} intl={this.shimmedIntl} />;\n }\n }\n\n ShimmedIntlComponent.propTypes = {\n intl: intlShape.isRequired,\n };\n\n return injectIntl(ShimmedIntlComponent);\n};\n\nexport default injectIntlWithShim;\n"]}