@openedx/frontend-app-catalog 1.0.0-alpha.0

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 (390) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +300 -0
  3. package/dist/Main.d.ts +3 -0
  4. package/dist/Main.js +8 -0
  5. package/dist/Main.js.map +1 -0
  6. package/dist/app.d.ts +3 -0
  7. package/dist/app.js +22 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/assets/images/no-course-image.svg +4 -0
  10. package/dist/assets/scss/_animations.scss +23 -0
  11. package/dist/catalog/CatalogPage.d.ts +2 -0
  12. package/dist/catalog/CatalogPage.js +64 -0
  13. package/dist/catalog/CatalogPage.js.map +1 -0
  14. package/dist/catalog/hooks/types.d.ts +24 -0
  15. package/dist/catalog/hooks/types.js +2 -0
  16. package/dist/catalog/hooks/types.js.map +1 -0
  17. package/dist/catalog/hooks/useCatalog.d.ts +29 -0
  18. package/dist/catalog/hooks/useCatalog.js +52 -0
  19. package/dist/catalog/hooks/useCatalog.js.map +1 -0
  20. package/dist/catalog/hooks/useCourseData.d.ts +12 -0
  21. package/dist/catalog/hooks/useCourseData.js +21 -0
  22. package/dist/catalog/hooks/useCourseData.js.map +1 -0
  23. package/dist/catalog/hooks/useDebouncedSearchInput.d.ts +7 -0
  24. package/dist/catalog/hooks/useDebouncedSearchInput.js +26 -0
  25. package/dist/catalog/hooks/useDebouncedSearchInput.js.map +1 -0
  26. package/dist/catalog/hooks/useFilter.d.ts +18 -0
  27. package/dist/catalog/hooks/useFilter.js +58 -0
  28. package/dist/catalog/hooks/useFilter.js.map +1 -0
  29. package/dist/catalog/hooks/usePagination.d.ts +13 -0
  30. package/dist/catalog/hooks/usePagination.js +25 -0
  31. package/dist/catalog/hooks/usePagination.js.map +1 -0
  32. package/dist/catalog/hooks/useSearch.d.ts +16 -0
  33. package/dist/catalog/hooks/useSearch.js +63 -0
  34. package/dist/catalog/hooks/useSearch.js.map +1 -0
  35. package/dist/catalog/messages.d.ts +68 -0
  36. package/dist/catalog/messages.js +70 -0
  37. package/dist/catalog/messages.js.map +1 -0
  38. package/dist/catalog/types.d.ts +6 -0
  39. package/dist/catalog/types.js +2 -0
  40. package/dist/catalog/types.js.map +1 -0
  41. package/dist/catalog/utils.d.ts +25 -0
  42. package/dist/catalog/utils.js +82 -0
  43. package/dist/catalog/utils.js.map +1 -0
  44. package/dist/constants.d.ts +18 -0
  45. package/dist/constants.js +15 -0
  46. package/dist/constants.js.map +1 -0
  47. package/dist/course-about/CourseAboutPage.d.ts +2 -0
  48. package/dist/course-about/CourseAboutPage.js +39 -0
  49. package/dist/course-about/CourseAboutPage.js.map +1 -0
  50. package/dist/course-about/CourseAboutPage.scss +36 -0
  51. package/dist/course-about/course-intro/CourseIntro.d.ts +4 -0
  52. package/dist/course-about/course-intro/CourseIntro.js +19 -0
  53. package/dist/course-about/course-intro/CourseIntro.js.map +1 -0
  54. package/dist/course-about/course-intro/components/EnrolledStatus.d.ts +2 -0
  55. package/dist/course-about/course-intro/components/EnrolledStatus.js +13 -0
  56. package/dist/course-about/course-intro/components/EnrolledStatus.js.map +1 -0
  57. package/dist/course-about/course-intro/components/EnrollmentButton.d.ts +2 -0
  58. package/dist/course-about/course-intro/components/EnrollmentButton.js +12 -0
  59. package/dist/course-about/course-intro/components/EnrollmentButton.js.map +1 -0
  60. package/dist/course-about/course-intro/components/StatusMessage.d.ts +2 -0
  61. package/dist/course-about/course-intro/components/StatusMessage.js +12 -0
  62. package/dist/course-about/course-intro/components/StatusMessage.js.map +1 -0
  63. package/dist/course-about/course-intro/components/index.d.ts +3 -0
  64. package/dist/course-about/course-intro/components/index.js +4 -0
  65. package/dist/course-about/course-intro/components/index.js.map +1 -0
  66. package/dist/course-about/course-intro/components/types.d.ts +18 -0
  67. package/dist/course-about/course-intro/components/types.js +2 -0
  68. package/dist/course-about/course-intro/components/types.js.map +1 -0
  69. package/dist/course-about/course-intro/constants.d.ts +10 -0
  70. package/dist/course-about/course-intro/constants.js +12 -0
  71. package/dist/course-about/course-intro/constants.js.map +1 -0
  72. package/dist/course-about/course-intro/course-media/CourseMedia.d.ts +3 -0
  73. package/dist/course-about/course-intro/course-media/CourseMedia.js +17 -0
  74. package/dist/course-about/course-intro/course-media/CourseMedia.js.map +1 -0
  75. package/dist/course-about/course-intro/course-media/CourseMedia.scss +24 -0
  76. package/dist/course-about/course-intro/course-media/messages.d.ts +8 -0
  77. package/dist/course-about/course-intro/course-media/messages.js +10 -0
  78. package/dist/course-about/course-intro/course-media/messages.js.map +1 -0
  79. package/dist/course-about/course-intro/course-media/types.d.ts +8 -0
  80. package/dist/course-about/course-intro/course-media/types.js +2 -0
  81. package/dist/course-about/course-intro/course-media/types.js.map +1 -0
  82. package/dist/course-about/course-intro/course-media/utils.d.ts +12 -0
  83. package/dist/course-about/course-intro/course-media/utils.js +18 -0
  84. package/dist/course-about/course-intro/course-media/utils.js.map +1 -0
  85. package/dist/course-about/course-intro/hooks/index.d.ts +2 -0
  86. package/dist/course-about/course-intro/hooks/index.js +3 -0
  87. package/dist/course-about/course-intro/hooks/index.js.map +1 -0
  88. package/dist/course-about/course-intro/hooks/types.d.ts +16 -0
  89. package/dist/course-about/course-intro/hooks/types.js +2 -0
  90. package/dist/course-about/course-intro/hooks/types.js.map +1 -0
  91. package/dist/course-about/course-intro/hooks/useEnrollmentActions.d.ts +7 -0
  92. package/dist/course-about/course-intro/hooks/useEnrollmentActions.js +47 -0
  93. package/dist/course-about/course-intro/hooks/useEnrollmentActions.js.map +1 -0
  94. package/dist/course-about/course-intro/hooks/useEnrollmentStatus.d.ts +4 -0
  95. package/dist/course-about/course-intro/hooks/useEnrollmentStatus.js +35 -0
  96. package/dist/course-about/course-intro/hooks/useEnrollmentStatus.js.map +1 -0
  97. package/dist/course-about/course-intro/messages.d.ts +43 -0
  98. package/dist/course-about/course-intro/messages.js +45 -0
  99. package/dist/course-about/course-intro/messages.js.map +1 -0
  100. package/dist/course-about/course-intro/utils.d.ts +4 -0
  101. package/dist/course-about/course-intro/utils.js +7 -0
  102. package/dist/course-about/course-intro/utils.js.map +1 -0
  103. package/dist/course-about/course-overview/index.d.ts +2 -0
  104. package/dist/course-about/course-overview/index.js +21 -0
  105. package/dist/course-about/course-overview/index.js.map +1 -0
  106. package/dist/course-about/course-overview/types.d.ts +4 -0
  107. package/dist/course-about/course-overview/types.js +2 -0
  108. package/dist/course-about/course-overview/types.js.map +1 -0
  109. package/dist/course-about/course-overview/utils.d.ts +6 -0
  110. package/dist/course-about/course-overview/utils.js +12 -0
  111. package/dist/course-about/course-overview/utils.js.map +1 -0
  112. package/dist/course-about/course-sidebar/CourseSidebar.d.ts +5 -0
  113. package/dist/course-about/course-sidebar/CourseSidebar.js +7 -0
  114. package/dist/course-about/course-sidebar/CourseSidebar.js.map +1 -0
  115. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetails.d.ts +5 -0
  116. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetails.js +38 -0
  117. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetails.js.map +1 -0
  118. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetailsItem.d.ts +3 -0
  119. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetailsItem.js +5 -0
  120. package/dist/course-about/course-sidebar/sidebar-details/SidebarDetailsItem.js.map +1 -0
  121. package/dist/course-about/course-sidebar/sidebar-details/constants.d.ts +7 -0
  122. package/dist/course-about/course-sidebar/sidebar-details/constants.js +8 -0
  123. package/dist/course-about/course-sidebar/sidebar-details/constants.js.map +1 -0
  124. package/dist/course-about/course-sidebar/sidebar-details/messages.d.ts +43 -0
  125. package/dist/course-about/course-sidebar/sidebar-details/messages.js +45 -0
  126. package/dist/course-about/course-sidebar/sidebar-details/messages.js.map +1 -0
  127. package/dist/course-about/course-sidebar/sidebar-details/types.d.ts +8 -0
  128. package/dist/course-about/course-sidebar/sidebar-details/types.js +2 -0
  129. package/dist/course-about/course-sidebar/sidebar-details/types.js.map +1 -0
  130. package/dist/course-about/course-sidebar/sidebar-details/utils.d.ts +37 -0
  131. package/dist/course-about/course-sidebar/sidebar-details/utils.js +49 -0
  132. package/dist/course-about/course-sidebar/sidebar-details/utils.js.map +1 -0
  133. package/dist/course-about/course-sidebar/sidebar-social/SidebarSocial.d.ts +5 -0
  134. package/dist/course-about/course-sidebar/sidebar-social/SidebarSocial.js +14 -0
  135. package/dist/course-about/course-sidebar/sidebar-social/SidebarSocial.js.map +1 -0
  136. package/dist/course-about/course-sidebar/sidebar-social/SocialLinks.d.ts +5 -0
  137. package/dist/course-about/course-sidebar/sidebar-social/SocialLinks.js +5 -0
  138. package/dist/course-about/course-sidebar/sidebar-social/SocialLinks.js.map +1 -0
  139. package/dist/course-about/course-sidebar/sidebar-social/messages.d.ts +43 -0
  140. package/dist/course-about/course-sidebar/sidebar-social/messages.js +45 -0
  141. package/dist/course-about/course-sidebar/sidebar-social/messages.js.map +1 -0
  142. package/dist/course-about/course-sidebar/sidebar-social/types.d.ts +7 -0
  143. package/dist/course-about/course-sidebar/sidebar-social/types.js +2 -0
  144. package/dist/course-about/course-sidebar/sidebar-social/types.js.map +1 -0
  145. package/dist/course-about/course-sidebar/sidebar-social/utils.d.ts +23 -0
  146. package/dist/course-about/course-sidebar/sidebar-social/utils.js +71 -0
  147. package/dist/course-about/course-sidebar/sidebar-social/utils.js.map +1 -0
  148. package/dist/course-about/data/api.d.ts +10 -0
  149. package/dist/course-about/data/api.js +36 -0
  150. package/dist/course-about/data/api.js.map +1 -0
  151. package/dist/course-about/data/hooks.d.ts +3 -0
  152. package/dist/course-about/data/hooks.js +35 -0
  153. package/dist/course-about/data/hooks.js.map +1 -0
  154. package/dist/course-about/data/types.d.ts +10 -0
  155. package/dist/course-about/data/types.js +2 -0
  156. package/dist/course-about/data/types.js.map +1 -0
  157. package/dist/course-about/data/urls.d.ts +8 -0
  158. package/dist/course-about/data/urls.js +10 -0
  159. package/dist/course-about/data/urls.js.map +1 -0
  160. package/dist/course-about/layout.d.ts +31 -0
  161. package/dist/course-about/layout.js +11 -0
  162. package/dist/course-about/layout.js.map +1 -0
  163. package/dist/course-about/messages.d.ts +18 -0
  164. package/dist/course-about/messages.js +20 -0
  165. package/dist/course-about/messages.js.map +1 -0
  166. package/dist/course-about/types.d.ts +125 -0
  167. package/dist/course-about/types.js +2 -0
  168. package/dist/course-about/types.js.map +1 -0
  169. package/dist/data/course-list-search/api.d.ts +6 -0
  170. package/dist/data/course-list-search/api.js +33 -0
  171. package/dist/data/course-list-search/api.js.map +1 -0
  172. package/dist/data/course-list-search/constants.d.ts +2 -0
  173. package/dist/data/course-list-search/constants.js +3 -0
  174. package/dist/data/course-list-search/constants.js.map +1 -0
  175. package/dist/data/course-list-search/hooks.d.ts +5 -0
  176. package/dist/data/course-list-search/hooks.js +47 -0
  177. package/dist/data/course-list-search/hooks.js.map +1 -0
  178. package/dist/data/course-list-search/types.d.ts +65 -0
  179. package/dist/data/course-list-search/types.js +2 -0
  180. package/dist/data/course-list-search/types.js.map +1 -0
  181. package/dist/data/course-list-search/urls.d.ts +2 -0
  182. package/dist/data/course-list-search/urls.js +4 -0
  183. package/dist/data/course-list-search/urls.js.map +1 -0
  184. package/dist/data/course-list-search/utils.d.ts +9 -0
  185. package/dist/data/course-list-search/utils.js +40 -0
  186. package/dist/data/course-list-search/utils.js.map +1 -0
  187. package/dist/generic/alert-notification/index.d.ts +2 -0
  188. package/dist/generic/alert-notification/index.js +5 -0
  189. package/dist/generic/alert-notification/index.js.map +1 -0
  190. package/dist/generic/alert-notification/types.d.ts +6 -0
  191. package/dist/generic/alert-notification/types.js +2 -0
  192. package/dist/generic/alert-notification/types.js.map +1 -0
  193. package/dist/generic/course-card/index.d.ts +2 -0
  194. package/dist/generic/course-card/index.js +27 -0
  195. package/dist/generic/course-card/index.js.map +1 -0
  196. package/dist/generic/course-card/messages.d.ts +8 -0
  197. package/dist/generic/course-card/messages.js +10 -0
  198. package/dist/generic/course-card/messages.js.map +1 -0
  199. package/dist/generic/course-card/types.d.ts +35 -0
  200. package/dist/generic/course-card/types.js +2 -0
  201. package/dist/generic/course-card/types.js.map +1 -0
  202. package/dist/generic/course-card/utils.d.ts +10 -0
  203. package/dist/generic/course-card/utils.js +24 -0
  204. package/dist/generic/course-card/utils.js.map +1 -0
  205. package/dist/generic/index.d.ts +5 -0
  206. package/dist/generic/index.js +6 -0
  207. package/dist/generic/index.js.map +1 -0
  208. package/dist/generic/loading-spinner/index.d.ts +3 -0
  209. package/dist/generic/loading-spinner/index.js +10 -0
  210. package/dist/generic/loading-spinner/index.js.map +1 -0
  211. package/dist/generic/loading-spinner/messages.d.ts +8 -0
  212. package/dist/generic/loading-spinner/messages.js +10 -0
  213. package/dist/generic/loading-spinner/messages.js.map +1 -0
  214. package/dist/generic/loading-spinner/types.d.ts +3 -0
  215. package/dist/generic/loading-spinner/types.js +2 -0
  216. package/dist/generic/loading-spinner/types.js.map +1 -0
  217. package/dist/generic/sub-header/index.d.ts +2 -0
  218. package/dist/generic/sub-header/index.js +4 -0
  219. package/dist/generic/sub-header/index.js.map +1 -0
  220. package/dist/generic/sub-header/types.d.ts +4 -0
  221. package/dist/generic/sub-header/types.js +2 -0
  222. package/dist/generic/sub-header/types.js.map +1 -0
  223. package/dist/generic/video-modal/index.d.ts +2 -0
  224. package/dist/generic/video-modal/index.js +10 -0
  225. package/dist/generic/video-modal/index.js.map +1 -0
  226. package/dist/generic/video-modal/messages.d.ts +13 -0
  227. package/dist/generic/video-modal/messages.js +15 -0
  228. package/dist/generic/video-modal/messages.js.map +1 -0
  229. package/dist/generic/video-modal/types.d.ts +6 -0
  230. package/dist/generic/video-modal/types.js +2 -0
  231. package/dist/generic/video-modal/types.js.map +1 -0
  232. package/dist/home/HomePage.d.ts +2 -0
  233. package/dist/home/HomePage.js +14 -0
  234. package/dist/home/HomePage.js.map +1 -0
  235. package/dist/home/components/courses-list/CoursesList.d.ts +2 -0
  236. package/dist/home/components/courses-list/CoursesList.js +50 -0
  237. package/dist/home/components/courses-list/CoursesList.js.map +1 -0
  238. package/dist/home/components/courses-list/messages.d.ts +23 -0
  239. package/dist/home/components/courses-list/messages.js +25 -0
  240. package/dist/home/components/courses-list/messages.js.map +1 -0
  241. package/dist/home/components/home-banner/HomeBanner.d.ts +2 -0
  242. package/dist/home/components/home-banner/HomeBanner.js +25 -0
  243. package/dist/home/components/home-banner/HomeBanner.js.map +1 -0
  244. package/dist/home/components/home-banner/HomePageOverlay.d.ts +2 -0
  245. package/dist/home/components/home-banner/HomePageOverlay.js +10 -0
  246. package/dist/home/components/home-banner/HomePageOverlay.js.map +1 -0
  247. package/dist/home/components/home-banner/HomePromoVideoBtn.d.ts +3 -0
  248. package/dist/home/components/home-banner/HomePromoVideoBtn.js +10 -0
  249. package/dist/home/components/home-banner/HomePromoVideoBtn.js.map +1 -0
  250. package/dist/home/components/home-banner/index.scss +20 -0
  251. package/dist/home/components/home-banner/messages.d.ts +28 -0
  252. package/dist/home/components/home-banner/messages.js +30 -0
  253. package/dist/home/components/home-banner/messages.js.map +1 -0
  254. package/dist/home/components/home-banner/types.d.ts +3 -0
  255. package/dist/home/components/home-banner/types.js +2 -0
  256. package/dist/home/components/home-banner/types.js.map +1 -0
  257. package/dist/home/components/index.d.ts +2 -0
  258. package/dist/home/components/index.js +3 -0
  259. package/dist/home/components/index.js.map +1 -0
  260. package/dist/home/constants.d.ts +1 -0
  261. package/dist/home/constants.js +2 -0
  262. package/dist/home/constants.js.map +1 -0
  263. package/dist/home/messages.d.ts +8 -0
  264. package/dist/home/messages.js +10 -0
  265. package/dist/home/messages.js.map +1 -0
  266. package/dist/i18n/index.d.ts +1 -0
  267. package/dist/i18n/index.js +2 -0
  268. package/dist/i18n/index.js.map +1 -0
  269. package/dist/index.d.ts +23 -0
  270. package/dist/index.js +3 -0
  271. package/dist/index.js.map +1 -0
  272. package/dist/routes.d.ts +28 -0
  273. package/dist/routes.js +62 -0
  274. package/dist/routes.js.map +1 -0
  275. package/dist/slots/CourseAboutCourseImageSlot/index.d.ts +6 -0
  276. package/dist/slots/CourseAboutCourseImageSlot/index.js +9 -0
  277. package/dist/slots/CourseAboutCourseImageSlot/index.js.map +1 -0
  278. package/dist/slots/CourseAboutCourseMediaSlot/index.d.ts +9 -0
  279. package/dist/slots/CourseAboutCourseMediaSlot/index.js +6 -0
  280. package/dist/slots/CourseAboutCourseMediaSlot/index.js.map +1 -0
  281. package/dist/slots/CourseAboutEnrollmentButtonSlot/index.d.ts +10 -0
  282. package/dist/slots/CourseAboutEnrollmentButtonSlot/index.js +6 -0
  283. package/dist/slots/CourseAboutEnrollmentButtonSlot/index.js.map +1 -0
  284. package/dist/slots/CourseAboutIntroSlot/index.d.ts +6 -0
  285. package/dist/slots/CourseAboutIntroSlot/index.js +6 -0
  286. package/dist/slots/CourseAboutIntroSlot/index.js.map +1 -0
  287. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoButtonSlot/index.d.ts +6 -0
  288. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoButtonSlot/index.js +11 -0
  289. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoButtonSlot/index.js.map +1 -0
  290. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalContentSlot/index.d.ts +6 -0
  291. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalContentSlot/index.js +9 -0
  292. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalContentSlot/index.js.map +1 -0
  293. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalSlot/index.d.ts +6 -0
  294. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalSlot/index.js +6 -0
  295. package/dist/slots/CourseAboutIntroVideoSlots/CourseAboutIntroVideoModalSlot/index.js.map +1 -0
  296. package/dist/slots/CourseAboutIntroVideoSlots/index.d.ts +4 -0
  297. package/dist/slots/CourseAboutIntroVideoSlots/index.js +5 -0
  298. package/dist/slots/CourseAboutIntroVideoSlots/index.js.map +1 -0
  299. package/dist/slots/CourseAboutOverviewSlot/index.d.ts +6 -0
  300. package/dist/slots/CourseAboutOverviewSlot/index.js +6 -0
  301. package/dist/slots/CourseAboutOverviewSlot/index.js.map +1 -0
  302. package/dist/slots/CourseAboutSidebarCoursePriceSlot/index.d.ts +6 -0
  303. package/dist/slots/CourseAboutSidebarCoursePriceSlot/index.js +11 -0
  304. package/dist/slots/CourseAboutSidebarCoursePriceSlot/index.js.map +1 -0
  305. package/dist/slots/CourseAboutSidebarSlot/index.d.ts +6 -0
  306. package/dist/slots/CourseAboutSidebarSlot/index.js +6 -0
  307. package/dist/slots/CourseAboutSidebarSlot/index.js.map +1 -0
  308. package/dist/slots/CourseAboutSidebarSocialSlot/index.d.ts +6 -0
  309. package/dist/slots/CourseAboutSidebarSocialSlot/index.js +22 -0
  310. package/dist/slots/CourseAboutSidebarSocialSlot/index.js.map +1 -0
  311. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/CourseCatalogDataTableCourseCardSlot/index.d.ts +16 -0
  312. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/CourseCatalogDataTableCourseCardSlot/index.js +18 -0
  313. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/CourseCatalogDataTableCourseCardSlot/index.js.map +1 -0
  314. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/index.d.ts +6 -0
  315. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/index.js +11 -0
  316. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableCardViewSlot/index.js.map +1 -0
  317. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableControlBarSlot/index.d.ts +6 -0
  318. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableControlBarSlot/index.js +6 -0
  319. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableControlBarSlot/index.js.map +1 -0
  320. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableSlot/index.d.ts +23 -0
  321. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableSlot/index.js +17 -0
  322. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableSlot/index.js.map +1 -0
  323. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableTableFooterSlot/index.d.ts +2 -0
  324. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableTableFooterSlot/index.js +6 -0
  325. package/dist/slots/CourseCatalogDataTableSlots/CourseCatalogDataTableTableFooterSlot/index.js.map +1 -0
  326. package/dist/slots/CourseCatalogDataTableSlots/index.d.ts +6 -0
  327. package/dist/slots/CourseCatalogDataTableSlots/index.js +7 -0
  328. package/dist/slots/CourseCatalogDataTableSlots/index.js.map +1 -0
  329. package/dist/slots/CourseCatalogIntroSlot/index.d.ts +6 -0
  330. package/dist/slots/CourseCatalogIntroSlot/index.js +17 -0
  331. package/dist/slots/CourseCatalogIntroSlot/index.js.map +1 -0
  332. package/dist/slots/CourseCatalogSearchFieldSlot/index.d.ts +7 -0
  333. package/dist/slots/CourseCatalogSearchFieldSlot/index.js +21 -0
  334. package/dist/slots/CourseCatalogSearchFieldSlot/index.js.map +1 -0
  335. package/dist/slots/HomeBannerSlot/index.d.ts +2 -0
  336. package/dist/slots/HomeBannerSlot/index.js +6 -0
  337. package/dist/slots/HomeBannerSlot/index.js.map +1 -0
  338. package/dist/slots/HomeCourseCardSlot/index.d.ts +16 -0
  339. package/dist/slots/HomeCourseCardSlot/index.js +18 -0
  340. package/dist/slots/HomeCourseCardSlot/index.js.map +1 -0
  341. package/dist/slots/HomeCoursesListSlot/index.d.ts +2 -0
  342. package/dist/slots/HomeCoursesListSlot/index.js +6 -0
  343. package/dist/slots/HomeCoursesListSlot/index.js.map +1 -0
  344. package/dist/slots/HomeOverlayHtmlSlot/index.d.ts +2 -0
  345. package/dist/slots/HomeOverlayHtmlSlot/index.js +6 -0
  346. package/dist/slots/HomeOverlayHtmlSlot/index.js.map +1 -0
  347. package/dist/slots/HomePromoVideoSlots/HomePromoVideoButtonSlot/index.d.ts +4 -0
  348. package/dist/slots/HomePromoVideoSlots/HomePromoVideoButtonSlot/index.js +8 -0
  349. package/dist/slots/HomePromoVideoSlots/HomePromoVideoButtonSlot/index.js.map +1 -0
  350. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalContentSlot/index.d.ts +6 -0
  351. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalContentSlot/index.js +9 -0
  352. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalContentSlot/index.js.map +1 -0
  353. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalSlot/index.d.ts +6 -0
  354. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalSlot/index.js +6 -0
  355. package/dist/slots/HomePromoVideoSlots/HomePromoVideoModalSlot/index.js.map +1 -0
  356. package/dist/slots/HomePromoVideoSlots/index.d.ts +4 -0
  357. package/dist/slots/HomePromoVideoSlots/index.js +5 -0
  358. package/dist/slots/HomePromoVideoSlots/index.js.map +1 -0
  359. package/dist/slots/LoaderSlot/index.d.ts +3 -0
  360. package/dist/slots/LoaderSlot/index.js +4 -0
  361. package/dist/slots/LoaderSlot/index.js.map +1 -0
  362. package/dist/slots.d.ts +3 -0
  363. package/dist/slots.js +7 -0
  364. package/dist/slots.js.map +1 -0
  365. package/dist/style.scss +4 -0
  366. package/dist/utils.d.ts +6 -0
  367. package/dist/utils.js +9 -0
  368. package/dist/utils.js.map +1 -0
  369. package/dist/widgets/CatalogHeader/CoursesLinkMenuItem.d.ts +3 -0
  370. package/dist/widgets/CatalogHeader/CoursesLinkMenuItem.js +9 -0
  371. package/dist/widgets/CatalogHeader/CoursesLinkMenuItem.js.map +1 -0
  372. package/dist/widgets/CatalogHeader/DiscoverLinkMenuItem.d.ts +3 -0
  373. package/dist/widgets/CatalogHeader/DiscoverLinkMenuItem.js +9 -0
  374. package/dist/widgets/CatalogHeader/DiscoverLinkMenuItem.js.map +1 -0
  375. package/dist/widgets/CatalogHeader/ExploreCoursesLinkMenuItem.d.ts +3 -0
  376. package/dist/widgets/CatalogHeader/ExploreCoursesLinkMenuItem.js +9 -0
  377. package/dist/widgets/CatalogHeader/ExploreCoursesLinkMenuItem.js.map +1 -0
  378. package/dist/widgets/CatalogHeader/ProgramsLinkMenuItem.d.ts +3 -0
  379. package/dist/widgets/CatalogHeader/ProgramsLinkMenuItem.js +9 -0
  380. package/dist/widgets/CatalogHeader/ProgramsLinkMenuItem.js.map +1 -0
  381. package/dist/widgets/CatalogHeader/app.d.ts +3 -0
  382. package/dist/widgets/CatalogHeader/app.js +55 -0
  383. package/dist/widgets/CatalogHeader/app.js.map +1 -0
  384. package/dist/widgets/CatalogHeader/index.d.ts +1 -0
  385. package/dist/widgets/CatalogHeader/index.js +2 -0
  386. package/dist/widgets/CatalogHeader/index.js.map +1 -0
  387. package/dist/widgets/CatalogHeader/messages.d.ts +32 -0
  388. package/dist/widgets/CatalogHeader/messages.js +25 -0
  389. package/dist/widgets/CatalogHeader/messages.js.map +1 -0
  390. package/package.json +86 -0
