@openedx/frontend-app-gradebook 2.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 (350) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +279 -0
  3. package/dist/Main.d.ts +3 -0
  4. package/dist/Main.js +17 -0
  5. package/dist/Main.js.map +1 -0
  6. package/dist/app.d.ts +3 -0
  7. package/dist/app.js +10 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.d.ts +5 -0
  10. package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.js +20 -0
  11. package/dist/components/BulkManagementHistoryView/BulkManagementAlerts.js.map +1 -0
  12. package/dist/components/BulkManagementHistoryView/BulkManagementHistoryView.scss +6 -0
  13. package/dist/components/BulkManagementHistoryView/HistoryTable.d.ts +33 -0
  14. package/dist/components/BulkManagementHistoryView/HistoryTable.js +53 -0
  15. package/dist/components/BulkManagementHistoryView/HistoryTable.js.map +1 -0
  16. package/dist/components/BulkManagementHistoryView/ResultsSummary.d.ts +16 -0
  17. package/dist/components/BulkManagementHistoryView/ResultsSummary.js +19 -0
  18. package/dist/components/BulkManagementHistoryView/ResultsSummary.js.map +1 -0
  19. package/dist/components/BulkManagementHistoryView/data/api.d.ts +5 -0
  20. package/dist/components/BulkManagementHistoryView/data/api.js +16 -0
  21. package/dist/components/BulkManagementHistoryView/data/api.js.map +1 -0
  22. package/dist/components/BulkManagementHistoryView/data/apiHook.d.ts +16 -0
  23. package/dist/components/BulkManagementHistoryView/data/apiHook.js +34 -0
  24. package/dist/components/BulkManagementHistoryView/data/apiHook.js.map +1 -0
  25. package/dist/components/BulkManagementHistoryView/data/queryKeys.d.ts +5 -0
  26. package/dist/components/BulkManagementHistoryView/data/queryKeys.js +7 -0
  27. package/dist/components/BulkManagementHistoryView/data/queryKeys.js.map +1 -0
  28. package/dist/components/BulkManagementHistoryView/data/utils.d.ts +34 -0
  29. package/dist/components/BulkManagementHistoryView/data/utils.js +45 -0
  30. package/dist/components/BulkManagementHistoryView/data/utils.js.map +1 -0
  31. package/dist/components/BulkManagementHistoryView/index.d.ts +2 -0
  32. package/dist/components/BulkManagementHistoryView/index.js +12 -0
  33. package/dist/components/BulkManagementHistoryView/index.js.map +1 -0
  34. package/dist/components/BulkManagementHistoryView/messages.d.ts +24 -0
  35. package/dist/components/BulkManagementHistoryView/messages.js +20 -0
  36. package/dist/components/BulkManagementHistoryView/messages.js.map +1 -0
  37. package/dist/components/GradebookFilters/AssignmentFilter/index.d.ts +10 -0
  38. package/dist/components/GradebookFilters/AssignmentFilter/index.js +31 -0
  39. package/dist/components/GradebookFilters/AssignmentFilter/index.js.map +1 -0
  40. package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.d.ts +19 -0
  41. package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.js +31 -0
  42. package/dist/components/GradebookFilters/AssignmentGradeFilter/hooks.js.map +1 -0
  43. package/dist/components/GradebookFilters/AssignmentGradeFilter/index.d.ts +10 -0
  44. package/dist/components/GradebookFilters/AssignmentGradeFilter/index.js +17 -0
  45. package/dist/components/GradebookFilters/AssignmentGradeFilter/index.js.map +1 -0
  46. package/dist/components/GradebookFilters/AssignmentTypeFilter/index.d.ts +10 -0
  47. package/dist/components/GradebookFilters/AssignmentTypeFilter/index.js +38 -0
  48. package/dist/components/GradebookFilters/AssignmentTypeFilter/index.js.map +1 -0
  49. package/dist/components/GradebookFilters/CourseGradeFilter/hooks.d.ts +15 -0
  50. package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js +34 -0
  51. package/dist/components/GradebookFilters/CourseGradeFilter/hooks.js.map +1 -0
  52. package/dist/components/GradebookFilters/CourseGradeFilter/index.d.ts +10 -0
  53. package/dist/components/GradebookFilters/CourseGradeFilter/index.js +17 -0
  54. package/dist/components/GradebookFilters/CourseGradeFilter/index.js.map +1 -0
  55. package/dist/components/GradebookFilters/GradebookFilters.scss +6 -0
  56. package/dist/components/GradebookFilters/PercentGroup.d.ts +22 -0
  57. package/dist/components/GradebookFilters/PercentGroup.js +16 -0
  58. package/dist/components/GradebookFilters/PercentGroup.js.map +1 -0
  59. package/dist/components/GradebookFilters/SelectGroup.d.ts +24 -0
  60. package/dist/components/GradebookFilters/SelectGroup.js +17 -0
  61. package/dist/components/GradebookFilters/SelectGroup.js.map +1 -0
  62. package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.d.ts +16 -0
  63. package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.js +46 -0
  64. package/dist/components/GradebookFilters/StudentGroupsFilter/hooks.js.map +1 -0
  65. package/dist/components/GradebookFilters/StudentGroupsFilter/index.d.ts +10 -0
  66. package/dist/components/GradebookFilters/StudentGroupsFilter/index.js +23 -0
  67. package/dist/components/GradebookFilters/StudentGroupsFilter/index.js.map +1 -0
  68. package/dist/components/GradebookFilters/data/api.d.ts +10 -0
  69. package/dist/components/GradebookFilters/data/api.js +27 -0
  70. package/dist/components/GradebookFilters/data/api.js.map +1 -0
  71. package/dist/components/GradebookFilters/data/apiHook.d.ts +16 -0
  72. package/dist/components/GradebookFilters/data/apiHook.js +24 -0
  73. package/dist/components/GradebookFilters/data/apiHook.js.map +1 -0
  74. package/dist/components/GradebookFilters/data/hooks.d.ts +7 -0
  75. package/dist/components/GradebookFilters/data/hooks.js +53 -0
  76. package/dist/components/GradebookFilters/data/hooks.js.map +1 -0
  77. package/dist/components/GradebookFilters/data/queryKeys.d.ts +10 -0
  78. package/dist/components/GradebookFilters/data/queryKeys.js +12 -0
  79. package/dist/components/GradebookFilters/data/queryKeys.js.map +1 -0
  80. package/dist/components/GradebookFilters/index.d.ts +10 -0
  81. package/dist/components/GradebookFilters/index.js +32 -0
  82. package/dist/components/GradebookFilters/index.js.map +1 -0
  83. package/dist/components/GradebookFilters/messages.d.ts +112 -0
  84. package/dist/components/GradebookFilters/messages.js +75 -0
  85. package/dist/components/GradebookFilters/messages.js.map +1 -0
  86. package/dist/components/GradebookHeader/hooks.d.ts +13 -0
  87. package/dist/components/GradebookHeader/hooks.js +28 -0
  88. package/dist/components/GradebookHeader/hooks.js.map +1 -0
  89. package/dist/components/GradebookHeader/index.d.ts +2 -0
  90. package/dist/components/GradebookHeader/index.js +14 -0
  91. package/dist/components/GradebookHeader/index.js.map +1 -0
  92. package/dist/components/GradebookHeader/messages.d.ts +48 -0
  93. package/dist/components/GradebookHeader/messages.js +35 -0
  94. package/dist/components/GradebookHeader/messages.js.map +1 -0
  95. package/dist/components/GradesView/BulkManagementControls/index.d.ts +2 -0
  96. package/dist/components/GradesView/BulkManagementControls/index.js +26 -0
  97. package/dist/components/GradesView/BulkManagementControls/index.js.map +1 -0
  98. package/dist/components/GradesView/BulkManagementControls/messages.d.ts +8 -0
  99. package/dist/components/GradesView/BulkManagementControls/messages.js +10 -0
  100. package/dist/components/GradesView/BulkManagementControls/messages.js.map +1 -0
  101. package/dist/components/GradesView/EditModal/HistoryHeader.d.ts +21 -0
  102. package/dist/components/GradesView/EditModal/HistoryHeader.js +20 -0
  103. package/dist/components/GradesView/EditModal/HistoryHeader.js.map +1 -0
  104. package/dist/components/GradesView/EditModal/ModalHeaders.d.ts +3 -0
  105. package/dist/components/GradesView/EditModal/ModalHeaders.js +26 -0
  106. package/dist/components/GradesView/EditModal/ModalHeaders.js.map +1 -0
  107. package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.d.ts +5 -0
  108. package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.js +23 -0
  109. package/dist/components/GradesView/EditModal/OverrideTable/AdjustedGradeInput/index.js.map +1 -0
  110. package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.d.ts +6 -0
  111. package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.js +25 -0
  112. package/dist/components/GradesView/EditModal/OverrideTable/ReasonInput/index.js.map +1 -0
  113. package/dist/components/GradesView/EditModal/OverrideTable/index.d.ts +5 -0
  114. package/dist/components/GradesView/EditModal/OverrideTable/index.js +39 -0
  115. package/dist/components/GradesView/EditModal/OverrideTable/index.js.map +1 -0
  116. package/dist/components/GradesView/EditModal/OverrideTable/messages.d.ts +32 -0
  117. package/dist/components/GradesView/EditModal/OverrideTable/messages.js +25 -0
  118. package/dist/components/GradesView/EditModal/OverrideTable/messages.js.map +1 -0
  119. package/dist/components/GradesView/EditModal/index.d.ts +2 -0
  120. package/dist/components/GradesView/EditModal/index.js +35 -0
  121. package/dist/components/GradesView/EditModal/index.js.map +1 -0
  122. package/dist/components/GradesView/EditModal/messages.d.ts +72 -0
  123. package/dist/components/GradesView/EditModal/messages.js +50 -0
  124. package/dist/components/GradesView/EditModal/messages.js.map +1 -0
  125. package/dist/components/GradesView/FilterBadges/FilterBadge.d.ts +9 -0
  126. package/dist/components/GradesView/FilterBadges/FilterBadge.js +27 -0
  127. package/dist/components/GradesView/FilterBadges/FilterBadge.js.map +1 -0
  128. package/dist/components/GradesView/FilterBadges/index.d.ts +8 -0
  129. package/dist/components/GradesView/FilterBadges/index.js +15 -0
  130. package/dist/components/GradesView/FilterBadges/index.js.map +1 -0
  131. package/dist/components/GradesView/FilterMenuToggle/index.d.ts +5 -0
  132. package/dist/components/GradesView/FilterMenuToggle/index.js +18 -0
  133. package/dist/components/GradesView/FilterMenuToggle/index.js.map +1 -0
  134. package/dist/components/GradesView/FilterMenuToggle/messages.d.ts +8 -0
  135. package/dist/components/GradesView/FilterMenuToggle/messages.js +10 -0
  136. package/dist/components/GradesView/FilterMenuToggle/messages.js.map +1 -0
  137. package/dist/components/GradesView/FilteredUsersLabel/index.d.ts +15 -0
  138. package/dist/components/GradesView/FilteredUsersLabel/index.js +27 -0
  139. package/dist/components/GradesView/FilteredUsersLabel/index.js.map +1 -0
  140. package/dist/components/GradesView/FilteredUsersLabel/messages.d.ts +8 -0
  141. package/dist/components/GradesView/FilteredUsersLabel/messages.js +10 -0
  142. package/dist/components/GradesView/FilteredUsersLabel/messages.js.map +1 -0
  143. package/dist/components/GradesView/GradebookTable/Fields.d.ts +2 -0
  144. package/dist/components/GradesView/GradebookTable/Fields.js +32 -0
  145. package/dist/components/GradesView/GradebookTable/Fields.js.map +1 -0
  146. package/dist/components/GradesView/GradebookTable/GradeButton.d.ts +26 -0
  147. package/dist/components/GradesView/GradebookTable/GradeButton.js +56 -0
  148. package/dist/components/GradesView/GradebookTable/GradeButton.js.map +1 -0
  149. package/dist/components/GradesView/GradebookTable/LabelReplacements.d.ts +3 -0
  150. package/dist/components/GradesView/GradebookTable/LabelReplacements.js +42 -0
  151. package/dist/components/GradesView/GradebookTable/LabelReplacements.js.map +1 -0
  152. package/dist/components/GradesView/GradebookTable/hooks.d.ts +11 -0
  153. package/dist/components/GradesView/GradebookTable/hooks.js +45 -0
  154. package/dist/components/GradesView/GradebookTable/hooks.js.map +1 -0
  155. package/dist/components/GradesView/GradebookTable/index.d.ts +5 -0
  156. package/dist/components/GradesView/GradebookTable/index.js +16 -0
  157. package/dist/components/GradesView/GradebookTable/index.js.map +1 -0
  158. package/dist/components/GradesView/GradebookTable/messages.d.ts +64 -0
  159. package/dist/components/GradesView/GradebookTable/messages.js +45 -0
  160. package/dist/components/GradesView/GradebookTable/messages.js.map +1 -0
  161. package/dist/components/GradesView/GradesView.scss +156 -0
  162. package/dist/components/GradesView/ImportGradesButton/index.d.ts +5 -0
  163. package/dist/components/GradesView/ImportGradesButton/index.js +38 -0
  164. package/dist/components/GradesView/ImportGradesButton/index.js.map +1 -0
  165. package/dist/components/GradesView/ImportGradesButton/messages.d.ts +16 -0
  166. package/dist/components/GradesView/ImportGradesButton/messages.js +15 -0
  167. package/dist/components/GradesView/ImportGradesButton/messages.js.map +1 -0
  168. package/dist/components/GradesView/ImportSuccessToast/hooks.d.ts +10 -0
  169. package/dist/components/GradesView/ImportSuccessToast/hooks.js +31 -0
  170. package/dist/components/GradesView/ImportSuccessToast/hooks.js.map +1 -0
  171. package/dist/components/GradesView/ImportSuccessToast/index.d.ts +5 -0
  172. package/dist/components/GradesView/ImportSuccessToast/index.js +15 -0
  173. package/dist/components/GradesView/ImportSuccessToast/index.js.map +1 -0
  174. package/dist/components/GradesView/ImportSuccessToast/messages.d.ts +17 -0
  175. package/dist/components/GradesView/ImportSuccessToast/messages.js +15 -0
  176. package/dist/components/GradesView/ImportSuccessToast/messages.js.map +1 -0
  177. package/dist/components/GradesView/InterventionsReport/index.d.ts +2 -0
  178. package/dist/components/GradesView/InterventionsReport/index.js +27 -0
  179. package/dist/components/GradesView/InterventionsReport/index.js.map +1 -0
  180. package/dist/components/GradesView/InterventionsReport/messages.d.ts +25 -0
  181. package/dist/components/GradesView/InterventionsReport/messages.js +20 -0
  182. package/dist/components/GradesView/InterventionsReport/messages.js.map +1 -0
  183. package/dist/components/GradesView/PageButtons/index.d.ts +5 -0
  184. package/dist/components/GradesView/PageButtons/index.js +14 -0
  185. package/dist/components/GradesView/PageButtons/index.js.map +1 -0
  186. package/dist/components/GradesView/PageButtons/messages.d.ts +16 -0
  187. package/dist/components/GradesView/PageButtons/messages.js +15 -0
  188. package/dist/components/GradesView/PageButtons/messages.js.map +1 -0
  189. package/dist/components/GradesView/ScoreViewInput/index.d.ts +5 -0
  190. package/dist/components/GradesView/ScoreViewInput/index.js +20 -0
  191. package/dist/components/GradesView/ScoreViewInput/index.js.map +1 -0
  192. package/dist/components/GradesView/ScoreViewInput/messages.d.ts +24 -0
  193. package/dist/components/GradesView/ScoreViewInput/messages.js +20 -0
  194. package/dist/components/GradesView/ScoreViewInput/messages.js.map +1 -0
  195. package/dist/components/GradesView/SearchControls/hooks.d.ts +9 -0
  196. package/dist/components/GradesView/SearchControls/hooks.js +34 -0
  197. package/dist/components/GradesView/SearchControls/hooks.js.map +1 -0
  198. package/dist/components/GradesView/SearchControls/index.d.ts +5 -0
  199. package/dist/components/GradesView/SearchControls/index.js +14 -0
  200. package/dist/components/GradesView/SearchControls/index.js.map +1 -0
  201. package/dist/components/GradesView/SearchControls/messages.d.ts +16 -0
  202. package/dist/components/GradesView/SearchControls/messages.js +15 -0
  203. package/dist/components/GradesView/SearchControls/messages.js.map +1 -0
  204. package/dist/components/GradesView/SpinnerIcon.d.ts +5 -0
  205. package/dist/components/GradesView/SpinnerIcon.js +15 -0
  206. package/dist/components/GradesView/SpinnerIcon.js.map +1 -0
  207. package/dist/components/GradesView/StatusAlerts/index.d.ts +5 -0
  208. package/dist/components/GradesView/StatusAlerts/index.js +16 -0
  209. package/dist/components/GradesView/StatusAlerts/index.js.map +1 -0
  210. package/dist/components/GradesView/StatusAlerts/messages.d.ts +24 -0
  211. package/dist/components/GradesView/StatusAlerts/messages.js +20 -0
  212. package/dist/components/GradesView/StatusAlerts/messages.js.map +1 -0
  213. package/dist/components/GradesView/data/api.d.ts +44 -0
  214. package/dist/components/GradesView/data/api.js +64 -0
  215. package/dist/components/GradesView/data/api.js.map +1 -0
  216. package/dist/components/GradesView/data/apiHook.d.ts +92 -0
  217. package/dist/components/GradesView/data/apiHook.js +191 -0
  218. package/dist/components/GradesView/data/apiHook.js.map +1 -0
  219. package/dist/components/GradesView/data/hooks.d.ts +32 -0
  220. package/dist/components/GradesView/data/hooks.js +242 -0
  221. package/dist/components/GradesView/data/hooks.js.map +1 -0
  222. package/dist/components/GradesView/data/queryKeys.d.ts +13 -0
  223. package/dist/components/GradesView/data/queryKeys.js +15 -0
  224. package/dist/components/GradesView/data/queryKeys.js.map +1 -0
  225. package/dist/components/GradesView/data/utils.d.ts +96 -0
  226. package/dist/components/GradesView/data/utils.js +103 -0
  227. package/dist/components/GradesView/data/utils.js.map +1 -0
  228. package/dist/components/GradesView/index.d.ts +10 -0
  229. package/dist/components/GradesView/index.js +35 -0
  230. package/dist/components/GradesView/index.js.map +1 -0
  231. package/dist/components/GradesView/messages.d.ts +24 -0
  232. package/dist/components/GradesView/messages.js +20 -0
  233. package/dist/components/GradesView/messages.js.map +1 -0
  234. package/dist/components/NetworkButton/index.d.ts +23 -0
  235. package/dist/components/NetworkButton/index.js +54 -0
  236. package/dist/components/NetworkButton/index.js.map +1 -0
  237. package/dist/components/WithSidebar/WithSidebar.scss +36 -0
  238. package/dist/components/WithSidebar/index.d.ts +9 -0
  239. package/dist/components/WithSidebar/index.js +34 -0
  240. package/dist/components/WithSidebar/index.js.map +1 -0
  241. package/dist/constants.d.ts +1 -0
  242. package/dist/constants.js +2 -0
  243. package/dist/constants.js.map +1 -0
  244. package/dist/containers/GradebookPage/GradebookDataLoader.d.ts +10 -0
  245. package/dist/containers/GradebookPage/GradebookDataLoader.js +19 -0
  246. package/dist/containers/GradebookPage/GradebookDataLoader.js.map +1 -0
  247. package/dist/containers/GradebookPage/index.d.ts +2 -0
  248. package/dist/containers/GradebookPage/index.js +40 -0
  249. package/dist/containers/GradebookPage/index.js.map +1 -0
  250. package/dist/data/api.d.ts +20 -0
  251. package/dist/data/api.js +36 -0
  252. package/dist/data/api.js.map +1 -0
  253. package/dist/data/apiHook.d.ts +40 -0
  254. package/dist/data/apiHook.js +65 -0
  255. package/dist/data/apiHook.js.map +1 -0
  256. package/dist/data/constants/app.d.ts +13 -0
  257. package/dist/data/constants/app.js +58 -0
  258. package/dist/data/constants/app.js.map +1 -0
  259. package/dist/data/constants/errors.d.ts +2 -0
  260. package/dist/data/constants/errors.js +3 -0
  261. package/dist/data/constants/errors.js.map +1 -0
  262. package/dist/data/constants/filters.d.ts +15 -0
  263. package/dist/data/constants/filters.js +71 -0
  264. package/dist/data/constants/filters.js.map +1 -0
  265. package/dist/data/constants/filters.messages.d.ts +56 -0
  266. package/dist/data/constants/filters.messages.js +40 -0
  267. package/dist/data/constants/filters.messages.js.map +1 -0
  268. package/dist/data/constants/grades.d.ts +6 -0
  269. package/dist/data/constants/grades.js +17 -0
  270. package/dist/data/constants/grades.js.map +1 -0
  271. package/dist/data/filtersContext.d.ts +60 -0
  272. package/dist/data/filtersContext.js +212 -0
  273. package/dist/data/filtersContext.js.map +1 -0
  274. package/dist/data/filtersSnapshot.d.ts +20 -0
  275. package/dist/data/filtersSnapshot.js +15 -0
  276. package/dist/data/filtersSnapshot.js.map +1 -0
  277. package/dist/data/formatUtils.d.ts +15 -0
  278. package/dist/data/formatUtils.js +35 -0
  279. package/dist/data/formatUtils.js.map +1 -0
  280. package/dist/data/gradebookUiContext.d.ts +99 -0
  281. package/dist/data/gradebookUiContext.js +143 -0
  282. package/dist/data/gradebookUiContext.js.map +1 -0
  283. package/dist/data/queryClient.d.ts +10 -0
  284. package/dist/data/queryClient.js +34 -0
  285. package/dist/data/queryClient.js.map +1 -0
  286. package/dist/data/queryKeys.d.ts +11 -0
  287. package/dist/data/queryKeys.js +21 -0
  288. package/dist/data/queryKeys.js.map +1 -0
  289. package/dist/data/services/lms/api.d.ts +2 -0
  290. package/dist/data/services/lms/api.js +104 -0
  291. package/dist/data/services/lms/api.js.map +1 -0
  292. package/dist/data/services/lms/constants.d.ts +3 -0
  293. package/dist/data/services/lms/constants.js +16 -0
  294. package/dist/data/services/lms/constants.js.map +1 -0
  295. package/dist/data/services/lms/index.d.ts +2 -0
  296. package/dist/data/services/lms/index.js +8 -0
  297. package/dist/data/services/lms/index.js.map +1 -0
  298. package/dist/data/services/lms/messages.d.ts +2 -0
  299. package/dist/data/services/lms/messages.js +8 -0
  300. package/dist/data/services/lms/messages.js.map +1 -0
  301. package/dist/data/services/lms/urls.d.ts +19 -0
  302. package/dist/data/services/lms/urls.js +47 -0
  303. package/dist/data/services/lms/urls.js.map +1 -0
  304. package/dist/data/services/lms/utils.d.ts +4 -0
  305. package/dist/data/services/lms/utils.js +34 -0
  306. package/dist/data/services/lms/utils.js.map +1 -0
  307. package/dist/data/services/segment/constants.d.ts +8 -0
  308. package/dist/data/services/segment/constants.js +26 -0
  309. package/dist/data/services/segment/constants.js.map +1 -0
  310. package/dist/data/services/segment/events.d.ts +14 -0
  311. package/dist/data/services/segment/events.js +32 -0
  312. package/dist/data/services/segment/events.js.map +1 -0
  313. package/dist/data/utils.d.ts +10 -0
  314. package/dist/data/utils.js +14 -0
  315. package/dist/data/utils.js.map +1 -0
  316. package/dist/i18n/index.d.ts +1 -0
  317. package/dist/i18n/index.js +2 -0
  318. package/dist/i18n/index.js.map +1 -0
  319. package/dist/i18n/utils.d.ts +2 -0
  320. package/dist/i18n/utils.js +21 -0
  321. package/dist/i18n/utils.js.map +1 -0
  322. package/dist/index.d.ts +3 -0
  323. package/dist/index.js +4 -0
  324. package/dist/index.js.map +1 -0
  325. package/dist/messages.d.ts +8 -0
  326. package/dist/messages.js +10 -0
  327. package/dist/messages.js.map +1 -0
  328. package/dist/providers.d.ts +3 -0
  329. package/dist/providers.js +13 -0
  330. package/dist/providers.js.map +1 -0
  331. package/dist/routes.d.ts +11 -0
  332. package/dist/routes.js +16 -0
  333. package/dist/routes.js.map +1 -0
  334. package/dist/style.scss +13 -0
  335. package/dist/utils/StrictDict.d.ts +2 -0
  336. package/dist/utils/StrictDict.js +19 -0
  337. package/dist/utils/StrictDict.js.map +1 -0
  338. package/dist/utils/formatDate.d.ts +15 -0
  339. package/dist/utils/formatDate.js +19 -0
  340. package/dist/utils/formatDate.js.map +1 -0
  341. package/dist/utils/hoc.d.ts +3 -0
  342. package/dist/utils/hoc.js +21 -0
  343. package/dist/utils/hoc.js.map +1 -0
  344. package/dist/utils/index.d.ts +3 -0
  345. package/dist/utils/index.js +4 -0
  346. package/dist/utils/index.js.map +1 -0
  347. package/dist/utils/keyStore.d.ts +2 -0
  348. package/dist/utils/keyStore.js +4 -0
  349. package/dist/utils/keyStore.js.map +1 -0
  350. package/package.json +89 -0
@@ -0,0 +1,34 @@
1
+ import { QueryClient } from '@tanstack/react-query';
2
+ /**
3
+ * isClientError(error)
4
+ * True for 4xx responses, which are not worth retrying (bad request, auth,
5
+ * not found, etc.). Server (5xx) and network errors remain retryable.
6
+ */
7
+ const isClientError = (error) => {
8
+ var _a;
9
+ const status = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status;
10
+ return typeof status === 'number' && status >= 400 && status < 500;
11
+ };
12
+ /**
13
+ * Application-wide React Query client.
14
+ *
15
+ * Defaults are promoted here (rather than repeated per hook) to keep individual
16
+ * query hooks lean: cache server data for 5 minutes and skip retries on 4xx.
17
+ */
18
+ export const makeQueryClient = () => new QueryClient({
19
+ defaultOptions: {
20
+ queries: {
21
+ staleTime: 5 * 60 * 1000, // 5 minutes
22
+ refetchOnWindowFocus: false,
23
+ retry: (failureCount, error) => {
24
+ if (isClientError(error)) {
25
+ return false;
26
+ }
27
+ return failureCount < 3;
28
+ },
29
+ },
30
+ },
31
+ });
32
+ const queryClient = makeQueryClient();
33
+ export default queryClient;
34
+ //# sourceMappingURL=queryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryClient.js","sourceRoot":"","sources":["../../src/data/queryClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAUpD;;;;GAIG;AACH,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE;;IAChD,MAAM,MAAM,GAAG,MAAC,KAAuB,aAAvB,KAAK,uBAAL,KAAK,CAAoB,QAAQ,0CAAE,MAAM,CAAC;IAC1D,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAgB,EAAE,CAAC,IAAI,WAAW,CAAC;IAChE,cAAc,EAAE;QACd,OAAO,EAAE;YACP,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;YACtC,oBAAoB,EAAE,KAAK;YAC3B,KAAK,EAAE,CAAC,YAAoB,EAAE,KAAc,EAAE,EAAE;gBAC9C,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,YAAY,GAAG,CAAC,CAAC;YAC1B,CAAC;SACF;KACF;CACF,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;AAEtC,eAAe,WAAW,CAAC","sourcesContent":["import { QueryClient } from '@tanstack/react-query';\n\n/**\n * Shape of the subset of an Axios-style error we inspect to decide retries.\n * We only need the HTTP status, so we avoid a hard dependency on axios types.\n */\ninterface HttpErrorLike {\n response?: { status?: number };\n}\n\n/**\n * isClientError(error)\n * True for 4xx responses, which are not worth retrying (bad request, auth,\n * not found, etc.). Server (5xx) and network errors remain retryable.\n */\nconst isClientError = (error: unknown): boolean => {\n const status = (error as HttpErrorLike)?.response?.status;\n return typeof status === 'number' && status >= 400 && status < 500;\n};\n\n/**\n * Application-wide React Query client.\n *\n * Defaults are promoted here (rather than repeated per hook) to keep individual\n * query hooks lean: cache server data for 5 minutes and skip retries on 4xx.\n */\nexport const makeQueryClient = (): QueryClient => new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n refetchOnWindowFocus: false,\n retry: (failureCount: number, error: unknown) => {\n if (isClientError(error)) {\n return false;\n }\n return failureCount < 3;\n },\n },\n },\n});\n\nconst queryClient = makeQueryClient();\n\nexport default queryClient;\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const BASE_KEY: readonly ["gradebook"];
2
+ /** Roles-based "can view the gradebook" permission gate (the fetch-cascade root). */
3
+ export declare const rolesQueryKeys: {
4
+ all: readonly ["gradebook"];
5
+ byCourse: (courseId: string) => readonly ["gradebook", string, "roles"];
6
+ };
7
+ /** Assignment types + grades-frozen / bulk-management flags (app-wide config). */
8
+ export declare const assignmentTypesQueryKeys: {
9
+ all: readonly ["gradebook"];
10
+ byCourse: (courseId: string) => readonly ["gradebook", string, "assignmentTypes"];
11
+ };
@@ -0,0 +1,21 @@
1
+ // Top-level (app-wide) query-key factories, mirroring the instructor dashboard's
2
+ // `src/data/queryKeys.ts`: shared server-state that multiple features gate on
3
+ // lives here (the roles permission gate + the assignment-types/config bundle used
4
+ // by the header, filters, and bulk-management views).
5
+ //
6
+ // Keys are namespaced under `BASE_KEY` and scoped by `courseId` so React Query
7
+ // caches independently per course and mutations can invalidate a whole course
8
+ // subtree via a broad prefix. The array shapes match the legacy
9
+ // `gradebookQueryKeys` so cache identity / invalidation is preserved.
10
+ export const BASE_KEY = ['gradebook'];
11
+ /** Roles-based "can view the gradebook" permission gate (the fetch-cascade root). */
12
+ export const rolesQueryKeys = {
13
+ all: BASE_KEY,
14
+ byCourse: (courseId) => [...BASE_KEY, courseId, 'roles'],
15
+ };
16
+ /** Assignment types + grades-frozen / bulk-management flags (app-wide config). */
17
+ export const assignmentTypesQueryKeys = {
18
+ all: BASE_KEY,
19
+ byCourse: (courseId) => [...BASE_KEY, courseId, 'assignmentTypes'],
20
+ };
21
+ //# sourceMappingURL=queryKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryKeys.js","sourceRoot":"","sources":["../../src/data/queryKeys.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8EAA8E;AAC9E,kFAAkF;AAClF,sDAAsD;AACtD,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,gEAAgE;AAChE,sEAAsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAU,CAAC;AAE/C,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU;CAC1E,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,CAAU;CACpF,CAAC","sourcesContent":["// Top-level (app-wide) query-key factories, mirroring the instructor dashboard's\n// `src/data/queryKeys.ts`: shared server-state that multiple features gate on\n// lives here (the roles permission gate + the assignment-types/config bundle used\n// by the header, filters, and bulk-management views).\n//\n// Keys are namespaced under `BASE_KEY` and scoped by `courseId` so React Query\n// caches independently per course and mutations can invalidate a whole course\n// subtree via a broad prefix. The array shapes match the legacy\n// `gradebookQueryKeys` so cache identity / invalidation is preserved.\nexport const BASE_KEY = ['gradebook'] as const;\n\n/** Roles-based \"can view the gradebook\" permission gate (the fetch-cascade root). */\nexport const rolesQueryKeys = {\n all: BASE_KEY,\n byCourse: (courseId: string) => [...BASE_KEY, courseId, 'roles'] as const,\n};\n\n/** Assignment types + grades-frozen / bulk-management flags (app-wide config). */\nexport const assignmentTypesQueryKeys = {\n all: BASE_KEY,\n byCourse: (courseId: string) => [...BASE_KEY, courseId, 'assignmentTypes'] as const,\n};\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,104 @@
1
+ import { StrictDict } from '../../../utils';
2
+ import urls, { gradeCsvUrl, sectionOverrideHistoryUrl, } from './urls';
3
+ import { pageSize, paramKeys } from './constants';
4
+ import messages from './messages';
5
+ import * as utils from './utils';
6
+ const { get, post, stringifyUrl } = utils;
7
+ /*********************************************************************************
8
+ * GET Actions
9
+ *********************************************************************************/
10
+ const assignmentTypes = () => get(urls.getAssignmentTypesUrl());
11
+ const cohorts = () => get(urls.getCohortsUrl());
12
+ const roles = () => get(urls.getRolesUrl());
13
+ const tracks = () => get(urls.getTracksUrl());
14
+ /**
15
+ * fetch.gradebookData(searchText, cohort, track, options)
16
+ * fetches updated gradebook data based on current filter selections.
17
+ * Raises an error if assignment grade limits are set, but not assignment.
18
+ * @param {string} searchText - search text filter
19
+ * @param {nunber} cohort - selected cohort filter
20
+ * @param {string} track - selected track filter
21
+ * @param {object} options - additional optional filter values
22
+ * @return {Promise} - get response
23
+ */
24
+ const gradebookData = (searchText, cohort, track, options = {}) => {
25
+ if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {
26
+ throw new Error(messages.errors.missingAssignment);
27
+ }
28
+ const queryParams = {
29
+ [paramKeys.pageSize]: pageSize,
30
+ [paramKeys.userContains]: searchText,
31
+ [paramKeys.cohortId]: cohort,
32
+ [paramKeys.enrollmentMode]: track,
33
+ [paramKeys.courseGradeMax]: options.courseGradeMax,
34
+ [paramKeys.courseGradeMin]: options.courseGradeMin,
35
+ [paramKeys.excludedCourseRoles]: options.includeCourseRoleMembers ? null : ['all'],
36
+ [paramKeys.assignment]: options.assignment,
37
+ [paramKeys.assignmentGradeMax]: options.assignmentGradeMax,
38
+ [paramKeys.assignmentGradeMin]: options.assignmentGradeMin,
39
+ };
40
+ return get(stringifyUrl(urls.getGradebookUrl(), queryParams));
41
+ };
42
+ /**
43
+ * fetch.gradeBulkOperationHistory()
44
+ * fetches bulk operation history and raises an error if the operation fails
45
+ * @return {Promise} - get response
46
+ */
47
+ const gradeBulkOperationHistory = () => get(urls.getBulkHistoryUrl())
48
+ .then(response => response.data)
49
+ .catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));
50
+ /**
51
+ * fetch.gradeOverrideHistory(subsectionId, userId)
52
+ * fetches grade override history for a given user on a given subsection
53
+ * @param {string} subsectionId - subsection identifier
54
+ * @param {string} userId - user identifier
55
+ * @return {Promise} - get response
56
+ */
57
+ const gradeOverrideHistory = (subsectionId, userId) => (get(sectionOverrideHistoryUrl(subsectionId, userId)));
58
+ /*********************************************************************************
59
+ * POST Actions
60
+ *********************************************************************************/
61
+ /**
62
+ * updateGradebookData(updateData)
63
+ * sends an update message with new grades overrides
64
+ * @param {object[]} updateData
65
+ * {
66
+ * user_id: <int>,
67
+ * usage_id: <string>
68
+ * grade: {
69
+ * earned_all_override: <int>
70
+ * possible_all_override: <int>
71
+ * earned_graded_override: <int>
72
+ * possible_graded_override: <int>
73
+ * }
74
+ * }
75
+ * @return {Promise} - post response
76
+ */
77
+ const updateGradebookData = (updateData) => post(urls.getBulkUpdateUrl(), updateData);
78
+ /**
79
+ * uploadGradeCsv(formData)
80
+ * Posts form data to grade csv url. On success, forwards response data.
81
+ * Reject promise with result on failure.
82
+ * @param {object} formData - new grade data
83
+ * @return {Promise} - post response
84
+ */
85
+ const uploadGradeCsv = (formData) => (post(gradeCsvUrl(), formData).then((result) => {
86
+ if (result.status === 200 && !result.data.error_messages.length) {
87
+ return result.data;
88
+ }
89
+ return Promise.reject(result);
90
+ }));
91
+ export default StrictDict({
92
+ fetch: StrictDict({
93
+ assignmentTypes,
94
+ cohorts,
95
+ gradebookData,
96
+ gradeBulkOperationHistory,
97
+ gradeOverrideHistory,
98
+ roles,
99
+ tracks,
100
+ }),
101
+ updateGradebookData,
102
+ uploadGradeCsv,
103
+ });
104
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/data/services/lms/api.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\n\nimport urls, {\n gradeCsvUrl,\n sectionOverrideHistoryUrl,\n} from './urls';\nimport { pageSize, paramKeys } from './constants';\nimport messages from './messages';\n\nimport * as utils from './utils';\n\nconst { get, post, stringifyUrl } = utils;\n\n/*********************************************************************************\n * GET Actions\n *********************************************************************************/\nconst assignmentTypes = () => get(urls.getAssignmentTypesUrl());\nconst cohorts = () => get(urls.getCohortsUrl());\nconst roles = () => get(urls.getRolesUrl());\nconst tracks = () => get(urls.getTracksUrl());\n\n/**\n * fetch.gradebookData(searchText, cohort, track, options)\n * fetches updated gradebook data based on current filter selections.\n * Raises an error if assignment grade limits are set, but not assignment.\n * @param {string} searchText - search text filter\n * @param {nunber} cohort - selected cohort filter\n * @param {string} track - selected track filter\n * @param {object} options - additional optional filter values\n * @return {Promise} - get response\n */\nconst gradebookData = (searchText, cohort, track, options = {}) => {\n if ((options.assignmentGradeMax || options.assignmentGradeMin) && !options.assignment) {\n throw new Error(messages.errors.missingAssignment);\n }\n const queryParams = {\n [paramKeys.pageSize]: pageSize,\n [paramKeys.userContains]: searchText,\n [paramKeys.cohortId]: cohort,\n [paramKeys.enrollmentMode]: track,\n [paramKeys.courseGradeMax]: options.courseGradeMax,\n [paramKeys.courseGradeMin]: options.courseGradeMin,\n [paramKeys.excludedCourseRoles]: options.includeCourseRoleMembers ? null : ['all'],\n [paramKeys.assignment]: options.assignment,\n [paramKeys.assignmentGradeMax]: options.assignmentGradeMax,\n [paramKeys.assignmentGradeMin]: options.assignmentGradeMin,\n };\n return get(stringifyUrl(urls.getGradebookUrl(), queryParams));\n};\n\n/**\n * fetch.gradeBulkOperationHistory()\n * fetches bulk operation history and raises an error if the operation fails\n * @return {Promise} - get response\n */\nconst gradeBulkOperationHistory = () => get(urls.getBulkHistoryUrl())\n .then(response => response.data)\n .catch(() => Promise.reject(Error(messages.errors.unhandledResponse)));\n\n/**\n * fetch.gradeOverrideHistory(subsectionId, userId)\n * fetches grade override history for a given user on a given subsection\n * @param {string} subsectionId - subsection identifier\n * @param {string} userId - user identifier\n * @return {Promise} - get response\n */\nconst gradeOverrideHistory = (subsectionId, userId) => (\n get(sectionOverrideHistoryUrl(subsectionId, userId))\n);\n\n/*********************************************************************************\n * POST Actions\n *********************************************************************************/\n/**\n * updateGradebookData(updateData)\n * sends an update message with new grades overrides\n * @param {object[]} updateData\n * {\n * user_id: <int>,\n * usage_id: <string>\n * grade: {\n * earned_all_override: <int>\n * possible_all_override: <int>\n * earned_graded_override: <int>\n * possible_graded_override: <int>\n * }\n * }\n * @return {Promise} - post response\n */\nconst updateGradebookData = (updateData) => post(urls.getBulkUpdateUrl(), updateData);\n\n/**\n * uploadGradeCsv(formData)\n * Posts form data to grade csv url. On success, forwards response data.\n * Reject promise with result on failure.\n * @param {object} formData - new grade data\n * @return {Promise} - post response\n */\nconst uploadGradeCsv = (formData) => (\n post(gradeCsvUrl(), formData).then((result) => {\n if (result.status === 200 && !result.data.error_messages.length) {\n return result.data;\n }\n return Promise.reject(result);\n })\n);\n\nexport default StrictDict({\n fetch: StrictDict({\n assignmentTypes,\n cohorts,\n gradebookData,\n gradeBulkOperationHistory,\n gradeOverrideHistory,\n roles,\n tracks,\n }),\n updateGradebookData,\n uploadGradeCsv,\n});\n"]}
@@ -0,0 +1,3 @@
1
+ export const pageSize: 25;
2
+ export const historyRecordLimit: 5;
3
+ export const paramKeys: any;
@@ -0,0 +1,16 @@
1
+ import { StrictDict } from '../../../utils';
2
+ export const pageSize = 25;
3
+ export const historyRecordLimit = 5;
4
+ export const paramKeys = StrictDict({
5
+ cohortId: 'cohort_id',
6
+ pageSize: 'page_size',
7
+ userContains: 'user_contains',
8
+ enrollmentMode: 'enrollment_mode',
9
+ assignment: 'assignment',
10
+ assignmentGradeMin: 'assignment_grade_min',
11
+ assignmentGradeMax: 'assignment_grade_max',
12
+ courseGradeMin: 'course_grade_min',
13
+ courseGradeMax: 'course_grade_max',
14
+ excludedCourseRoles: 'excluded_course_roles',
15
+ });
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/data/services/lms/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;IAClC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,sBAAsB;IAC1C,kBAAkB,EAAE,sBAAsB;IAC1C,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,mBAAmB,EAAE,uBAAuB;CAC7C,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport const pageSize = 25;\nexport const historyRecordLimit = 5;\n\nexport const paramKeys = StrictDict({\n cohortId: 'cohort_id',\n pageSize: 'page_size',\n userContains: 'user_contains',\n enrollmentMode: 'enrollment_mode',\n assignment: 'assignment',\n assignmentGradeMin: 'assignment_grade_min',\n assignmentGradeMax: 'assignment_grade_max',\n courseGradeMin: 'course_grade_min',\n courseGradeMax: 'course_grade_max',\n excludedCourseRoles: 'excluded_course_roles',\n});\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { StrictDict } from '../../../utils';
2
+ import api from './api';
3
+ import urls from './urls';
4
+ export default StrictDict({
5
+ api,
6
+ urls,
7
+ });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/services/lms/index.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,eAAe,UAAU,CAAC;IACxB,GAAG;IACH,IAAI;CACL,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\nimport api from './api';\nimport urls from './urls';\n\nexport default StrictDict({\n api,\n urls,\n});\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { StrictDict } from '../../../utils';
2
+ export default StrictDict({
3
+ errors: {
4
+ missingAssignment: ('Gradebook LMS API requires assignment to be set to filter by min/max assig. grade'),
5
+ unhandledResponse: 'unhandled response error',
6
+ },
7
+ });
8
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/data/services/lms/messages.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,eAAe,UAAU,CAAC;IACxB,MAAM,EAAE;QACN,iBAAiB,EAAE,CACjB,mFAAmF,CACpF;QACD,iBAAiB,EAAE,0BAA0B;KAC9C;CACF,CAAC,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport default StrictDict({\n errors: {\n missingAssignment: (\n 'Gradebook LMS API requires assignment to be set to filter by min/max assig. grade'\n ),\n unhandledResponse: 'unhandled response error',\n },\n});\n"]}
@@ -0,0 +1,19 @@
1
+ export function getUrlPrefix(): string;
2
+ export function getBulkGradesUrl(): string;
3
+ export function getEnrollmentUrl(): string;
4
+ export function getGradesUrl(): string;
5
+ export function getGradebookUrl(): string;
6
+ export function getBulkUpdateUrl(): string;
7
+ export function getInterventionUrl(): string;
8
+ export function getCohortsUrl(): string;
9
+ export function getTracksUrl(): string;
10
+ export function getBulkHistoryUrl(): string;
11
+ export function getAssignmentTypesUrl(): string;
12
+ export function getRolesUrl(): string;
13
+ export function bulkGradesUrlByRow(rowId: string): string;
14
+ export function gradeCsvUrl(options?: {}): string;
15
+ export function interventionExportCsvUrl(options?: {}): string;
16
+ export function sectionOverrideHistoryUrl(subsectionId: any, userId: any): string;
17
+ export function instructorDashboardUrl(): string;
18
+ declare const _default: any;
19
+ export default _default;
@@ -0,0 +1,47 @@
1
+ import { StrictDict } from '../../../utils';
2
+ import { historyRecordLimit } from './constants';
3
+ import { filterQuery, stringifyUrl } from './utils';
4
+ import { getSiteConfig } from '@openedx/frontend-base';
5
+ const courseId = window.location.pathname.split('/').filter(Boolean).pop() || '';
6
+ export const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;
7
+ export const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;
8
+ export const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;
9
+ export const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;
10
+ export const getGradebookUrl = () => `${getGradesUrl()}gradebook/${courseId}/`;
11
+ export const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;
12
+ export const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;
13
+ export const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;
14
+ export const getTracksUrl = () => `${getEnrollmentUrl()}course/${courseId}?include_expired=1`;
15
+ export const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;
16
+ export const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });
17
+ export const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });
18
+ /**
19
+ * bulkGradesUrlByCourseAndRow(courseId, rowId)
20
+ * returns the bulkGrades url with the given rowId.
21
+ * @param {string} rowId - row/error identifier
22
+ * @return {string} - bulk grades fetch url
23
+ */
24
+ export const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });
25
+ export const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));
26
+ export const interventionExportCsvUrl = (options = {}) => (stringifyUrl(getInterventionUrl(), filterQuery(options)));
27
+ export const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(`${getGradesUrl()}subsection/${subsectionId}/`, { user_id: userId, history_record_limit: historyRecordLimit });
28
+ export const instructorDashboardUrl = () => (`${getSiteConfig().lmsBaseUrl}/courses/${courseId}/instructor`);
29
+ export default StrictDict({
30
+ getUrlPrefix,
31
+ getBulkGradesUrl,
32
+ getEnrollmentUrl,
33
+ getGradesUrl,
34
+ getGradebookUrl,
35
+ getBulkUpdateUrl,
36
+ getInterventionUrl,
37
+ getCohortsUrl,
38
+ getTracksUrl,
39
+ getBulkHistoryUrl,
40
+ getAssignmentTypesUrl,
41
+ getRolesUrl,
42
+ bulkGradesUrlByRow,
43
+ gradeCsvUrl,
44
+ interventionExportCsvUrl,
45
+ sectionOverrideHistoryUrl,
46
+ });
47
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\nimport { historyRecordLimit } from './constants';\nimport { filterQuery, stringifyUrl } from './utils';\nimport { getSiteConfig } from '@openedx/frontend-base';\n\nconst courseId = window.location.pathname.split('/').filter(Boolean).pop() || '';\n\nexport const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;\nexport const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${courseId}/`;\nexport const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;\nexport const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;\nexport const getGradebookUrl = () => `${getGradesUrl()}gradebook/${courseId}/`;\nexport const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;\nexport const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;\nexport const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${courseId}/cohorts/`;\nexport const getTracksUrl = () => `${getEnrollmentUrl()}course/${courseId}?include_expired=1`;\nexport const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;\nexport const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });\nexport const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });\n/**\n * bulkGradesUrlByCourseAndRow(courseId, rowId)\n * returns the bulkGrades url with the given rowId.\n * @param {string} rowId - row/error identifier\n * @return {string} - bulk grades fetch url\n */\nexport const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });\n\nexport const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));\n\nexport const interventionExportCsvUrl = (options = {}) => (\n stringifyUrl(getInterventionUrl(), filterQuery(options))\n);\n\nexport const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(\n `${getGradesUrl()}subsection/${subsectionId}/`,\n { user_id: userId, history_record_limit: historyRecordLimit },\n);\n\nexport const instructorDashboardUrl = () => (\n `${getSiteConfig().lmsBaseUrl}/courses/${courseId}/instructor`\n);\n\nexport default StrictDict({\n getUrlPrefix,\n getBulkGradesUrl,\n getEnrollmentUrl,\n getGradesUrl,\n getGradebookUrl,\n getBulkUpdateUrl,\n getInterventionUrl,\n getCohortsUrl,\n getTracksUrl,\n getBulkHistoryUrl,\n getAssignmentTypesUrl,\n getRolesUrl,\n bulkGradesUrlByRow,\n gradeCsvUrl,\n interventionExportCsvUrl,\n sectionOverrideHistoryUrl,\n});\n"]}
@@ -0,0 +1,4 @@
1
+ export function get(...args: any[]): any;
2
+ export function post(...args: any[]): any;
3
+ export function stringifyUrl(url: string, query: object): string;
4
+ export function filterQuery(options: object): object;
@@ -0,0 +1,34 @@
1
+ import queryString from 'query-string';
2
+ import { getAuthenticatedHttpClient } from '@openedx/frontend-base';
3
+ import { filters } from '../../constants/filters';
4
+ /**
5
+ * get(url)
6
+ * simple wrapper providing an authenticated Http client get action
7
+ * @param {string} url - target url
8
+ */
9
+ export const get = (...args) => getAuthenticatedHttpClient().get(...args);
10
+ /**
11
+ * post(url, data)
12
+ * simple wrapper providing an authenticated Http client post action
13
+ * @param {string} url - target url
14
+ * @param {object|string} data - post payload
15
+ */
16
+ export const post = (...args) => getAuthenticatedHttpClient().post(...args);
17
+ /**
18
+ * stringifyUrl(url, query)
19
+ * simple wrapper around queryString.stringifyUrl that sets skip behavior
20
+ * @param {string} url - base url string
21
+ * @param {object} query - query parameters
22
+ */
23
+ export const stringifyUrl = (url, query) => queryString.stringifyUrl({ url, query }, { skipNull: true, skipEmptyString: true });
24
+ /**
25
+ * filterQuery(options)
26
+ * Takes current filter object and returns it with only valid filters that are
27
+ * set and have non-'All' values
28
+ * @param {object} options - filter values
29
+ * @return {object} - valid filters that are set and do not equal 'All'
30
+ */
31
+ export const filterQuery = (options) => Object.values(filters)
32
+ .filter(filter => options[filter] && options[filter] !== 'All')
33
+ .reduce((obj, filter) => (Object.assign(Object.assign({}, obj), { [filter]: options[filter] })), {});
34
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/data/services/lms/utils.js"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,0BAA0B,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAClE,EAAE,GAAG,EAAE,KAAK,EAAE,EACd,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;KAC3D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;KAC9D,MAAM,CACL,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,iCAAM,GAAG,KAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAG,EACxD,EAAE,CACH,CAAC","sourcesContent":["import queryString from 'query-string';\nimport { getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { filters } from '@src/data/constants/filters';\n\n/**\n * get(url)\n * simple wrapper providing an authenticated Http client get action\n * @param {string} url - target url\n */\nexport const get = (...args) => getAuthenticatedHttpClient().get(...args);\n/**\n * post(url, data)\n * simple wrapper providing an authenticated Http client post action\n * @param {string} url - target url\n * @param {object|string} data - post payload\n */\nexport const post = (...args) => getAuthenticatedHttpClient().post(...args);\n\n/**\n * stringifyUrl(url, query)\n * simple wrapper around queryString.stringifyUrl that sets skip behavior\n * @param {string} url - base url string\n * @param {object} query - query parameters\n */\nexport const stringifyUrl = (url, query) => queryString.stringifyUrl(\n { url, query },\n { skipNull: true, skipEmptyString: true },\n);\n\n/**\n * filterQuery(options)\n * Takes current filter object and returns it with only valid filters that are\n * set and have non-'All' values\n * @param {object} options - filter values\n * @return {object} - valid filters that are set and do not equal 'All'\n */\nexport const filterQuery = (options) => Object.values(filters)\n .filter(filter => options[filter] && options[filter] !== 'All')\n .reduce(\n (obj, filter) => ({ ...obj, [filter]: options[filter] }),\n {},\n );\n"]}
@@ -0,0 +1,8 @@
1
+ export const courseId: string;
2
+ export const events: any;
3
+ export const eventNames: any;
4
+ export const trackingCategory: "gradebook";
5
+ export namespace pageViewEvent {
6
+ export { trackingCategory as category };
7
+ export { courseId as page };
8
+ }
@@ -0,0 +1,26 @@
1
+ import { StrictDict } from '../../../utils';
2
+ export const courseId = window.location.pathname.slice(1);
3
+ export const events = StrictDict({
4
+ receivedRoles: 'receivedRoles',
5
+ receivedGrades: 'receivedGrades',
6
+ updateSucceeded: 'updateSucceeded',
7
+ updateFailed: 'updateFailed',
8
+ uploadOverrideSucceeded: 'uploadOverrideSucceeded',
9
+ uploadOverrideFailed: 'uploadOverrideFailed',
10
+ filterApplied: 'filterApplied',
11
+ gradesReportDownloaded: 'gradesReportDownloaded',
12
+ interventionReportDownloaded: 'interventionReportDownloaded',
13
+ });
14
+ export const eventNames = StrictDict({
15
+ [events.receivedGrades]: 'edx.gradebook.grades.displayed',
16
+ [events.updateSucceeded]: 'edx.gradebook.grades.grade_override.succeeded',
17
+ [events.updateFailed]: 'edx.gradebook.grades.grade_override.failed',
18
+ [events.uploadOverrideSucceeded]: 'edx.gradebook.grades.upload.grades_overrides.succeeded',
19
+ [events.uploadOverrideFailed]: 'edx.gradebook.grades.upload.grades_overrides.failed',
20
+ [events.filterApplied]: 'edx.gradebook.grades.filter_applied',
21
+ [events.gradesReportDownloaded]: 'edx.gradebook.reports.grade_export.downloaded',
22
+ [events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',
23
+ });
24
+ export const trackingCategory = 'gradebook';
25
+ export const pageViewEvent = { category: trackingCategory, page: courseId };
26
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/data/services/segment/constants.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC/B,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sBAAsB;IAC5C,aAAa,EAAE,eAAe;IAC9B,sBAAsB,EAAE,wBAAwB;IAChD,4BAA4B,EAAE,8BAA8B;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,gCAAgC;IACzD,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,+CAA+C;IACzE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,4CAA4C;IACnE,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,wDAAwD;IAC1F,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,qDAAqD;IACpF,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,qCAAqC;IAC7D,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,+CAA+C;IAChF,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAAE,+CAA+C;CACvF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { StrictDict } from '@src/utils';\n\nexport const courseId = window.location.pathname.slice(1);\n\nexport const events = StrictDict({\n receivedRoles: 'receivedRoles',\n receivedGrades: 'receivedGrades',\n updateSucceeded: 'updateSucceeded',\n updateFailed: 'updateFailed',\n uploadOverrideSucceeded: 'uploadOverrideSucceeded',\n uploadOverrideFailed: 'uploadOverrideFailed',\n filterApplied: 'filterApplied',\n gradesReportDownloaded: 'gradesReportDownloaded',\n interventionReportDownloaded: 'interventionReportDownloaded',\n});\n\nexport const eventNames = StrictDict({\n [events.receivedGrades]: 'edx.gradebook.grades.displayed',\n [events.updateSucceeded]: 'edx.gradebook.grades.grade_override.succeeded',\n [events.updateFailed]: 'edx.gradebook.grades.grade_override.failed',\n [events.uploadOverrideSucceeded]: 'edx.gradebook.grades.upload.grades_overrides.succeeded',\n [events.uploadOverrideFailed]: 'edx.gradebook.grades.upload.grades_overrides.failed',\n [events.filterApplied]: 'edx.gradebook.grades.filter_applied',\n [events.gradesReportDownloaded]: 'edx.gradebook.reports.grade_export.downloaded',\n [events.interventionReportDownloaded]: 'edx.gradebook.reports.intervention.downloaded',\n});\n\nexport const trackingCategory = 'gradebook';\n\nexport const pageViewEvent = { category: trackingCategory, page: courseId };\n"]}
@@ -0,0 +1,14 @@
1
+ export function trackGradesDisplayed({ assignmentType, cohort, track, prev, next, }: {
2
+ assignmentType: any;
3
+ cohort: any;
4
+ track: any;
5
+ prev: any;
6
+ next: any;
7
+ }): void;
8
+ export function trackGradeOverrideSucceeded(updatedGrades: any): void;
9
+ export function trackGradeOverrideFailed(error: any): void;
10
+ export function trackUploadOverrideSucceeded(): void;
11
+ export function trackUploadOverrideFailed(error: any): void;
12
+ export function trackFilterApplied(): void;
13
+ export function trackGradesReportDownloaded(): void;
14
+ export function trackInterventionReportDownloaded(): void;
@@ -0,0 +1,32 @@
1
+ import { sendTrackEvent } from '@openedx/frontend-base';
2
+ import { courseId, events, eventNames, trackingCategory, } from './constants';
3
+ /**
4
+ * Segment analytics, emitted directly via `@openedx/frontend-base`
5
+ * (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped
6
+ * Redux actions to Segment events. Event names + base properties (category + the
7
+ * `courseId` label) mirror the old `redux-beacon` mapping exactly.
8
+ */
9
+ const baseProperties = () => ({ category: trackingCategory, label: courseId });
10
+ /**
11
+ * Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,
12
+ * which fired per fetch with the filters it ran under and the page cursors.
13
+ */
14
+ export const trackGradesDisplayed = ({ assignmentType, cohort, track, prev, next, }) => sendTrackEvent(eventNames[events.receivedGrades], Object.assign(Object.assign({}, baseProperties()), { assignmentType, cohort, track, prev, next }));
15
+ /** Grade override saved from the edit modal succeeded. */
16
+ export const trackGradeOverrideSucceeded = (updatedGrades) => sendTrackEvent(eventNames[events.updateSucceeded], Object.assign(Object.assign({}, baseProperties()), { updatedGrades }));
17
+ /** Grade override save failed. */
18
+ export const trackGradeOverrideFailed = (error) => sendTrackEvent(eventNames[events.updateFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
19
+ /** Bulk grade CSV override upload succeeded. */
20
+ export const trackUploadOverrideSucceeded = () => sendTrackEvent(eventNames[events.uploadOverrideSucceeded], baseProperties());
21
+ /** Bulk grade CSV override upload failed. */
22
+ export const trackUploadOverrideFailed = (error) => sendTrackEvent(eventNames[events.uploadOverrideFailed], Object.assign(Object.assign({}, baseProperties()), { error }));
23
+ /**
24
+ * A filter was applied. Mirrors the legacy mapping, which fired this only from the
25
+ * course-grade-limit apply action.
26
+ */
27
+ export const trackFilterApplied = () => sendTrackEvent(eventNames[events.filterApplied], baseProperties());
28
+ /** Grades CSV export was downloaded. */
29
+ export const trackGradesReportDownloaded = () => sendTrackEvent(eventNames[events.gradesReportDownloaded], baseProperties());
30
+ /** Intervention report was downloaded. */
31
+ export const trackInterventionReportDownloaded = () => sendTrackEvent(eventNames[events.interventionReportDownloaded], baseProperties());
32
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/data/services/segment/events.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EACL,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAC/C,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAC1C,EAAE,EAAE,CAAC,cAAc,CAClB,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,kCAE5B,cAAc,EAAE,KAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAEjE,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,cAAc,CAC1E,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,kCAC7B,cAAc,EAAE,KAAE,aAAa,IACrC,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAC/D,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,kCAC1B,cAAc,EAAE,KAAE,KAAK,IAC7B,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,EAAE,CAAC,cAAc,CAC9D,UAAU,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAC1C,cAAc,EAAE,CACjB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAChE,UAAU,CAAC,MAAM,CAAC,oBAAoB,CAAC,kCAClC,cAAc,EAAE,KAAE,KAAK,IAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,cAAc,CACpD,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,EAChC,cAAc,EAAE,CACjB,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE,CAAC,cAAc,CAC7D,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,EACzC,cAAc,EAAE,CACjB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,EAAE,CAAC,cAAc,CACnE,UAAU,CAAC,MAAM,CAAC,4BAA4B,CAAC,EAC/C,cAAc,EAAE,CACjB,CAAC","sourcesContent":["import { sendTrackEvent } from '@openedx/frontend-base';\n\nimport {\n courseId, events, eventNames, trackingCategory,\n} from './constants';\n\n/**\n * Segment analytics, emitted directly via `@openedx/frontend-base`\n * (`sendTrackEvent`) instead of the legacy `redux-beacon` middleware that mapped\n * Redux actions to Segment events. Event names + base properties (category + the\n * `courseId` label) mirror the old `redux-beacon` mapping exactly.\n */\nconst baseProperties = () => ({ category: trackingCategory, label: courseId });\n\n/**\n * Grades were fetched and displayed. Mirrors the legacy `receivedGrades` trigger,\n * which fired per fetch with the filters it ran under and the page cursors.\n */\nexport const trackGradesDisplayed = ({\n assignmentType, cohort, track, prev, next,\n}) => sendTrackEvent(\n eventNames[events.receivedGrades],\n {\n ...baseProperties(), assignmentType, cohort, track, prev, next,\n },\n);\n\n/** Grade override saved from the edit modal succeeded. */\nexport const trackGradeOverrideSucceeded = (updatedGrades) => sendTrackEvent(\n eventNames[events.updateSucceeded],\n { ...baseProperties(), updatedGrades },\n);\n\n/** Grade override save failed. */\nexport const trackGradeOverrideFailed = (error) => sendTrackEvent(\n eventNames[events.updateFailed],\n { ...baseProperties(), error },\n);\n\n/** Bulk grade CSV override upload succeeded. */\nexport const trackUploadOverrideSucceeded = () => sendTrackEvent(\n eventNames[events.uploadOverrideSucceeded],\n baseProperties(),\n);\n\n/** Bulk grade CSV override upload failed. */\nexport const trackUploadOverrideFailed = (error) => sendTrackEvent(\n eventNames[events.uploadOverrideFailed],\n { ...baseProperties(), error },\n);\n\n/**\n * A filter was applied. Mirrors the legacy mapping, which fired this only from the\n * course-grade-limit apply action.\n */\nexport const trackFilterApplied = () => sendTrackEvent(\n eventNames[events.filterApplied],\n baseProperties(),\n);\n\n/** Grades CSV export was downloaded. */\nexport const trackGradesReportDownloaded = () => sendTrackEvent(\n eventNames[events.gradesReportDownloaded],\n baseProperties(),\n);\n\n/** Intervention report was downloaded. */\nexport const trackInterventionReportDownloaded = () => sendTrackEvent(\n eventNames[events.interventionReportDownloaded],\n baseProperties(),\n);\n"]}
@@ -0,0 +1,10 @@
1
+ export default simpleSelectorFactory;
2
+ /**
3
+ * Simple selector factory.
4
+ * Takes a list of string keys, and returns a simple slector for each.
5
+ *
6
+ * @function
7
+ * @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.
8
+ * @return {Object} - object of `{[key]: ({key}) => key}`
9
+ */
10
+ declare function simpleSelectorFactory(transformer: any, keys: any | string[]): any;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Simple selector factory.
3
+ * Takes a list of string keys, and returns a simple slector for each.
4
+ *
5
+ * @function
6
+ * @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.
7
+ * @return {Object} - object of `{[key]: ({key}) => key}`
8
+ */
9
+ const simpleSelectorFactory = (transformer, keys) => {
10
+ const selKeys = Array.isArray(keys) ? keys : Object.keys(keys);
11
+ return selKeys.reduce((obj, key) => (Object.assign(Object.assign({}, obj), { [key]: (state) => transformer(state)[key] })), { root: (state) => transformer(state) });
12
+ };
13
+ export default simpleSelectorFactory;
14
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/data/utils.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,iCACT,GAAG,KAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IACjD,EACF,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,qBAAqB,CAAC","sourcesContent":["/**\n * Simple selector factory.\n * Takes a list of string keys, and returns a simple slector for each.\n *\n * @function\n * @param {Object|string[]} keys - If passed as object, Object.keys(keys) is used.\n * @return {Object} - object of `{[key]: ({key}) => key}`\n */\nconst simpleSelectorFactory = (transformer, keys) => {\n const selKeys = Array.isArray(keys) ? keys : Object.keys(keys);\n return selKeys.reduce(\n (obj, key) => ({\n ...obj, [key]: (state) => transformer(state)[key],\n }),\n { root: (state) => transformer(state) },\n );\n};\n\nexport default simpleSelectorFactory;\n"]}
@@ -0,0 +1 @@
1
+ export { default } from './messages';
@@ -0,0 +1,2 @@
1
+ export { default } from './messages';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { default } from './messages';\n"]}
@@ -0,0 +1,2 @@
1
+ export function getLocalizedSlash(): "/" | "\\";
2
+ export function getLocalizedPercentSign(): "‏%" | "%";
@@ -0,0 +1,21 @@
1
+ import { getLocale, isRtl } from '@openedx/frontend-base';
2
+ export const getLocalizedSlash = () => {
3
+ // For fractional grades
4
+ // if we are in a LTR language, we want to use a forward slash.
5
+ // If we are in a RTL language, we want to use a backslash instead
6
+ if (isRtl(getLocale())) {
7
+ return '\\';
8
+ }
9
+ return '/';
10
+ };
11
+ export const getLocalizedPercentSign = () => {
12
+ // LTR languages put the percent to the right of a number.
13
+ // RTL languages put the percent sign to the left of the number.
14
+ // We can place a non-printing unicode right-to-left marker next to the percent
15
+ // sign to make it print to the left of the number if we are currently in a LTR language
16
+ if (isRtl(getLocale())) {
17
+ return '\u200f%';
18
+ }
19
+ return '%';
20
+ };
21
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/i18n/utils.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,wBAAwB;IACxB,+DAA+D;IAC/D,kEAAkE;IAClE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,0DAA0D;IAC1D,gEAAgE;IAChE,+EAA+E;IAC/E,wFAAwF;IACxF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC","sourcesContent":["import { getLocale, isRtl } from '@openedx/frontend-base';\n\nexport const getLocalizedSlash = () => {\n // For fractional grades\n // if we are in a LTR language, we want to use a forward slash.\n // If we are in a RTL language, we want to use a backslash instead\n if (isRtl(getLocale())) {\n return '\\\\';\n }\n return '/';\n};\n\nexport const getLocalizedPercentSign = () => {\n // LTR languages put the percent to the right of a number.\n // RTL languages put the percent sign to the left of the number.\n // We can place a non-printing unicode right-to-left marker next to the percent\n // sign to make it print to the left of the number if we are currently in a LTR language\n if (isRtl(getLocale())) {\n return '\\u200f%';\n }\n return '%';\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export { default as gradebookApp } from './app';
2
+ export { default as gradebookRoutes } from './routes';
3
+ export { default as gradebookMessages } from './i18n';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { default as gradebookApp } from './app';
2
+ export { default as gradebookRoutes } from './routes';
3
+ export { default as gradebookMessages } from './i18n';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { default as gradebookApp } from './app';\nexport { default as gradebookRoutes } from './routes';\nexport { default as gradebookMessages } from './i18n';\n"]}
@@ -0,0 +1,8 @@
1
+ declare const messages: {
2
+ 'gradebook.page.title': {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ };
8
+ export default messages;