@@ -0,0 +1,47 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useState, useCallback } from 'react';
3
+ import { fetchCourseListSearch } from './api';
4
+ import { DEFAULT_PAGE_SIZE, DEFAULT_PAGE_INDEX } from './constants';
5
+ import { transformDataTableFilters } from './utils';
6
+ /**
7
+ * A React Query hook that fetches course list search data.
8
+ */
9
+ export const useCourseListSearch = ({ pageSize = DEFAULT_PAGE_SIZE, pageIndex = DEFAULT_PAGE_INDEX, enableCourseSortingByStartDate = false, filters = {}, searchString = '', } = {}) => {
10
+ const [params, setParams] = useState({
11
+ pageSize,
12
+ pageIndex,
13
+ enableCourseSortingByStartDate,
14
+ filters,
15
+ searchString,
16
+ });
17
+ const { data, isLoading, isError, error, isFetching, } = useQuery({
18
+ queryKey: ['courseListSearch', params],
19
+ queryFn: () => fetchCourseListSearch(params),
20
+ placeholderData: (previousData) => previousData,
21
+ });
22
+ /**
23
+ * Updates query params and triggers data refetch if params have changed.
24
+ */
25
+ const fetchData = useCallback((newParams) => {
26
+ const transformedFilters = transformDataTableFilters(newParams.filters);
27
+ const transformedParams = {
28
+ pageSize: newParams.pageSize,
29
+ pageIndex: newParams.pageIndex,
30
+ filters: transformedFilters,
31
+ searchString: newParams.searchString || '',
32
+ };
33
+ setParams(prevParams => {
34
+ const hasChanged = JSON.stringify(prevParams) !== JSON.stringify(transformedParams);
35
+ return hasChanged ? transformedParams : prevParams;
36
+ });
37
+ }, []);
38
+ return {
39
+ data,
40
+ isLoading,
41
+ isError,
42
+ error,
43
+ fetchData,
44
+ isFetching,
45
+ };
46
+ };
47
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/data/course-list-search/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,QAAQ,GAAG,iBAAiB,EAC5B,SAAS,GAAG,kBAAkB,EAC9B,8BAA8B,GAAG,KAAK,EACtC,OAAO,GAAG,EAAE,EACZ,YAAY,GAAG,EAAE,MACkB,EAAE,EAAwB,EAAE;IAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB;QAC3D,QAAQ;QACR,SAAS;QACT,8BAA8B;QAC9B,OAAO;QACP,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,EACJ,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAC5C,GAAG,QAAQ,CAAkC;QAC5C,QAAQ,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACtC,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;QAC5C,eAAe,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY;KAChD,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,SAAsD,EAAE,EAAE;QACvF,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAExE,MAAM,iBAAiB,GAA2B;YAChD,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,OAAO,EAAE,kBAAkB;YAC3B,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,EAAE;SAC3C,CAAC;QAEF,SAAS,CAAC,UAAU,CAAC,EAAE;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACpF,OAAO,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,IAAI;QACJ,SAAS;QACT,OAAO;QACP,KAAK;QACL,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { useState, useCallback } from 'react';\n\nimport { fetchCourseListSearch } from './api';\nimport { DEFAULT_PAGE_SIZE, DEFAULT_PAGE_INDEX } from './constants';\nimport type {\n CourseListSearchResponse, CourseListSearchParams, CourseListSearchHook, DataTableParams,\n} from './types';\nimport { transformDataTableFilters } from './utils';\n\n/**\n * A React Query hook that fetches course list search data.\n */\nexport const useCourseListSearch = ({\n pageSize = DEFAULT_PAGE_SIZE,\n pageIndex = DEFAULT_PAGE_INDEX,\n enableCourseSortingByStartDate = false,\n filters = {},\n searchString = '',\n}: Partial<CourseListSearchParams> = {}): CourseListSearchHook => {\n const [params, setParams] = useState<CourseListSearchParams>({\n pageSize,\n pageIndex,\n enableCourseSortingByStartDate,\n filters,\n searchString,\n });\n\n const {\n data, isLoading, isError, error, isFetching,\n } = useQuery<CourseListSearchResponse, Error>({\n queryKey: ['courseListSearch', params],\n queryFn: () => fetchCourseListSearch(params),\n placeholderData: (previousData) => previousData,\n });\n\n /**\n * Updates query params and triggers data refetch if params have changed.\n */\n const fetchData = useCallback((newParams: DataTableParams & { searchString?: string }) => {\n const transformedFilters = transformDataTableFilters(newParams.filters);\n\n const transformedParams: CourseListSearchParams = {\n pageSize: newParams.pageSize,\n pageIndex: newParams.pageIndex,\n filters: transformedFilters,\n searchString: newParams.searchString || '',\n };\n\n setParams(prevParams => {\n const hasChanged = JSON.stringify(prevParams) !== JSON.stringify(transformedParams);\n return hasChanged ? transformedParams : prevParams;\n });\n }, []);\n\n return {\n data,\n isLoading,\n isError,\n error,\n fetchData,\n isFetching,\n };\n};\n"]}
@@ -0,0 +1,65 @@
1
+ export interface CourseListSearchResponse {
2
+ took: number;
3
+ total: number;
4
+ results: {
5
+ id: string;
6
+ index: string;
7
+ type: string;
8
+ title: string;
9
+ data: {
10
+ id: string;
11
+ course: string;
12
+ start: string;
13
+ imageUrl: string;
14
+ org: string;
15
+ orgImageUrl?: string;
16
+ advertisedStart?: string;
17
+ content: {
18
+ displayName: string;
19
+ overview?: string;
20
+ number?: string;
21
+ };
22
+ number: string;
23
+ modes: string[];
24
+ language: string;
25
+ catalogVisibility: string;
26
+ };
27
+ }[];
28
+ aggs: Record<string, {
29
+ terms: Record<string, number>;
30
+ total: number;
31
+ other: number;
32
+ }>;
33
+ maxScore: number;
34
+ }
35
+ export type Aggregations = Record<string, {
36
+ terms: Record<string, number>;
37
+ }>;
38
+ export interface CourseListSearchParams {
39
+ pageSize?: number;
40
+ pageIndex?: number;
41
+ filters?: Record<string, string[]>;
42
+ enableCourseSortingByStartDate?: boolean;
43
+ searchString?: string;
44
+ }
45
+ export interface DataTableParams {
46
+ pageSize?: number;
47
+ pageIndex?: number;
48
+ filters?: {
49
+ id: string;
50
+ value: string | string[];
51
+ }[];
52
+ searchString?: string;
53
+ }
54
+ export interface CourseListSearchHook {
55
+ data: CourseListSearchResponse | undefined;
56
+ isLoading: boolean;
57
+ isFetching: boolean;
58
+ isError: boolean;
59
+ error: Error | null;
60
+ fetchData: (params: DataTableParams) => void;
61
+ }
62
+ export interface DataTableFilter {
63
+ id: string;
64
+ value: string | string[];
65
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/data/course-list-search/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CourseListSearchResponse {\n took: number,\n total: number,\n results: {\n id: string,\n index: string,\n type: string,\n title: string,\n data: {\n id: string,\n course: string,\n start: string,\n imageUrl: string,\n org: string,\n orgImageUrl?: string,\n advertisedStart?: string,\n content: {\n displayName: string,\n overview?: string,\n number?: string,\n },\n number: string,\n modes: string[],\n language: string,\n catalogVisibility: string,\n },\n }[],\n aggs: Record<string, {\n terms: Record<string, number>,\n total: number,\n other: number,\n }>,\n maxScore: number,\n}\n\nexport type Aggregations = Record<string, {\n terms: Record<string, number>,\n}>;\n\nexport interface CourseListSearchParams {\n pageSize?: number,\n pageIndex?: number,\n filters?: Record<string, string[]>,\n enableCourseSortingByStartDate?: boolean,\n searchString?: string,\n}\n\nexport interface DataTableParams {\n pageSize?: number,\n pageIndex?: number,\n filters?: {\n id: string,\n value: string | string[],\n }[],\n searchString?: string,\n}\n\nexport interface CourseListSearchHook {\n data: CourseListSearchResponse | undefined,\n isLoading: boolean,\n isFetching: boolean,\n isError: boolean,\n error: Error | null,\n fetchData: (params: DataTableParams) => void,\n}\n\nexport interface DataTableFilter {\n id: string,\n value: string | string[],\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const getApiBaseUrl: () => string;
2
+ export declare const getCourseListSearchUrl: () => string;
@@ -0,0 +1,4 @@
1
+ import { getSiteConfig } from '@openedx/frontend-base';
2
+ export const getApiBaseUrl = () => getSiteConfig().lmsBaseUrl;
3
+ export const getCourseListSearchUrl = () => `${getApiBaseUrl()}/search/unstable/v0/course_list_search/`;
4
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../src/data/course-list-search/urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC;AAE9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,GAAG,aAAa,EAAE,yCAAyC,CAAC","sourcesContent":["import { getSiteConfig } from '@openedx/frontend-base';\n\nexport const getApiBaseUrl = () => getSiteConfig().lmsBaseUrl;\n\nexport const getCourseListSearchUrl = () => `${getApiBaseUrl()}/search/unstable/v0/course_list_search/`;\n"]}
@@ -0,0 +1,9 @@
1
+ import type { DataTableFilter } from './types';
2
+ /**
3
+ * Appends filters to the FormData object for backend requests.
4
+ */
5
+ export declare const addFiltersToFormData: (formData: FormData, filters: Record<string, string[]>) => void;
6
+ /**
7
+ * Transforms DataTable filters array into a Record<string, string[]> for API.
8
+ */
9
+ export declare const transformDataTableFilters: (filters?: DataTableFilter[]) => Record<string, string[]>;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Checks if a value is valid.
3
+ */
4
+ const isValidValue = (value) => value !== undefined && value !== null && value !== '';
5
+ /**
6
+ * Appends filters to the FormData object for backend requests.
7
+ */
8
+ export const addFiltersToFormData = (formData, filters) => {
9
+ if (!filters || typeof filters !== 'object') {
10
+ return;
11
+ }
12
+ Object.entries(filters).forEach(([filterKey, filterValues]) => {
13
+ if (Array.isArray(filterValues)) {
14
+ filterValues
15
+ .filter(isValidValue)
16
+ .forEach(value => formData.append(filterKey, value));
17
+ }
18
+ else if (isValidValue(filterValues)) {
19
+ formData.append(filterKey, filterValues);
20
+ }
21
+ });
22
+ };
23
+ /**
24
+ * Transforms DataTable filters array into a Record<string, string[]> for API.
25
+ */
26
+ export const transformDataTableFilters = (filters) => {
27
+ if (!filters) {
28
+ return {};
29
+ }
30
+ const grouped = {};
31
+ filters.forEach(({ id, value }) => {
32
+ if (!grouped[id]) {
33
+ grouped[id] = new Set();
34
+ }
35
+ const values = Array.isArray(value) ? value : [value];
36
+ values.filter(isValidValue).forEach(v => grouped[id].add(v));
37
+ });
38
+ return Object.fromEntries(Object.entries(grouped).map(([id, set]) => [id, Array.from(set)]));
39
+ };
40
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/data/course-list-search/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,YAAY,GAAG,CACnB,KAAqC,EAC5B,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAAkB,EAClB,OAAiC,EAC3B,EAAE;IACR,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,YAAY;iBACT,MAAM,CAAC,YAAY,CAAC;iBACpB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAA2B,EACD,EAAE;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAgC,EAAE,CAAC;IAEhD,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { DataTableFilter } from './types';\n\n/**\n * Checks if a value is valid.\n */\nconst isValidValue = (\n value: string | undefined | null | '',\n): boolean => value !== undefined && value !== null && value !== '';\n\n/**\n * Appends filters to the FormData object for backend requests.\n */\nexport const addFiltersToFormData = (\n formData: FormData,\n filters: Record<string, string[]>,\n): void => {\n if (!filters || typeof filters !== 'object') {\n return;\n }\n\n Object.entries(filters).forEach(([filterKey, filterValues]) => {\n if (Array.isArray(filterValues)) {\n filterValues\n .filter(isValidValue)\n .forEach(value => formData.append(filterKey, value));\n } else if (isValidValue(filterValues)) {\n formData.append(filterKey, filterValues);\n }\n });\n};\n\n/**\n * Transforms DataTable filters array into a Record<string, string[]> for API.\n */\nexport const transformDataTableFilters = (\n filters?: DataTableFilter[],\n): Record<string, string[]> => {\n if (!filters) {\n return {};\n }\n\n const grouped: Record<string, Set<string>> = {};\n\n filters.forEach(({ id, value }) => {\n if (!grouped[id]) {\n grouped[id] = new Set();\n }\n\n const values = Array.isArray(value) ? value : [value];\n values.filter(isValidValue).forEach(v => grouped[id].add(v));\n });\n\n return Object.fromEntries(\n Object.entries(grouped).map(([id, set]) => [id, Array.from(set)]),\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import type { AlertNotificationProps } from './types';
2
+ export declare const AlertNotification: ({ variant, title, message, className, }: AlertNotificationProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert as BaseAlert } from '@openedx/paragon';
3
+ import { Info as InfoIcon } from '@openedx/paragon/icons';
4
+ export const AlertNotification = ({ variant = 'info', title, message, className = '', }) => (_jsxs(BaseAlert, { variant: variant, icon: InfoIcon, className: className, children: [_jsx(BaseAlert.Heading, { children: title }), _jsx("p", { children: message })] }));
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generic/alert-notification/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAI1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,GACzB,EAAE,EAAE,CAAC,CAC5B,MAAC,SAAS,IAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,aAC/D,KAAC,SAAS,CAAC,OAAO,cAAE,KAAK,GAAqB,EAC9C,sBAAI,OAAO,GAAK,IACN,CACb,CAAC","sourcesContent":["import { Alert as BaseAlert } from '@openedx/paragon';\nimport { Info as InfoIcon } from '@openedx/paragon/icons';\n\nimport type { AlertNotificationProps } from './types';\n\nexport const AlertNotification = ({\n variant = 'info', title, message, className = '',\n}: AlertNotificationProps) => (\n <BaseAlert variant={variant} icon={InfoIcon} className={className}>\n <BaseAlert.Heading>{title}</BaseAlert.Heading>\n <p>{message}</p>\n </BaseAlert>\n);\n"]}
@@ -0,0 +1,6 @@
1
+ export interface AlertNotificationProps {
2
+ variant?: 'info' | 'warning';
3
+ title: string;
4
+ message: string;
5
+ className?: string;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generic/alert-notification/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface AlertNotificationProps {\n variant?: 'info' | 'warning',\n title: string,\n message: string,\n className?: string,\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { CourseCardProps } from './types';
2
+ export declare const CourseCard: ({ isLoading, courseId, courseOrg, courseName, courseNumber, courseImageUrl, courseStartDate, courseAdvertisedStart, }: CourseCardProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from 'react-router-dom';
3
+ import { Card, useMediaQuery, breakpoints, Badge, } from '@openedx/paragon';
4
+ import { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';
5
+ import noCourseImg from '../../assets/images/no-course-image.svg';
6
+ import { courseAboutRole } from '../../constants';
7
+ import messages from './messages';
8
+ import { getFullImageUrl, getStartDateDisplay } from './utils';
9
+ export const CourseCard = ({ isLoading, courseId, courseOrg, courseName, courseNumber, courseImageUrl, courseStartDate, courseAdvertisedStart, }) => {
10
+ var _a;
11
+ const intl = useIntl();
12
+ const isExtraSmall = useMediaQuery({ maxWidth: breakpoints.small.maxWidth });
13
+ const startDateDisplay = (courseStartDate || courseAdvertisedStart) ? getStartDateDisplay({
14
+ start: courseStartDate,
15
+ advertisedStart: courseAdvertisedStart,
16
+ }, intl) : null;
17
+ const courseAboutUrl = courseId
18
+ ? (_a = getUrlByRouteRole(courseAboutRole)) === null || _a === void 0 ? void 0 : _a.replace(':courseId', courseId)
19
+ : undefined;
20
+ return (_jsxs(Card, { as: courseAboutUrl ? Link : 'div', to: courseAboutUrl,
21
+ // TODO: Temporary use of `d-flex` to fix alignment. Remove once the related Paragon issue
22
+ // (https://github.com/openedx/paragon/issues/3792) is resolved.
23
+ className: `course-card d-flex ${isExtraSmall ? 'w-100' : 'course-card-desktop'}`, isClickable: !isLoading, isLoading: isLoading, "data-testid": "course-card", children: [_jsx(Card.ImageCap, { src: getFullImageUrl(courseImageUrl), fallbackSrc: noCourseImg, srcAlt: `${courseName} ${courseNumber}`, skeletonDuringImageLoad: true }), _jsx(Card.Header, { title: courseName, subtitle: (_jsxs(_Fragment, { children: [_jsx("div", { children: courseNumber }), _jsx(Badge, { variant: "light", children: courseOrg })] })), size: "sm" }), _jsx(Card.Section, {}), _jsx(Card.Footer, { textElement: startDateDisplay && intl.formatMessage(messages.startDate, {
24
+ startDate: startDateDisplay,
25
+ }) })] }));
26
+ };
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generic/course-card/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EACL,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,GACxC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,WAAW,MAAM,wCAAwC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,qBAAqB,GACL,EAAE,EAAE;;IACpB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,CAAC,eAAe,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACxF,KAAK,EAAE,eAAe;QACtB,eAAe,EAAE,qBAAqB;KACvC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhB,MAAM,cAAc,GAAG,QAAQ;QAC7B,CAAC,CAAC,MAAA,iBAAiB,CAAC,eAAe,CAAC,0CAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;QACpE,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,CACL,MAAC,IAAI,IACH,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EACjC,EAAE,EAAE,cAAc;QAClB,0FAA0F;QAC1F,gEAAgE;QAChE,SAAS,EAAE,sBAAsB,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE,EACjF,WAAW,EAAE,CAAC,SAAS,EACvB,SAAS,EAAE,SAAS,iBACR,aAAa,aAEzB,KAAC,IAAI,CAAC,QAAQ,IACZ,GAAG,EAAE,eAAe,CAAC,cAAc,CAAC,EACpC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,GAAG,UAAU,IAAI,YAAY,EAAE,EACvC,uBAAuB,SACvB,EACF,KAAC,IAAI,CAAC,MAAM,IACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CACR,8BACE,wBAAM,YAAY,GAAO,EACzB,KAAC,KAAK,IAAC,OAAO,EAAC,OAAO,YAAE,SAAS,GAAS,IACzC,CACJ,EACD,IAAI,EAAC,IAAI,GACT,EACF,KAAC,IAAI,CAAC,OAAO,KAAG,EAChB,KAAC,IAAI,CAAC,MAAM,IAAC,WAAW,EAAE,gBAAgB,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE;oBACnF,SAAS,EAAE,gBAAgB;iBAC5B,CAAC,GACA,IACG,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Link } from 'react-router-dom';\nimport {\n Card, useMediaQuery, breakpoints, Badge,\n} from '@openedx/paragon';\nimport { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';\n\nimport noCourseImg from '@src/assets/images/no-course-image.svg';\nimport { courseAboutRole } from '@src/constants';\n\nimport type { CourseCardProps } from './types';\nimport messages from './messages';\nimport { getFullImageUrl, getStartDateDisplay } from './utils';\n\nexport const CourseCard = ({\n isLoading,\n courseId,\n courseOrg,\n courseName,\n courseNumber,\n courseImageUrl,\n courseStartDate,\n courseAdvertisedStart,\n}: CourseCardProps) => {\n const intl = useIntl();\n const isExtraSmall = useMediaQuery({ maxWidth: breakpoints.small.maxWidth });\n\n const startDateDisplay = (courseStartDate || courseAdvertisedStart) ? getStartDateDisplay({\n start: courseStartDate,\n advertisedStart: courseAdvertisedStart,\n }, intl) : null;\n\n const courseAboutUrl = courseId\n ? getUrlByRouteRole(courseAboutRole)?.replace(':courseId', courseId)\n : undefined;\n\n return (\n <Card\n as={courseAboutUrl ? Link : 'div'}\n to={courseAboutUrl}\n // TODO: Temporary use of `d-flex` to fix alignment. Remove once the related Paragon issue\n // (https://github.com/openedx/paragon/issues/3792) is resolved.\n className={`course-card d-flex ${isExtraSmall ? 'w-100' : 'course-card-desktop'}`}\n isClickable={!isLoading}\n isLoading={isLoading}\n data-testid=\"course-card\"\n >\n <Card.ImageCap\n src={getFullImageUrl(courseImageUrl)}\n fallbackSrc={noCourseImg}\n srcAlt={`${courseName} ${courseNumber}`}\n skeletonDuringImageLoad\n />\n <Card.Header\n title={courseName}\n subtitle={(\n <>\n <div>{courseNumber}</div>\n <Badge variant=\"light\">{courseOrg}</Badge>\n </>\n )}\n size=\"sm\"\n />\n <Card.Section />\n <Card.Footer textElement={startDateDisplay && intl.formatMessage(messages.startDate, {\n startDate: startDateDisplay,\n })}\n />\n </Card>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ declare const messages: {
2
+ startDate: {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ };
8
+ export default messages;
@@ -0,0 +1,10 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ startDate: {
4
+ id: 'generic.course-card.start-date',
5
+ defaultMessage: 'Starts: {startDate}',
6
+ description: 'Start date.',
7
+ },
8
+ });
9
+ export default messages;
10
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/generic/course-card/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,SAAS,EAAE;QACT,EAAE,EAAE,gCAAgC;QACpC,cAAc,EAAE,qBAAqB;QACrC,WAAW,EAAE,aAAa;KAC3B;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n startDate: {\n id: 'generic.course-card.start-date',\n defaultMessage: 'Starts: {startDate}',\n description: 'Start date.',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,35 @@
1
+ export interface CourseContent {
2
+ displayName: string;
3
+ overview?: string;
4
+ number?: string;
5
+ }
6
+ export interface CourseData {
7
+ id: string;
8
+ course: string;
9
+ start: string;
10
+ imageUrl: string;
11
+ org: string;
12
+ orgImageUrl?: string;
13
+ advertisedStart?: string;
14
+ content: CourseContent;
15
+ number: string;
16
+ modes: string[];
17
+ language: string;
18
+ catalogVisibility: string;
19
+ }
20
+ export interface Course {
21
+ id: string;
22
+ index?: string;
23
+ type?: string;
24
+ data: CourseData;
25
+ }
26
+ export interface CourseCardProps {
27
+ isLoading?: boolean;
28
+ courseId?: string;
29
+ courseOrg?: string;
30
+ courseName?: string;
31
+ courseNumber?: string;
32
+ courseImageUrl?: string;
33
+ courseStartDate?: string;
34
+ courseAdvertisedStart?: string;
35
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generic/course-card/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface CourseContent {\n displayName: string,\n overview?: string,\n number?: string,\n}\n\nexport interface CourseData {\n id: string,\n course: string,\n start: string,\n imageUrl: string,\n org: string,\n orgImageUrl?: string,\n advertisedStart?: string,\n content: CourseContent,\n number: string,\n modes: string[],\n language: string,\n catalogVisibility: string,\n}\n\nexport interface Course {\n id: string,\n index?: string,\n type?: string,\n data: CourseData,\n}\n\nexport interface CourseCardProps {\n isLoading?: boolean,\n courseId?: string,\n courseOrg?: string,\n courseName?: string,\n courseNumber?: string,\n courseImageUrl?: string,\n courseStartDate?: string,\n courseAdvertisedStart?: string,\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { type IntlShape } from '../../utils';
2
+ import type { Course } from './types';
3
+ /**
4
+ * Constructs a full URL for an image by combining the LMS base URL with the provided image path.
5
+ */
6
+ export declare const getFullImageUrl: (path?: string) => string;
7
+ /**
8
+ * Constructs a start date display for a course by combining the advertised start date and the start date.
9
+ */
10
+ export declare const getStartDateDisplay: (courseData: Partial<Pick<Course["data"], "advertisedStart" | "start">>, intl: IntlShape) => string;
@@ -0,0 +1,24 @@
1
+ import { getSiteConfig } from '@openedx/frontend-base';
2
+ import { formatDate } from '../../utils';
3
+ /**
4
+ * Constructs a full URL for an image by combining the LMS base URL with the provided image path.
5
+ */
6
+ export const getFullImageUrl = (path) => {
7
+ if (!path) {
8
+ return '';
9
+ }
10
+ return `${getSiteConfig().lmsBaseUrl}${path}`;
11
+ };
12
+ /**
13
+ * Constructs a start date display for a course by combining the advertised start date and the start date.
14
+ */
15
+ export const getStartDateDisplay = (courseData, intl) => {
16
+ if (courseData === null || courseData === void 0 ? void 0 : courseData.advertisedStart) {
17
+ return courseData.advertisedStart;
18
+ }
19
+ if (courseData === null || courseData === void 0 ? void 0 : courseData.start) {
20
+ return formatDate(courseData.start, intl);
21
+ }
22
+ return '';
23
+ };
24
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/generic/course-card/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAGxD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAa,EAAE,EAAE;IAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,aAAa,EAAE,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAAsE,EACtE,IAAe,EACf,EAAE;IACF,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,eAAe,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,eAAe,CAAC;IACpC,CAAC;IAED,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import { getSiteConfig } from '@openedx/frontend-base';\n\nimport { formatDate, type IntlShape } from '@src/utils';\nimport type { Course } from './types';\n\n/**\n * Constructs a full URL for an image by combining the LMS base URL with the provided image path.\n */\nexport const getFullImageUrl = (path?: string) => {\n if (!path) {\n return '';\n }\n return `${getSiteConfig().lmsBaseUrl}${path}`;\n};\n\n/**\n * Constructs a start date display for a course by combining the advertised start date and the start date.\n */\nexport const getStartDateDisplay = (\n courseData: Partial<Pick<Course['data'], 'advertisedStart' | 'start'>>,\n intl: IntlShape,\n) => {\n if (courseData?.advertisedStart) {\n return courseData.advertisedStart;\n }\n\n if (courseData?.start) {\n return formatDate(courseData.start, intl);\n }\n\n return '';\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export { CourseCard } from './course-card';
2
+ export { AlertNotification } from './alert-notification';
3
+ export { VideoModal } from './video-modal';
4
+ export { Loading, LoadingSpinner } from './loading-spinner';
5
+ export { SubHeader } from './sub-header';
@@ -0,0 +1,6 @@
1
+ export { CourseCard } from './course-card';
2
+ export { AlertNotification } from './alert-notification';
3
+ export { VideoModal } from './video-modal';
4
+ export { Loading, LoadingSpinner } from './loading-spinner';
5
+ export { SubHeader } from './sub-header';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { CourseCard } from './course-card';\nexport { AlertNotification } from './alert-notification';\nexport { VideoModal } from './video-modal';\nexport { Loading, LoadingSpinner } from './loading-spinner';\nexport { SubHeader } from './sub-header';\n"]}
@@ -0,0 +1,3 @@
1
+ import type { LoadingSpinnerProps } from './types';
2
+ export declare const LoadingSpinner: ({ size }: LoadingSpinnerProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const Loading: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Spinner } from '@openedx/paragon';
3
+ import { useIntl } from '@openedx/frontend-base';
4
+ import messages from './messages';
5
+ export const LoadingSpinner = ({ size }) => {
6
+ const intl = useIntl();
7
+ return (_jsx(Spinner, { animation: "border", role: "status", size: size, screenReaderText: intl.formatMessage(messages.screenReaderText) }));
8
+ };
9
+ export const Loading = () => (_jsx("div", { className: "d-flex justify-content-center align-items-center flex-column vh-100", children: _jsx(LoadingSpinner, {}) }));
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generic/loading-spinner/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,QAAQ,MAAM,YAAY,CAAC;AAGlC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAuB,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,KAAC,OAAO,IACN,SAAS,EAAC,QAAQ,EAClB,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAC/D,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,CAC3B,cAAK,SAAS,EAAC,qEAAqE,YAClF,KAAC,cAAc,KAAG,GACd,CACP,CAAC","sourcesContent":["import { Spinner } from '@openedx/paragon';\nimport { useIntl } from '@openedx/frontend-base';\n\nimport messages from './messages';\nimport type { LoadingSpinnerProps } from './types';\n\nexport const LoadingSpinner = ({ size }: LoadingSpinnerProps) => {\n const intl = useIntl();\n\n return (\n <Spinner\n animation=\"border\"\n role=\"status\"\n size={size}\n screenReaderText={intl.formatMessage(messages.screenReaderText)}\n />\n );\n};\n\nexport const Loading = () => (\n <div className=\"d-flex justify-content-center align-items-center flex-column vh-100\">\n <LoadingSpinner />\n </div>\n);\n"]}
@@ -0,0 +1,8 @@
1
+ declare const messages: {
2
+ screenReaderText: {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ };
8
+ export default messages;
@@ -0,0 +1,10 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ screenReaderText: {
4
+ id: 'category.generic.loading',
5
+ defaultMessage: 'Loading...',
6
+ description: 'Screen-reader message for when a page is loading.',
7
+ },
8
+ });
9
+ export default messages;
10
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/generic/loading-spinner/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,gBAAgB,EAAE;QAChB,EAAE,EAAE,0BAA0B;QAC9B,cAAc,EAAE,YAAY;QAC5B,WAAW,EAAE,mDAAmD;KACjE;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n screenReaderText: {\n id: 'category.generic.loading',\n defaultMessage: 'Loading...',\n description: 'Screen-reader message for when a page is loading.',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,3 @@
1
+ export interface LoadingSpinnerProps {
2
+ size?: 'sm' | undefined;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generic/loading-spinner/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface LoadingSpinnerProps {\n size?: 'sm' | undefined,\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { SubHeaderProps } from './types';
2
+ export declare const SubHeader: ({ title, className }: SubHeaderProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from 'classnames';
3
+ export const SubHeader = ({ title, className }) => (_jsx("header", { className: classNames('mb-5 d-flex justify-content-between', className), children: _jsx("h1", { className: "mb-0", children: title }) }));
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generic/sub-header/index.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAkB,EAAE,EAAE,CAAC,CACjE,iBAAQ,SAAS,EAAE,UAAU,CAAC,qCAAqC,EAAE,SAAS,CAAC,YAC7E,aAAI,SAAS,EAAC,MAAM,YAAE,KAAK,GAAM,GAC1B,CACV,CAAC","sourcesContent":["import classNames from 'classnames';\n\nimport type { SubHeaderProps } from './types';\n\nexport const SubHeader = ({ title, className }: SubHeaderProps) => (\n <header className={classNames('mb-5 d-flex justify-content-between', className)}>\n <h1 className=\"mb-0\">{title}</h1>\n </header>\n);\n"]}
@@ -0,0 +1,4 @@
1
+ export interface SubHeaderProps {
2
+ title: string;
3
+ className?: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generic/sub-header/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SubHeaderProps {\n title: string,\n className?: string,\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { VideoModalProps } from './types';
2
+ export declare const VideoModal: ({ isOpen, close, size, children, }: VideoModalProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useIntl } from '@openedx/frontend-base';
3
+ import { ModalDialog } from '@openedx/paragon';
4
+ import { DEFAULT_VIDEO_MODAL_SIZE } from '../../constants';
5
+ import messages from './messages';
6
+ export const VideoModal = ({ isOpen, close, size = DEFAULT_VIDEO_MODAL_SIZE, children, }) => {
7
+ const intl = useIntl();
8
+ return (_jsx(ModalDialog, { title: intl.formatMessage(messages.videoModalTitle), size: size, isOpen: isOpen || false, onClose: close, hasCloseButton: false, isOverflowVisible: false, className: "bg-transparent shadow-none", children: children }));
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generic/video-modal/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,wBAAwB,EAAE,QAAQ,GACxC,EAAE,EAAE;IACpB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,EACnD,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,IAAI,KAAK,EACvB,OAAO,EAAE,KAAK,EACd,cAAc,EAAE,KAAK,EACrB,iBAAiB,EAAE,KAAK,EACxB,SAAS,EAAC,4BAA4B,YAErC,QAAQ,GACG,CACf,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport { ModalDialog } from '@openedx/paragon';\n\nimport { DEFAULT_VIDEO_MODAL_SIZE } from '@src/constants';\nimport type { VideoModalProps } from './types';\nimport messages from './messages';\n\nexport const VideoModal = ({\n isOpen, close, size = DEFAULT_VIDEO_MODAL_SIZE, children,\n}: VideoModalProps) => {\n const intl = useIntl();\n\n return (\n <ModalDialog\n title={intl.formatMessage(messages.videoModalTitle)}\n size={size}\n isOpen={isOpen || false}\n onClose={close}\n hasCloseButton={false}\n isOverflowVisible={false}\n className=\"bg-transparent shadow-none\"\n >\n {children}\n </ModalDialog>\n );\n};\n"]}
@@ -0,0 +1,13 @@
1
+ declare const messages: {
2
+ videoModalTitle: {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ videoIframeTitle: {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ };
13
+ export default messages;
@@ -0,0 +1,15 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ videoModalTitle: {
4
+ id: 'catalog.home-page.video-modal-title',
5
+ defaultMessage: 'Video modal',
6
+ description: 'Title text displayed inside the modal when the promo video is opened.',
7
+ },
8
+ videoIframeTitle: {
9
+ id: 'catalog.home-page.video-iframe-title',
10
+ defaultMessage: 'YouTube video player',
11
+ description: 'Title attribute for the embedded YouTube iframe video player.',
12
+ },
13
+ });
14
+ export default messages;
15
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/generic/video-modal/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,eAAe,EAAE;QACf,EAAE,EAAE,qCAAqC;QACzC,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,uEAAuE;KACrF;IACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,sCAAsC;QAC1C,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE,+DAA+D;KAC7E;CACF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n videoModalTitle: {\n id: 'catalog.home-page.video-modal-title',\n defaultMessage: 'Video modal',\n description: 'Title text displayed inside the modal when the promo video is opened.',\n },\n videoIframeTitle: {\n id: 'catalog.home-page.video-iframe-title',\n defaultMessage: 'YouTube video player',\n description: 'Title attribute for the embedded YouTube iframe video player.',\n },\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,6 @@
1
+ export interface VideoModalProps {
2
+ children: React.ReactNode;
3
+ isOpen: boolean;
4
+ close: () => void;
5
+ size?: 'sm' | 'md' | 'lg';
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generic/video-modal/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface VideoModalProps {\n children: React.ReactNode,\n isOpen: boolean,\n close: () => void,\n size?: 'sm' | 'md' | 'lg',\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const HomePage: () => import("react/jsx-runtime").JSX.Element;
2
+ export default HomePage;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Helmet } from 'react-helmet';
3
+ import { getSiteConfig, useIntl } from '@openedx/frontend-base';
4
+ import HomeBannerSlot from '../slots/HomeBannerSlot';
5
+ import HomeCoursesListSlot from '../slots/HomeCoursesListSlot';
6
+ import messages from './messages';
7
+ const HomePage = () => {
8
+ const { formatMessage } = useIntl();
9
+ return (_jsxs(_Fragment, { children: [_jsx(Helmet, { children: _jsx("title", { children: formatMessage(messages.pageTitle, {
10
+ siteName: getSiteConfig().siteName,
11
+ }) }) }), _jsx(HomeBannerSlot, {}), _jsx(HomeCoursesListSlot, {})] }));
12
+ };
13
+ export default HomePage;
14
+ //# sourceMappingURL=HomePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomePage.js","sourceRoot":"","sources":["../../src/home/HomePage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,mBAAmB,MAAM,gCAAgC,CAAC;AAEjE,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,QAAQ,GAAG,GAAG,EAAE;IACpB,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,OAAO,CACL,8BACE,KAAC,MAAM,cACL,0BACG,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE;wBACjC,QAAQ,EAAE,aAAa,EAAE,CAAC,QAAQ;qBACnC,CAAC,GACI,GACD,EACT,KAAC,cAAc,KAAG,EAClB,KAAC,mBAAmB,KAAG,IACtB,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import { Helmet } from 'react-helmet';\nimport { getSiteConfig, useIntl } from '@openedx/frontend-base';\n\nimport HomeBannerSlot from '@src/slots/HomeBannerSlot';\nimport HomeCoursesListSlot from '@src/slots/HomeCoursesListSlot';\n\nimport messages from './messages';\n\nconst HomePage = () => {\n const { formatMessage } = useIntl();\n\n return (\n <>\n <Helmet>\n <title>\n {formatMessage(messages.pageTitle, {\n siteName: getSiteConfig().siteName,\n })}\n </title>\n </Helmet>\n <HomeBannerSlot />\n <HomeCoursesListSlot />\n </>\n );\n};\n\nexport default HomePage;\n"]}