@openedx/frontend-app-admin-console 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 (236) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +164 -0
  3. package/dist/Main.d.ts +3 -0
  4. package/dist/Main.js +15 -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/authz-module/audit-user/index.d.ts +2 -0
  10. package/dist/authz-module/audit-user/index.js +191 -0
  11. package/dist/authz-module/audit-user/index.js.map +1 -0
  12. package/dist/authz-module/audit-user/messages.d.ts +58 -0
  13. package/dist/authz-module/audit-user/messages.js +60 -0
  14. package/dist/authz-module/audit-user/messages.js.map +1 -0
  15. package/dist/authz-module/authz-home/index.d.ts +2 -0
  16. package/dist/authz-module/authz-home/index.js +23 -0
  17. package/dist/authz-module/authz-home/index.js.map +1 -0
  18. package/dist/authz-module/authz-home/messages.d.ts +23 -0
  19. package/dist/authz-module/authz-home/messages.js +25 -0
  20. package/dist/authz-module/authz-home/messages.js.map +1 -0
  21. package/dist/authz-module/components/AddRoleButton.d.ts +6 -0
  22. package/dist/authz-module/components/AddRoleButton.js +22 -0
  23. package/dist/authz-module/components/AddRoleButton.js.map +1 -0
  24. package/dist/authz-module/components/AnchorButton.d.ts +2 -0
  25. package/dist/authz-module/components/AnchorButton.js +35 -0
  26. package/dist/authz-module/components/AnchorButton.js.map +1 -0
  27. package/dist/authz-module/components/AuthZLayout.d.ts +12 -0
  28. package/dist/authz-module/components/AuthZLayout.js +19 -0
  29. package/dist/authz-module/components/AuthZLayout.js.map +1 -0
  30. package/dist/authz-module/components/AuthZTitle.d.ts +20 -0
  31. package/dist/authz-module/components/AuthZTitle.js +22 -0
  32. package/dist/authz-module/components/AuthZTitle.js.map +1 -0
  33. package/dist/authz-module/components/ConfirmDeletionModal.d.ts +15 -0
  34. package/dist/authz-module/components/ConfirmDeletionModal.js +21 -0
  35. package/dist/authz-module/components/ConfirmDeletionModal.js.map +1 -0
  36. package/dist/authz-module/components/ErrorPage/index.d.ts +3 -0
  37. package/dist/authz-module/components/ErrorPage/index.js +59 -0
  38. package/dist/authz-module/components/ErrorPage/index.js.map +1 -0
  39. package/dist/authz-module/components/ErrorPage/messages.d.ts +53 -0
  40. package/dist/authz-module/components/ErrorPage/messages.js +55 -0
  41. package/dist/authz-module/components/ErrorPage/messages.js.map +1 -0
  42. package/dist/authz-module/components/PermissionTable.d.ts +9 -0
  43. package/dist/authz-module/components/PermissionTable.js +24 -0
  44. package/dist/authz-module/components/PermissionTable.js.map +1 -0
  45. package/dist/authz-module/components/RenderAdminRole.d.ts +5 -0
  46. package/dist/authz-module/components/RenderAdminRole.js +13 -0
  47. package/dist/authz-module/components/RenderAdminRole.js.map +1 -0
  48. package/dist/authz-module/components/RenderPermissionColumn.d.ts +6 -0
  49. package/dist/authz-module/components/RenderPermissionColumn.js +8 -0
  50. package/dist/authz-module/components/RenderPermissionColumn.js.map +1 -0
  51. package/dist/authz-module/components/RenderPermissionInLine.d.ts +6 -0
  52. package/dist/authz-module/components/RenderPermissionInLine.js +8 -0
  53. package/dist/authz-module/components/RenderPermissionInLine.js.map +1 -0
  54. package/dist/authz-module/components/ResourceTooltip.d.ts +11 -0
  55. package/dist/authz-module/components/ResourceTooltip.js +9 -0
  56. package/dist/authz-module/components/ResourceTooltip.js.map +1 -0
  57. package/dist/authz-module/components/RoleCard/constants.d.ts +14 -0
  58. package/dist/authz-module/components/RoleCard/constants.js +15 -0
  59. package/dist/authz-module/components/RoleCard/constants.js.map +1 -0
  60. package/dist/authz-module/components/RoleCard/messages.d.ts +73 -0
  61. package/dist/authz-module/components/RoleCard/messages.js +75 -0
  62. package/dist/authz-module/components/RoleCard/messages.js.map +1 -0
  63. package/dist/authz-module/components/TableCells.d.ts +29 -0
  64. package/dist/authz-module/components/TableCells.js +137 -0
  65. package/dist/authz-module/components/TableCells.js.map +1 -0
  66. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.d.ts +3 -0
  67. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js +47 -0
  68. package/dist/authz-module/components/TableControlBar/MultipleChoiceFilter.js.map +1 -0
  69. package/dist/authz-module/components/TableControlBar/OrgFilter.d.ts +5 -0
  70. package/dist/authz-module/components/TableControlBar/OrgFilter.js +36 -0
  71. package/dist/authz-module/components/TableControlBar/OrgFilter.js.map +1 -0
  72. package/dist/authz-module/components/TableControlBar/RolesFilter.d.ts +4 -0
  73. package/dist/authz-module/components/TableControlBar/RolesFilter.js +29 -0
  74. package/dist/authz-module/components/TableControlBar/RolesFilter.js.map +1 -0
  75. package/dist/authz-module/components/TableControlBar/ScopesFilter.d.ts +4 -0
  76. package/dist/authz-module/components/TableControlBar/ScopesFilter.js +45 -0
  77. package/dist/authz-module/components/TableControlBar/ScopesFilter.js.map +1 -0
  78. package/dist/authz-module/components/TableControlBar/SearchFilter.d.ts +7 -0
  79. package/dist/authz-module/components/TableControlBar/SearchFilter.js +8 -0
  80. package/dist/authz-module/components/TableControlBar/SearchFilter.js.map +1 -0
  81. package/dist/authz-module/components/TableControlBar/TableControlBar.d.ts +5 -0
  82. package/dist/authz-module/components/TableControlBar/TableControlBar.js +99 -0
  83. package/dist/authz-module/components/TableControlBar/TableControlBar.js.map +1 -0
  84. package/dist/authz-module/components/TableControlBar/types.d.ts +18 -0
  85. package/dist/authz-module/components/TableControlBar/types.js +2 -0
  86. package/dist/authz-module/components/TableControlBar/types.js.map +1 -0
  87. package/dist/authz-module/components/TableFooter/TableFooter.d.ts +2 -0
  88. package/dist/authz-module/components/TableFooter/TableFooter.js +15 -0
  89. package/dist/authz-module/components/TableFooter/TableFooter.js.map +1 -0
  90. package/dist/authz-module/components/UserPermissions.d.ts +9 -0
  91. package/dist/authz-module/components/UserPermissions.js +56 -0
  92. package/dist/authz-module/components/UserPermissions.js.map +1 -0
  93. package/dist/authz-module/components/ViewMoreLink.d.ts +8 -0
  94. package/dist/authz-module/components/ViewMoreLink.js +8 -0
  95. package/dist/authz-module/components/ViewMoreLink.js.map +1 -0
  96. package/dist/authz-module/components/constants.d.ts +13 -0
  97. package/dist/authz-module/components/constants.js +80 -0
  98. package/dist/authz-module/components/constants.js.map +1 -0
  99. package/dist/authz-module/components/messages.d.ts +183 -0
  100. package/dist/authz-module/components/messages.js +185 -0
  101. package/dist/authz-module/components/messages.js.map +1 -0
  102. package/dist/authz-module/constants.d.ts +38 -0
  103. package/dist/authz-module/constants.js +77 -0
  104. package/dist/authz-module/constants.js.map +1 -0
  105. package/dist/authz-module/data/api.d.ts +109 -0
  106. package/dist/authz-module/data/api.js +107 -0
  107. package/dist/authz-module/data/api.js.map +1 -0
  108. package/dist/authz-module/data/hooks.d.ts +94 -0
  109. package/dist/authz-module/data/hooks.js +191 -0
  110. package/dist/authz-module/data/hooks.js.map +1 -0
  111. package/dist/authz-module/hooks/useCourseAuthoringFlag.d.ts +26 -0
  112. package/dist/authz-module/hooks/useCourseAuthoringFlag.js +86 -0
  113. package/dist/authz-module/hooks/useCourseAuthoringFlag.js.map +1 -0
  114. package/dist/authz-module/hooks/useQuerySettings.d.ts +27 -0
  115. package/dist/authz-module/hooks/useQuerySettings.js +72 -0
  116. package/dist/authz-module/hooks/useQuerySettings.js.map +1 -0
  117. package/dist/authz-module/hooks/useViewTeamPermissions.d.ts +5 -0
  118. package/dist/authz-module/hooks/useViewTeamPermissions.js +13 -0
  119. package/dist/authz-module/hooks/useViewTeamPermissions.js.map +1 -0
  120. package/dist/authz-module/index.d.ts +3 -0
  121. package/dist/authz-module/index.js +20 -0
  122. package/dist/authz-module/index.js.map +1 -0
  123. package/dist/authz-module/index.scss +131 -0
  124. package/dist/authz-module/messages.d.ts +48 -0
  125. package/dist/authz-module/messages.js +50 -0
  126. package/dist/authz-module/messages.js.map +1 -0
  127. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.d.ts +8 -0
  128. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js +154 -0
  129. package/dist/authz-module/role-assignation-wizard/AssignRoleWizard.js.map +1 -0
  130. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.d.ts +2 -0
  131. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js +39 -0
  132. package/dist/authz-module/role-assignation-wizard/AssignRoleWizardPage.js.map +1 -0
  133. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.d.ts +8 -0
  134. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js +39 -0
  135. package/dist/authz-module/role-assignation-wizard/components/DefineApplicationScopeStep.js.map +1 -0
  136. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.d.ts +11 -0
  137. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js +36 -0
  138. package/dist/authz-module/role-assignation-wizard/components/HighlightedUsersInput.js.map +1 -0
  139. package/dist/authz-module/role-assignation-wizard/components/OrgSection.d.ts +10 -0
  140. package/dist/authz-module/role-assignation-wizard/components/OrgSection.js +14 -0
  141. package/dist/authz-module/role-assignation-wizard/components/OrgSection.js.map +1 -0
  142. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.d.ts +8 -0
  143. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js +5 -0
  144. package/dist/authz-module/role-assignation-wizard/components/ScopeCheckboxItem.js.map +1 -0
  145. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.d.ts +12 -0
  146. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js +12 -0
  147. package/dist/authz-module/role-assignation-wizard/components/ScopeFilterBar.js.map +1 -0
  148. package/dist/authz-module/role-assignation-wizard/components/ScopeList.d.ts +20 -0
  149. package/dist/authz-module/role-assignation-wizard/components/ScopeList.js +30 -0
  150. package/dist/authz-module/role-assignation-wizard/components/ScopeList.js.map +1 -0
  151. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.d.ts +12 -0
  152. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js +34 -0
  153. package/dist/authz-module/role-assignation-wizard/components/SelectUsersAndRoleStep.js.map +1 -0
  154. package/dist/authz-module/role-assignation-wizard/constants.d.ts +5 -0
  155. package/dist/authz-module/role-assignation-wizard/constants.js +6 -0
  156. package/dist/authz-module/role-assignation-wizard/constants.js.map +1 -0
  157. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.d.ts +23 -0
  158. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js +112 -0
  159. package/dist/authz-module/role-assignation-wizard/hooks/useScopeListData.js.map +1 -0
  160. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.d.ts +10 -0
  161. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js +54 -0
  162. package/dist/authz-module/role-assignation-wizard/hooks/useScopePermissions.js.map +1 -0
  163. package/dist/authz-module/role-assignation-wizard/messages.d.ts +243 -0
  164. package/dist/authz-module/role-assignation-wizard/messages.js +258 -0
  165. package/dist/authz-module/role-assignation-wizard/messages.js.map +1 -0
  166. package/dist/authz-module/role-assignation-wizard/utils.d.ts +5 -0
  167. package/dist/authz-module/role-assignation-wizard/utils.js +16 -0
  168. package/dist/authz-module/role-assignation-wizard/utils.js.map +1 -0
  169. package/dist/authz-module/roles-permissions/RolesPermissions.d.ts +2 -0
  170. package/dist/authz-module/roles-permissions/RolesPermissions.js +35 -0
  171. package/dist/authz-module/roles-permissions/RolesPermissions.js.map +1 -0
  172. package/dist/authz-module/roles-permissions/course/constants.d.ts +39 -0
  173. package/dist/authz-module/roles-permissions/course/constants.js +474 -0
  174. package/dist/authz-module/roles-permissions/course/constants.js.map +1 -0
  175. package/dist/authz-module/roles-permissions/index.d.ts +10 -0
  176. package/dist/authz-module/roles-permissions/index.js +15 -0
  177. package/dist/authz-module/roles-permissions/index.js.map +1 -0
  178. package/dist/authz-module/roles-permissions/library/constants.d.ts +18 -0
  179. package/dist/authz-module/roles-permissions/library/constants.js +193 -0
  180. package/dist/authz-module/roles-permissions/library/constants.js.map +1 -0
  181. package/dist/authz-module/roles-permissions/messages.d.ts +63 -0
  182. package/dist/authz-module/roles-permissions/messages.js +65 -0
  183. package/dist/authz-module/roles-permissions/messages.js.map +1 -0
  184. package/dist/authz-module/roles-permissions/utils.d.ts +41 -0
  185. package/dist/authz-module/roles-permissions/utils.js +70 -0
  186. package/dist/authz-module/roles-permissions/utils.js.map +1 -0
  187. package/dist/authz-module/team-members/TeamMembersTable.d.ts +5 -0
  188. package/dist/authz-module/team-members/TeamMembersTable.js +107 -0
  189. package/dist/authz-module/team-members/TeamMembersTable.js.map +1 -0
  190. package/dist/authz-module/team-members/messages.d.ts +33 -0
  191. package/dist/authz-module/team-members/messages.js +35 -0
  192. package/dist/authz-module/team-members/messages.js.map +1 -0
  193. package/dist/authz-module/utils.d.ts +24 -0
  194. package/dist/authz-module/utils.js +45 -0
  195. package/dist/authz-module/utils.js.map +1 -0
  196. package/dist/components/LoadingPage.d.ts +2 -0
  197. package/dist/components/LoadingPage.js +5 -0
  198. package/dist/components/LoadingPage.js.map +1 -0
  199. package/dist/components/ToastManager/ToastManagerContext.d.ts +24 -0
  200. package/dist/components/ToastManager/ToastManagerContext.js +91 -0
  201. package/dist/components/ToastManager/ToastManagerContext.js.map +1 -0
  202. package/dist/constants.d.ts +11 -0
  203. package/dist/constants.js +15 -0
  204. package/dist/constants.js.map +1 -0
  205. package/dist/data/api.d.ts +4 -0
  206. package/dist/data/api.js +21 -0
  207. package/dist/data/api.js.map +1 -0
  208. package/dist/data/hooks.d.ts +38 -0
  209. package/dist/data/hooks.js +69 -0
  210. package/dist/data/hooks.js.map +1 -0
  211. package/dist/data/types.d.ts +38 -0
  212. package/dist/data/types.js +2 -0
  213. package/dist/data/types.js.map +1 -0
  214. package/dist/data/utils.d.ts +6 -0
  215. package/dist/data/utils.js +11 -0
  216. package/dist/data/utils.js.map +1 -0
  217. package/dist/i18n/index.d.ts +1 -0
  218. package/dist/i18n/index.js +2 -0
  219. package/dist/i18n/index.js.map +1 -0
  220. package/dist/index.d.ts +3 -0
  221. package/dist/index.js +4 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/messages.d.ts +8 -0
  224. package/dist/messages.js +10 -0
  225. package/dist/messages.js.map +1 -0
  226. package/dist/providers.d.ts +3 -0
  227. package/dist/providers.js +4 -0
  228. package/dist/providers.js.map +1 -0
  229. package/dist/routes.d.ts +11 -0
  230. package/dist/routes.js +16 -0
  231. package/dist/routes.js.map +1 -0
  232. package/dist/style.scss +15 -0
  233. package/dist/types.d.ts +93 -0
  234. package/dist/types.js +2 -0
  235. package/dist/types.js.map +1 -0
  236. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamMembersTable.js","sourceRoot":"","sources":["../../../src/authz-module/team-members/TeamMembersTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { useIntl } from '@openedx/frontend-base';\nimport {\n DataTable,\n TextFilter,\n} from '@openedx/paragon';\n\nimport { useToastManager } from '@src/components/ToastManager/ToastManagerContext';\nimport { LIBRARY_ROLE_KEYS } from '@src/authz-module/roles-permissions';\nimport { useViewTeamPermissions } from '@src/authz-module/hooks/useViewTeamPermissions';\nimport { useCourseAuthoringFlag } from '@src/authz-module/hooks/useCourseAuthoringFlag';\nimport { useQuerySettings } from '@src/authz-module/hooks/useQuerySettings';\nimport OrgFilter from '@src/authz-module/components/TableControlBar/OrgFilter';\nimport RolesFilter from '@src/authz-module/components/TableControlBar/RolesFilter';\nimport ScopesFilter from '@src/authz-module/components/TableControlBar/ScopesFilter';\nimport TableControlBar from '@src/authz-module/components/TableControlBar/TableControlBar';\nimport { getCellHeader } from '@src/authz-module/utils';\nimport {\n createViewActionCell, NameCell, OrgCell, RoleCell, ScopeCell,\n} from '@src/authz-module/components/TableCells';\nimport { useAllRoleAssignments } from '@src/authz-module/data/hooks';\nimport { TABLE_DEFAULT_PAGE_SIZE } from '@src/authz-module/constants';\nimport messages from './messages';\nimport TableFooter from '@src/authz-module/components/TableFooter/TableFooter';\n\ninterface TeamMembersTableProps {\n presetScope?: string;\n}\n\nconst TeamMembersTable = ({ presetScope }: TeamMembersTableProps) => {\n const intl = useIntl();\n const { showErrorToast } = useToastManager();\n const [columnsWithFiltersApplied, setColumnsWithFiltersApplied] = useState<string[]>([]);\n\n const initialQuerySettings = presetScope ? {\n scopes: presetScope,\n pageSize: TABLE_DEFAULT_PAGE_SIZE,\n pageIndex: 0,\n roles: null,\n organizations: null,\n search: null,\n order: null,\n sortBy: null,\n } : undefined;\n\n const { querySettings, handleTableFetch } = useQuerySettings(initialQuerySettings);\n\n const { isCourseViewAllowed } = useViewTeamPermissions();\n const { isCourseEnabled } = useCourseAuthoringFlag();\n\n const effectiveQuerySettings = useMemo(() => {\n if (isCourseViewAllowed || querySettings.roles) return querySettings;\n return { ...querySettings, roles: LIBRARY_ROLE_KEYS };\n }, [isCourseViewAllowed, querySettings]);\n\n const {\n data: { results: roleAssignments, count } = { results: [], count: 0 },\n isLoading: isLoadingAllRoleAssignments,\n error,\n refetch,\n } = useAllRoleAssignments(effectiveQuerySettings);\n\n const viewActionCell = useMemo(() => createViewActionCell({ isCourseEnabled }), [isCourseEnabled]);\n\n const initialFilters = presetScope ? [{ id: 'scope', value: [presetScope] }] : [];\n\n useEffect(() => {\n if (error) {\n showErrorToast(error, refetch);\n }\n }, [error, showErrorToast, refetch]);\n\n const pageCount = Math.ceil(count / TABLE_DEFAULT_PAGE_SIZE);\n\n const fetchData = useMemo(() => debounce(handleTableFetch, 500), [handleTableFetch]);\n\n useEffect(() => () => fetchData.cancel(), [fetchData]);\n\n return (\n <div className=\"authz-module\">\n <DataTable\n isFilterable\n isPaginated\n isSortable\n manualFilters\n manualPagination\n manualSortBy\n numBreakoutFilters={4}\n fetchData={fetchData}\n data={roleAssignments}\n itemCount={count}\n pageCount={pageCount}\n initialState={{ pageSize: TABLE_DEFAULT_PAGE_SIZE, filters: initialFilters }}\n isLoading={isLoadingAllRoleAssignments}\n additionalColumns={[\n {\n id: 'action',\n Header: intl.formatMessage(messages['authz.team.members.table.column.actions.title']),\n Cell: viewActionCell,\n },\n ]}\n columns={\n [\n {\n id: 'username',\n Header: intl.formatMessage(messages['authz.team.members.table.column.name.title']),\n accessor: 'username',\n Cell: NameCell,\n filter: 'text',\n Filter: TextFilter,\n filterOrder: 1,\n },\n {\n Header: intl.formatMessage(messages['authz.team.members.table.column.email.title']),\n accessor: 'email',\n disableFilters: true,\n filter: 'text',\n Filter: TextFilter,\n },\n {\n Header: getCellHeader('org', intl.formatMessage(messages['authz.team.members.table.column.organization.title']), columnsWithFiltersApplied),\n accessor: 'org',\n Cell: OrgCell,\n filter: 'includesValue',\n Filter: OrgFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.organization.title']),\n filterOrder: 2,\n },\n {\n Header: getCellHeader('scope', intl.formatMessage(messages['authz.team.members.table.column.scope.title']), columnsWithFiltersApplied),\n accessor: 'scope',\n Cell: ScopeCell,\n filter: 'includesValue',\n Filter: ScopesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.scope.title']),\n filterOrder: 4,\n },\n {\n Header: getCellHeader('role', intl.formatMessage(messages['authz.team.members.table.column.role.title']), columnsWithFiltersApplied),\n accessor: 'role',\n filter: 'includesValue',\n Cell: RoleCell,\n Filter: RolesFilter,\n filterButtonText: intl.formatMessage(messages['authz.team.members.table.column.role.title']),\n filterOrder: 3,\n },\n ]\n }\n >\n <TableControlBar onFilterChange={setColumnsWithFiltersApplied} />\n <DataTable.Table />\n <TableFooter />\n </DataTable>\n </div>\n );\n};\n\nexport default TeamMembersTable;\n"]}
@@ -0,0 +1,33 @@
1
+ declare const messages: {
2
+ 'authz.team.members.table.column.name.title': {
3
+ id: string;
4
+ defaultMessage: string;
5
+ description: string;
6
+ };
7
+ 'authz.team.members.table.column.email.title': {
8
+ id: string;
9
+ defaultMessage: string;
10
+ description: string;
11
+ };
12
+ 'authz.team.members.table.column.organization.title': {
13
+ id: string;
14
+ defaultMessage: string;
15
+ description: string;
16
+ };
17
+ 'authz.team.members.table.column.scope.title': {
18
+ id: string;
19
+ defaultMessage: string;
20
+ description: string;
21
+ };
22
+ 'authz.team.members.table.column.role.title': {
23
+ id: string;
24
+ defaultMessage: string;
25
+ description: string;
26
+ };
27
+ 'authz.team.members.table.column.actions.title': {
28
+ id: string;
29
+ defaultMessage: string;
30
+ description: string;
31
+ };
32
+ };
33
+ export default messages;
@@ -0,0 +1,35 @@
1
+ import { defineMessages } from '@openedx/frontend-base';
2
+ const messages = defineMessages({
3
+ 'authz.team.members.table.column.name.title': {
4
+ id: 'authz.team.members.table.column.name.title',
5
+ defaultMessage: 'Name',
6
+ description: 'Team members table name column header',
7
+ },
8
+ 'authz.team.members.table.column.email.title': {
9
+ id: 'authz.team.members.table.column.email.title',
10
+ defaultMessage: 'Email',
11
+ description: 'Team members table email column header',
12
+ },
13
+ 'authz.team.members.table.column.organization.title': {
14
+ id: 'authz.team.members.table.column.organization.title',
15
+ defaultMessage: 'Organization',
16
+ description: 'Team members table organization column header',
17
+ },
18
+ 'authz.team.members.table.column.scope.title': {
19
+ id: 'authz.team.members.table.column.scope.title',
20
+ defaultMessage: 'Scope',
21
+ description: 'Team members table scope column header',
22
+ },
23
+ 'authz.team.members.table.column.role.title': {
24
+ id: 'authz.team.members.table.column.role.title',
25
+ defaultMessage: 'Role',
26
+ description: 'Team members table role column header',
27
+ },
28
+ 'authz.team.members.table.column.actions.title': {
29
+ id: 'authz.team.members.table.column.actions.title',
30
+ defaultMessage: 'Actions',
31
+ description: 'Team members table actions column header',
32
+ },
33
+ });
34
+ export default messages;
35
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/authz-module/team-members/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,4CAA4C,EAAE;QAC5C,EAAE,EAAE,4CAA4C;QAChD,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,uCAAuC;KACrD;IACD,6CAA6C,EAAE;QAC7C,EAAE,EAAE,6CAA6C;QACjD,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,wCAAwC;KACtD;IACD,oDAAoD,EAAE;QACpD,EAAE,EAAE,oDAAoD;QACxD,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,+CAA+C;KAC7D;IACD,6CAA6C,EAAE;QAC7C,EAAE,EAAE,6CAA6C;QACjD,cAAc,EAAE,OAAO;QACvB,WAAW,EAAE,wCAAwC;KACtD;IACD,4CAA4C,EAAE;QAC5C,EAAE,EAAE,4CAA4C;QAChD,cAAc,EAAE,MAAM;QACtB,WAAW,EAAE,uCAAuC;KACrD;IACD,+CAA+C,EAAE;QAC/C,EAAE,EAAE,+CAA+C;QACnD,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,0CAA0C;KACxD;CAEF,CAAC,CAAC;AAEH,eAAe,QAAQ,CAAC","sourcesContent":["import { defineMessages } from '@openedx/frontend-base';\n\nconst messages = defineMessages({\n 'authz.team.members.table.column.name.title': {\n id: 'authz.team.members.table.column.name.title',\n defaultMessage: 'Name',\n description: 'Team members table name column header',\n },\n 'authz.team.members.table.column.email.title': {\n id: 'authz.team.members.table.column.email.title',\n defaultMessage: 'Email',\n description: 'Team members table email column header',\n },\n 'authz.team.members.table.column.organization.title': {\n id: 'authz.team.members.table.column.organization.title',\n defaultMessage: 'Organization',\n description: 'Team members table organization column header',\n },\n 'authz.team.members.table.column.scope.title': {\n id: 'authz.team.members.table.column.scope.title',\n defaultMessage: 'Scope',\n description: 'Team members table scope column header',\n },\n 'authz.team.members.table.column.role.title': {\n id: 'authz.team.members.table.column.role.title',\n defaultMessage: 'Role',\n description: 'Team members table role column header',\n },\n 'authz.team.members.table.column.actions.title': {\n id: 'authz.team.members.table.column.actions.title',\n defaultMessage: 'Actions',\n description: 'Team members table actions column header',\n },\n\n});\n\nexport default messages;\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Returns a header value for a DataTable column that shows a filter icon
3
+ * when the column has an active filter.
4
+ *
5
+ * When a filter is active, returns a **component function** with a custom
6
+ * toString() override. This is necessary because Paragon's TableRow builds
7
+ * cell keys via: `${cell.column.Header}${row.id}`
8
+ *
9
+ * - A JSX element stringifies to "[object Object]", causing duplicate keys.
10
+ * - A function with a custom toString() produces a unique string per column.
11
+ *
12
+ * react-table's render('Header') calls the function as a component, so the
13
+ * JSX is still rendered correctly in the table header.
14
+ */
15
+ export declare const getCellHeader: (columnId: string, columnTitle: string, filtersApplied: string[]) => string | {
16
+ (): import("react").JSX.Element;
17
+ displayName: string;
18
+ toString(): string;
19
+ };
20
+ export declare const getScopeManageAction: (scope: string) => string;
21
+ export declare const getScopeManageActionPermission: (scope: string) => {
22
+ action: string;
23
+ scope: string;
24
+ };
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from '@openedx/paragon';
3
+ import { FilterList } from '@openedx/paragon/icons';
4
+ import { CONTENT_COURSE_PERMISSIONS, CONTENT_LIBRARY_PERMISSIONS } from './roles-permissions';
5
+ /**
6
+ * Returns a header value for a DataTable column that shows a filter icon
7
+ * when the column has an active filter.
8
+ *
9
+ * When a filter is active, returns a **component function** with a custom
10
+ * toString() override. This is necessary because Paragon's TableRow builds
11
+ * cell keys via: `${cell.column.Header}${row.id}`
12
+ *
13
+ * - A JSX element stringifies to "[object Object]", causing duplicate keys.
14
+ * - A function with a custom toString() produces a unique string per column.
15
+ *
16
+ * react-table's render('Header') calls the function as a component, so the
17
+ * JSX is still rendered correctly in the table header.
18
+ */
19
+ export const getCellHeader = (columnId, columnTitle, filtersApplied) => {
20
+ if (filtersApplied.includes(columnId)) {
21
+ const FilteredHeader = () => (_jsxs("span", { className: "d-flex flex-row align-items-center", children: [_jsx(Icon, { src: FilterList, size: "sm", className: "mr-2" }), columnTitle] }));
22
+ FilteredHeader.displayName = `FilteredHeader_${columnId}`;
23
+ FilteredHeader.toString = () => `FilteredHeader_${columnId}`;
24
+ return FilteredHeader;
25
+ }
26
+ return columnTitle;
27
+ };
28
+ export const getScopeManageAction = (scope) => {
29
+ if (scope.startsWith('lib')) {
30
+ return CONTENT_LIBRARY_PERMISSIONS.MANAGE_LIBRARY_TEAM;
31
+ }
32
+ if (scope.startsWith('course')) {
33
+ return CONTENT_COURSE_PERMISSIONS.MANAGE_COURSE_TEAM;
34
+ }
35
+ // Default fallback or throw error for unknown scopes
36
+ return CONTENT_COURSE_PERMISSIONS.MANAGE_COURSE_TEAM;
37
+ };
38
+ export const getScopeManageActionPermission = (scope) => {
39
+ const action = getScopeManageAction(scope);
40
+ return {
41
+ action,
42
+ scope,
43
+ };
44
+ };
45
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/authz-module/utils.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAE9F;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAE,cAAwB,EAAE,EAAE;IAC/F,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAC3B,gBAAM,SAAS,EAAC,oCAAoC,aAClD,KAAC,IAAI,IAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,MAAM,GAAG,EACnD,WAAW,IACP,CACR,CAAC;QACF,cAAc,CAAC,WAAW,GAAG,kBAAkB,QAAQ,EAAE,CAAC;QAC1D,cAAc,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,kBAAkB,QAAQ,EAAE,CAAC;QAC7D,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,EAAE;IACpD,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,2BAA2B,CAAC,mBAAmB,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,0BAA0B,CAAC,kBAAkB,CAAC;IACvD,CAAC;IACD,qDAAqD;IACrD,OAAO,0BAA0B,CAAC,kBAAkB,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,KAAa,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO;QACL,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Icon } from '@openedx/paragon';\nimport { FilterList } from '@openedx/paragon/icons';\nimport { CONTENT_COURSE_PERMISSIONS, CONTENT_LIBRARY_PERMISSIONS } from './roles-permissions';\n\n/**\n * Returns a header value for a DataTable column that shows a filter icon\n * when the column has an active filter.\n *\n * When a filter is active, returns a **component function** with a custom\n * toString() override. This is necessary because Paragon's TableRow builds\n * cell keys via: `${cell.column.Header}${row.id}`\n *\n * - A JSX element stringifies to \"[object Object]\", causing duplicate keys.\n * - A function with a custom toString() produces a unique string per column.\n *\n * react-table's render('Header') calls the function as a component, so the\n * JSX is still rendered correctly in the table header.\n */\nexport const getCellHeader = (columnId: string, columnTitle: string, filtersApplied: string[]) => {\n if (filtersApplied.includes(columnId)) {\n const FilteredHeader = () => (\n <span className=\"d-flex flex-row align-items-center\">\n <Icon src={FilterList} size=\"sm\" className=\"mr-2\" />\n {columnTitle}\n </span>\n );\n FilteredHeader.displayName = `FilteredHeader_${columnId}`;\n FilteredHeader.toString = () => `FilteredHeader_${columnId}`;\n return FilteredHeader;\n }\n return columnTitle;\n};\n\nexport const getScopeManageAction = (scope: string) => {\n if (scope.startsWith('lib')) {\n return CONTENT_LIBRARY_PERMISSIONS.MANAGE_LIBRARY_TEAM;\n }\n if (scope.startsWith('course')) {\n return CONTENT_COURSE_PERMISSIONS.MANAGE_COURSE_TEAM;\n }\n // Default fallback or throw error for unknown scopes\n return CONTENT_COURSE_PERMISSIONS.MANAGE_COURSE_TEAM;\n};\n\nexport const getScopeManageActionPermission = (scope: string) => {\n const action = getScopeManageAction(scope);\n return {\n action,\n scope,\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ declare const LoadingPage: () => import("react").JSX.Element;
2
+ export default LoadingPage;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Spinner, Container } from '@openedx/paragon';
3
+ const LoadingPage = () => (_jsx(Container, { className: "d-flex vh-100", children: _jsx(Spinner, { variant: "primary", animation: "border", role: "status", className: "mb-3 m-auto" }) }));
4
+ export default LoadingPage;
5
+ //# sourceMappingURL=LoadingPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingPage.js","sourceRoot":"","sources":["../../src/components/LoadingPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CACxB,KAAC,SAAS,IAAC,SAAS,EAAC,eAAe,YAClC,KAAC,OAAO,IACN,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,QAAQ,EAClB,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,aAAa,GACvB,GACQ,CACb,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { Spinner, Container } from '@openedx/paragon';\n\nconst LoadingPage = () => (\n <Container className=\"d-flex vh-100\">\n <Spinner\n variant=\"primary\"\n animation=\"border\"\n role=\"status\"\n className=\"mb-3 m-auto\"\n />\n </Container>\n);\n\nexport default LoadingPage;\n"]}
@@ -0,0 +1,24 @@
1
+ type ToastType = 'success' | 'error' | 'error-retry';
2
+ export declare const ERROR_TOAST_MAP: Record<number | string, {
3
+ type: ToastType;
4
+ messageId: string;
5
+ }>;
6
+ export interface AppToast {
7
+ id: string;
8
+ message: string | React.ReactNode;
9
+ type: ToastType;
10
+ onRetry?: () => void;
11
+ delay?: number;
12
+ }
13
+ interface ToastManagerContextType {
14
+ showToast: (toast: Omit<AppToast, 'id'>) => void;
15
+ showErrorToast: (error: unknown, retryFn?: () => void) => void;
16
+ Bold: (chunks: React.ReactNode[]) => JSX.Element;
17
+ Br: () => JSX.Element;
18
+ }
19
+ interface ToastManagerProviderProps {
20
+ children: React.ReactNode | React.ReactNode[];
21
+ }
22
+ export declare const ToastManagerProvider: ({ children }: ToastManagerProviderProps) => import("react").JSX.Element;
23
+ export declare const useToastManager: () => ToastManagerContextType;
24
+ export {};
@@ -0,0 +1,91 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useContext, useState, useMemo, useCallback, useEffect, useRef, } from 'react';
3
+ import { logError, useIntl } from '@openedx/frontend-base';
4
+ import { Toast } from '@openedx/paragon';
5
+ import messages from '../../authz-module/messages';
6
+ import { DEFAULT_TOAST_DELAY, RETRY_TOAST_DELAY } from '../../authz-module/constants';
7
+ import { getHttpErrorStatus } from '../../data/utils';
8
+ export const ERROR_TOAST_MAP = {
9
+ // Transient (retryable) server errors
10
+ 500: { type: 'error-retry', messageId: 'authz.team.toast.500.error.message' },
11
+ 502: { type: 'error-retry', messageId: 'authz.team.toast.502.error.message' },
12
+ 503: { type: 'error-retry', messageId: 'authz.team.toast.503.error.message' },
13
+ 408: { type: 'error-retry', messageId: 'authz.team.toast.408.error.message' },
14
+ // Generic fallback error
15
+ DEFAULT: { type: 'error-retry', messageId: 'authz.team.toast.default.error.message' },
16
+ };
17
+ const Bold = (chunks) => _jsx("b", { children: chunks });
18
+ const Br = () => _jsx("br", {});
19
+ const ToastManagerContext = createContext(undefined);
20
+ export const ToastManagerProvider = ({ children }) => {
21
+ const intl = useIntl();
22
+ const [toasts, setToasts] = useState([]);
23
+ const removalTimers = useRef(new Map());
24
+ const showToast = useCallback((toast) => {
25
+ const id = `toast-notification-${Date.now()}-${Math.floor(Math.random() * 1000000)}`;
26
+ const newToast = Object.assign(Object.assign({}, toast), { id, visible: true });
27
+ setToasts(prev => [...prev, newToast]);
28
+ }, []);
29
+ const discardToast = useCallback((id) => {
30
+ setToasts(prev => prev.map(t => (t.id === id ? Object.assign(Object.assign({}, t), { visible: false }) : t)));
31
+ // If a removal is already pending for this id, don't stack another.
32
+ if (removalTimers.current.has(id)) {
33
+ return;
34
+ }
35
+ const timer = setTimeout(() => {
36
+ setToasts(prev => prev.filter(t => t.id !== id));
37
+ removalTimers.current.delete(id);
38
+ }, DEFAULT_TOAST_DELAY);
39
+ removalTimers.current.set(id, timer);
40
+ }, []);
41
+ // Clear any pending removal timers when the provider unmounts.
42
+ useEffect(() => () => {
43
+ removalTimers.current.forEach(clearTimeout);
44
+ }, []);
45
+ const value = useMemo(() => {
46
+ const showErrorToast = (error, retryFn) => {
47
+ logError(error);
48
+ const errorStatus = getHttpErrorStatus(error);
49
+ const toastConfig = (errorStatus !== undefined && ERROR_TOAST_MAP[errorStatus]) || ERROR_TOAST_MAP.DEFAULT;
50
+ const message = intl.formatMessage(messages[toastConfig.messageId], { Bold, Br });
51
+ /**
52
+ * For retryable errors, we set a longer delay to give users more time to read the message
53
+ * and decide to retry, while for non-retryable errors we use the default delay.
54
+ * Since current toast implementation does not allow disabling the autohide prop,
55
+ * we use a longer delay for retryable errors to give users more time to read the message.
56
+ */
57
+ const delay = toastConfig.type === 'error-retry' && retryFn ? RETRY_TOAST_DELAY : DEFAULT_TOAST_DELAY;
58
+ showToast({
59
+ message,
60
+ type: toastConfig.type,
61
+ onRetry: toastConfig.type === 'error-retry' && retryFn ? retryFn : undefined,
62
+ delay,
63
+ });
64
+ };
65
+ return ({
66
+ showToast,
67
+ showErrorToast,
68
+ Bold,
69
+ Br,
70
+ });
71
+ }, [intl, showToast]);
72
+ return (_jsxs(ToastManagerContext.Provider, { value: value, children: [children, _jsx("div", { className: "toast-container", children: toasts.map(toast => {
73
+ var _a;
74
+ return (_jsx(Toast, { show: toast.visible, onClose: () => discardToast(toast.id), delay: (_a = toast.delay) !== null && _a !== void 0 ? _a : DEFAULT_TOAST_DELAY, action: toast.onRetry ? {
75
+ onClick: () => {
76
+ var _a;
77
+ discardToast(toast.id);
78
+ (_a = toast.onRetry) === null || _a === void 0 ? void 0 : _a.call(toast);
79
+ },
80
+ label: intl.formatMessage(messages['authz.team.toast.retry.label']),
81
+ } : undefined, children: toast.message }, toast.id));
82
+ }) })] }));
83
+ };
84
+ export const useToastManager = () => {
85
+ const context = useContext(ToastManagerContext);
86
+ if (!context) {
87
+ throw new Error('useToastManager must be used within a ToastManagerProvider');
88
+ }
89
+ return context;
90
+ };
91
+ //# sourceMappingURL=ToastManagerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastManagerContext.js","sourceRoot":"","sources":["../../../src/components/ToastManager/ToastManagerContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext, useContext, useState, useMemo, useCallback, useEffect, useRef,\n} from 'react';\nimport { logError, useIntl } from '@openedx/frontend-base';\nimport { Toast } from '@openedx/paragon';\nimport messages from '@src/authz-module/messages';\nimport { DEFAULT_TOAST_DELAY, RETRY_TOAST_DELAY } from '@src/authz-module/constants';\nimport { getHttpErrorStatus } from '@src/data/utils';\n\ntype ToastType = 'success' | 'error' | 'error-retry';\n\nexport const ERROR_TOAST_MAP: Record<number | string, { type: ToastType; messageId: string }> = {\n // Transient (retryable) server errors\n 500: { type: 'error-retry', messageId: 'authz.team.toast.500.error.message' },\n 502: { type: 'error-retry', messageId: 'authz.team.toast.502.error.message' },\n 503: { type: 'error-retry', messageId: 'authz.team.toast.503.error.message' },\n 408: { type: 'error-retry', messageId: 'authz.team.toast.408.error.message' },\n\n // Generic fallback error\n DEFAULT: { type: 'error-retry', messageId: 'authz.team.toast.default.error.message' },\n};\n\nexport interface AppToast {\n id: string;\n message: string | React.ReactNode;\n type: ToastType;\n onRetry?: () => void;\n delay?: number;\n}\n\nconst Bold = (chunks: React.ReactNode[]) => <b>{chunks}</b>;\nconst Br = () => <br />;\n\ninterface ToastManagerContextType {\n showToast: (toast: Omit<AppToast, 'id'>) => void;\n showErrorToast: (error: unknown, retryFn?: () => void) => void;\n Bold: (chunks: React.ReactNode[]) => JSX.Element;\n Br: () => JSX.Element;\n}\n\nconst ToastManagerContext = createContext<ToastManagerContextType | undefined>(undefined);\n\ninterface ToastManagerProviderProps {\n children: React.ReactNode | React.ReactNode[];\n}\n\nexport const ToastManagerProvider = ({ children }: ToastManagerProviderProps) => {\n const intl = useIntl();\n const [toasts, setToasts] = useState<(AppToast & { visible: boolean })[]>([]);\n const removalTimers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n\n const showToast = useCallback((toast: Omit<AppToast, 'id'>) => {\n const id = `toast-notification-${Date.now()}-${Math.floor(Math.random() * 1000000)}`;\n const newToast = { ...toast, id, visible: true };\n setToasts(prev => [...prev, newToast]);\n }, []);\n\n const discardToast = useCallback((id: string) => {\n setToasts(prev => prev.map(t => (t.id === id ? { ...t, visible: false } : t)));\n\n // If a removal is already pending for this id, don't stack another.\n if (removalTimers.current.has(id)) {\n return;\n }\n\n const timer = setTimeout(() => {\n setToasts(prev => prev.filter(t => t.id !== id));\n removalTimers.current.delete(id);\n }, DEFAULT_TOAST_DELAY);\n removalTimers.current.set(id, timer);\n }, []);\n\n // Clear any pending removal timers when the provider unmounts.\n useEffect(() => () => {\n removalTimers.current.forEach(clearTimeout);\n }, []);\n\n const value = useMemo<ToastManagerContextType>(() => {\n const showErrorToast = (error: unknown, retryFn?: () => void) => {\n logError(error as Error);\n const errorStatus = getHttpErrorStatus(error);\n const toastConfig = (errorStatus !== undefined && ERROR_TOAST_MAP[errorStatus]) || ERROR_TOAST_MAP.DEFAULT;\n const message = intl.formatMessage(messages[toastConfig.messageId], { Bold, Br });\n /**\n * For retryable errors, we set a longer delay to give users more time to read the message\n * and decide to retry, while for non-retryable errors we use the default delay.\n * Since current toast implementation does not allow disabling the autohide prop,\n * we use a longer delay for retryable errors to give users more time to read the message.\n */\n const delay = toastConfig.type === 'error-retry' && retryFn ? RETRY_TOAST_DELAY : DEFAULT_TOAST_DELAY;\n\n showToast({\n message,\n type: toastConfig.type,\n onRetry: toastConfig.type === 'error-retry' && retryFn ? retryFn : undefined,\n delay,\n });\n };\n\n return ({\n showToast,\n showErrorToast,\n Bold,\n Br,\n });\n }, [intl, showToast]);\n\n return (\n <ToastManagerContext.Provider value={value}>\n {children}\n\n <div className=\"toast-container\">\n {toasts.map(toast => (\n <Toast\n key={toast.id}\n show={toast.visible}\n onClose={() => discardToast(toast.id)}\n delay={toast.delay ?? DEFAULT_TOAST_DELAY}\n action={toast.onRetry ? {\n onClick: () => {\n discardToast(toast.id);\n toast.onRetry?.();\n },\n label: intl.formatMessage(messages['authz.team.toast.retry.label']),\n } : undefined}\n >\n {toast.message as string}\n </Toast>\n ))}\n </div>\n </ToastManagerContext.Provider>\n );\n};\n\nexport const useToastManager = (): ToastManagerContextType => {\n const context = useContext(ToastManagerContext);\n if (!context) {\n throw new Error('useToastManager must be used within a ToastManagerProvider');\n }\n return context;\n};\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const appId = "org.openedx.frontend.app.adminConsole";
2
+ export declare enum CustomErrors {
3
+ NO_ACCESS = "NO_ACCESS",
4
+ NOT_FOUND = "NOT_FOUND",
5
+ SERVER_ERROR = "SERVER_ERROR"
6
+ }
7
+ type ErrorStatusCode = Record<CustomErrors, number[]>;
8
+ export declare const STATUS_400 = 400;
9
+ export declare const STATUS_404 = 404;
10
+ export declare const ERROR_STATUS: ErrorStatusCode;
11
+ export {};
@@ -0,0 +1,15 @@
1
+ export const appId = 'org.openedx.frontend.app.adminConsole';
2
+ export var CustomErrors;
3
+ (function (CustomErrors) {
4
+ CustomErrors["NO_ACCESS"] = "NO_ACCESS";
5
+ CustomErrors["NOT_FOUND"] = "NOT_FOUND";
6
+ CustomErrors["SERVER_ERROR"] = "SERVER_ERROR";
7
+ })(CustomErrors || (CustomErrors = {}));
8
+ export const STATUS_400 = 400;
9
+ export const STATUS_404 = 404;
10
+ export const ERROR_STATUS = {
11
+ [CustomErrors.NO_ACCESS]: [403, 401],
12
+ [CustomErrors.NOT_FOUND]: [400, 404],
13
+ [CustomErrors.SERVER_ERROR]: [500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511],
14
+ };
15
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,uCAAuC,CAAC;AAE7D,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,uCAAuB,CAAA;IACvB,uCAAuB,CAAA;IACvB,6CAA6B,CAAA;AAC/B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAID,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IACpC,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;IACpC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACrF,CAAC","sourcesContent":["export const appId = 'org.openedx.frontend.app.adminConsole';\n\nexport enum CustomErrors {\n NO_ACCESS = 'NO_ACCESS',\n NOT_FOUND = 'NOT_FOUND',\n SERVER_ERROR = 'SERVER_ERROR',\n}\n\ntype ErrorStatusCode = Record<CustomErrors, number[]>;\n\nexport const STATUS_400 = 400;\nexport const STATUS_404 = 404;\n\nexport const ERROR_STATUS: ErrorStatusCode = {\n [CustomErrors.NO_ACCESS]: [403, 401],\n [CustomErrors.NOT_FOUND]: [400, 404],\n [CustomErrors.SERVER_ERROR]: [500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511],\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { PermissionValidationRequest, PermissionValidationResponse } from '../types';
2
+ import { UserAccount } from './types';
3
+ export declare const validateUserPermissions: (validations: PermissionValidationRequest[]) => Promise<PermissionValidationResponse[]>;
4
+ export declare const getUserAccount: (username?: string) => Promise<UserAccount>;
@@ -0,0 +1,21 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';
11
+ import { getApiUrl } from './utils';
12
+ export const validateUserPermissions = (validations) => __awaiter(void 0, void 0, void 0, function* () {
13
+ const { data } = yield getAuthenticatedHttpClient().post(getApiUrl('/api/authz/v1/permissions/validate/me'), validations);
14
+ return data;
15
+ });
16
+ export const getUserAccount = (username) => __awaiter(void 0, void 0, void 0, function* () {
17
+ const url = new URL(getApiUrl(`/api/user/v1/accounts/${username}`));
18
+ const { data } = yield getAuthenticatedHttpClient().get(url);
19
+ return camelCaseObject(data);
20
+ });
21
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/data/api.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,WAA0C,EACD,EAAE;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,uCAAuC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC1H,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAO,QAAiB,EAAwB,EAAE;IAC9E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,0BAA0B,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAA,CAAC","sourcesContent":["import { PermissionValidationRequest, PermissionValidationResponse } from '@src/types';\nimport { camelCaseObject, getAuthenticatedHttpClient } from '@openedx/frontend-base';\nimport { getApiUrl } from './utils';\nimport { UserAccount } from './types';\n\nexport const validateUserPermissions = async (\n validations: PermissionValidationRequest[],\n): Promise<PermissionValidationResponse[]> => {\n const { data } = await getAuthenticatedHttpClient().post(getApiUrl('/api/authz/v1/permissions/validate/me'), validations);\n return data;\n};\n\nexport const getUserAccount = async (username?: string): Promise<UserAccount> => {\n const url = new URL(getApiUrl(`/api/user/v1/accounts/${username}`));\n const { data } = await getAuthenticatedHttpClient().get(url);\n return camelCaseObject(data);\n};\n"]}
@@ -0,0 +1,38 @@
1
+ import { PermissionValidationRequest, PermissionValidationResponse } from '../types';
2
+ /**
3
+ * React Query hook to validate if the current user has permissions over a certain object in the instance.
4
+ * It helps to:
5
+ * - Determine whether the current user can access certain object.
6
+ * - Provide role-based rendering logic for UI components.
7
+ *
8
+ * @param permissions - The array of objects and actions to validate.
9
+ *
10
+ * @example
11
+ * const { data } = useValidateUserPermissions([{
12
+ "action": "act:read",
13
+ "object": "lib:test-lib",
14
+ "scope": "org:OpenedX"
15
+ }]);
16
+ * if (data[0].allowed) { ... }
17
+ *
18
+ */
19
+ export declare const useValidateUserPermissions: (permissions: PermissionValidationRequest[]) => import("@tanstack/react-query").UseSuspenseQueryResult<PermissionValidationResponse[], Error>;
20
+ /**
21
+ * React Query hook to validate if the current user has permissions over a certain object in the instance.
22
+ * It helps to:
23
+ * - Determine whether the current user can access certain object.
24
+ * - Provide role-based rendering logic for UI components.
25
+ *
26
+ * @param permissions - The array of objects and actions to validate.
27
+ *
28
+ * @example
29
+ * const { data } = useValidateUserPermissions([{
30
+ "action": "act:read",
31
+ "object": "lib:test-lib",
32
+ "scope": "org:OpenedX"
33
+ }]);
34
+ * if (data[0].allowed) { ... }
35
+ *
36
+ */
37
+ export declare const useValidateUserPermissionsNonSuspense: (permissions: PermissionValidationRequest[]) => import("@tanstack/react-query").UseQueryResult<PermissionValidationResponse[], Error>;
38
+ export declare const useUserAccount: (username?: string) => import("@tanstack/react-query").UseQueryResult<import("./types").UserAccount, Error>;
@@ -0,0 +1,69 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { useQuery, useSuspenseQuery } from '@tanstack/react-query';
11
+ import { appId } from '../constants';
12
+ import { getUserAccount, validateUserPermissions } from './api';
13
+ const adminConsoleQueryKeys = {
14
+ all: [appId],
15
+ permissions: (permissions) => [...adminConsoleQueryKeys.all, 'validatePermissions', permissions],
16
+ userAccount: (username) => [...adminConsoleQueryKeys.all, 'userAccount', username],
17
+ };
18
+ /**
19
+ * React Query hook to validate if the current user has permissions over a certain object in the instance.
20
+ * It helps to:
21
+ * - Determine whether the current user can access certain object.
22
+ * - Provide role-based rendering logic for UI components.
23
+ *
24
+ * @param permissions - The array of objects and actions to validate.
25
+ *
26
+ * @example
27
+ * const { data } = useValidateUserPermissions([{
28
+ "action": "act:read",
29
+ "object": "lib:test-lib",
30
+ "scope": "org:OpenedX"
31
+ }]);
32
+ * if (data[0].allowed) { ... }
33
+ *
34
+ */
35
+ export const useValidateUserPermissions = (permissions) => useSuspenseQuery({
36
+ queryKey: adminConsoleQueryKeys.permissions(permissions),
37
+ queryFn: () => validateUserPermissions(permissions),
38
+ retry: false,
39
+ });
40
+ /**
41
+ * React Query hook to validate if the current user has permissions over a certain object in the instance.
42
+ * It helps to:
43
+ * - Determine whether the current user can access certain object.
44
+ * - Provide role-based rendering logic for UI components.
45
+ *
46
+ * @param permissions - The array of objects and actions to validate.
47
+ *
48
+ * @example
49
+ * const { data } = useValidateUserPermissions([{
50
+ "action": "act:read",
51
+ "object": "lib:test-lib",
52
+ "scope": "org:OpenedX"
53
+ }]);
54
+ * if (data[0].allowed) { ... }
55
+ *
56
+ */
57
+ export const useValidateUserPermissionsNonSuspense = (permissions) => useQuery({
58
+ queryKey: adminConsoleQueryKeys.permissions(permissions),
59
+ queryFn: () => validateUserPermissions(permissions),
60
+ retry: false,
61
+ });
62
+ export const useUserAccount = (username) => useQuery({
63
+ queryKey: adminConsoleQueryKeys.userAccount(username),
64
+ queryFn: () => __awaiter(void 0, void 0, void 0, function* () { return getUserAccount(username); }),
65
+ retry: false,
66
+ enabled: !!username,
67
+ refetchOnWindowFocus: false,
68
+ });
69
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/data/hooks.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,qBAAqB,GAAG;IAC5B,GAAG,EAAE,CAAC,KAAK,CAAU;IACrB,WAAW,EAAE,CAAC,WAA0C,EAAE,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,EAAE,WAAW,CAAU;IACxI,WAAW,EAAE,CAAC,QAAiB,EAAE,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAU;CACrG,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,WAA0C,EAC1C,EAAE,CAAC,gBAAgB,CAAwC;IAC3D,QAAQ,EAAE,qBAAqB,CAAC,WAAW,CAAC,WAAW,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,WAAW,CAAC;IACnD,KAAK,EAAE,KAAK;CACb,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,CACnD,WAA0C,EAC1C,EAAE,CAAC,QAAQ,CAAwC;IACnD,QAAQ,EAAE,qBAAqB,CAAC,WAAW,CAAC,WAAW,CAAC;IACxD,OAAO,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,WAAW,CAAC;IACnD,KAAK,EAAE,KAAK;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC;IAC5D,QAAQ,EAAE,qBAAqB,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrD,OAAO,EAAE,GAAS,EAAE,kDAAC,OAAA,cAAc,CAAC,QAAQ,CAAC,CAAA,GAAA;IAC7C,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,CAAC,CAAC,QAAQ;IACnB,oBAAoB,EAAE,KAAK;CAC5B,CAAC,CAAC","sourcesContent":["import { useQuery, useSuspenseQuery } from '@tanstack/react-query';\nimport { PermissionValidationRequest, PermissionValidationResponse } from '@src/types';\nimport { appId } from '@src/constants';\nimport { getUserAccount, validateUserPermissions } from './api';\n\nconst adminConsoleQueryKeys = {\n all: [appId] as const,\n permissions: (permissions: PermissionValidationRequest[]) => [...adminConsoleQueryKeys.all, 'validatePermissions', permissions] as const,\n userAccount: (username?: string) => [...adminConsoleQueryKeys.all, 'userAccount', username] as const,\n};\n\n/**\n * React Query hook to validate if the current user has permissions over a certain object in the instance.\n * It helps to:\n * - Determine whether the current user can access certain object.\n * - Provide role-based rendering logic for UI components.\n *\n * @param permissions - The array of objects and actions to validate.\n *\n * @example\n * const { data } = useValidateUserPermissions([{\n \"action\": \"act:read\",\n \"object\": \"lib:test-lib\",\n \"scope\": \"org:OpenedX\"\n }]);\n * if (data[0].allowed) { ... }\n *\n */\nexport const useValidateUserPermissions = (\n permissions: PermissionValidationRequest[],\n) => useSuspenseQuery<PermissionValidationResponse[], Error>({\n queryKey: adminConsoleQueryKeys.permissions(permissions),\n queryFn: () => validateUserPermissions(permissions),\n retry: false,\n});\n\n/**\n * React Query hook to validate if the current user has permissions over a certain object in the instance.\n * It helps to:\n * - Determine whether the current user can access certain object.\n * - Provide role-based rendering logic for UI components.\n *\n * @param permissions - The array of objects and actions to validate.\n *\n * @example\n * const { data } = useValidateUserPermissions([{\n \"action\": \"act:read\",\n \"object\": \"lib:test-lib\",\n \"scope\": \"org:OpenedX\"\n }]);\n * if (data[0].allowed) { ... }\n *\n */\nexport const useValidateUserPermissionsNonSuspense = (\n permissions: PermissionValidationRequest[],\n) => useQuery<PermissionValidationResponse[], Error>({\n queryKey: adminConsoleQueryKeys.permissions(permissions),\n queryFn: () => validateUserPermissions(permissions),\n retry: false,\n});\n\nexport const useUserAccount = (username?: string) => useQuery({\n queryKey: adminConsoleQueryKeys.userAccount(username),\n queryFn: async () => getUserAccount(username),\n retry: false,\n enabled: !!username,\n refetchOnWindowFocus: false,\n});\n"]}
@@ -0,0 +1,38 @@
1
+ export interface ProfileImage {
2
+ hasImage: boolean;
3
+ imageUrlFull: string;
4
+ imageUrlLarge: string;
5
+ imageUrlMedium: string;
6
+ imageUrlSmall: string;
7
+ }
8
+ export interface UserAccount {
9
+ accountPrivacy: string;
10
+ profileImage: ProfileImage;
11
+ username: string;
12
+ bio: string | null;
13
+ courseCertificates: unknown | null;
14
+ country: string | null;
15
+ dateJoined: string;
16
+ languageProficiencies: unknown[];
17
+ levelOfEducation: string | null;
18
+ socialLinks: unknown[];
19
+ timeZone: string | null;
20
+ name: string;
21
+ email: string;
22
+ id: number;
23
+ verifiedName: string | null;
24
+ extendedProfile: unknown[];
25
+ gender: string | null;
26
+ state: string | null;
27
+ goals: string;
28
+ isActive: boolean;
29
+ lastLogin: string;
30
+ mailingAddress: string;
31
+ requiresParentalConsent: boolean;
32
+ secondaryEmail: string | null;
33
+ secondaryEmailEnabled: boolean | null;
34
+ yearOfBirth: number | null;
35
+ phoneNumber: string | null;
36
+ activationKey: string;
37
+ pendingNameChange: string | null;
38
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ProfileImage {\n hasImage: boolean;\n imageUrlFull: string;\n imageUrlLarge: string;\n imageUrlMedium: string;\n imageUrlSmall: string;\n}\n\nexport interface UserAccount {\n accountPrivacy: string;\n profileImage: ProfileImage;\n username: string;\n bio: string | null;\n courseCertificates: unknown | null; // Type unclear from data\n country: string | null;\n dateJoined: string; // ISO date string\n languageProficiencies: unknown[]; // Array type unclear from empty data\n levelOfEducation: string | null;\n socialLinks: unknown[]; // Array type unclear from empty data\n timeZone: string | null;\n name: string;\n email: string;\n id: number;\n verifiedName: string | null;\n extendedProfile: unknown[]; // Array type unclear from empty data\n gender: string | null;\n state: string | null;\n goals: string;\n isActive: boolean;\n lastLogin: string; // ISO date string\n mailingAddress: string;\n requiresParentalConsent: boolean;\n secondaryEmail: string | null;\n secondaryEmailEnabled: boolean | null;\n yearOfBirth: number | null;\n phoneNumber: string | null;\n activationKey: string;\n pendingNameChange: string | null;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const getApiUrl: (path: string) => string;
2
+ /**
3
+ * Safely reads the HTTP status that @edx/frontend-platform's HTTP client attaches
4
+ * to thrown errors. Returns `undefined` when no status is present.
5
+ */
6
+ export declare const getHttpErrorStatus: (error: unknown) => number | undefined;
@@ -0,0 +1,11 @@
1
+ import { getSiteConfig } from '@openedx/frontend-base';
2
+ export const getApiUrl = (path) => `${getSiteConfig().lmsBaseUrl}${path || ''}`;
3
+ /**
4
+ * Safely reads the HTTP status that @edx/frontend-platform's HTTP client attaches
5
+ * to thrown errors. Returns `undefined` when no status is present.
6
+ */
7
+ export const getHttpErrorStatus = (error) => {
8
+ var _a;
9
+ return ((_a = error === null || error === void 0 ? void 0 : error.customAttributes) === null || _a === void 0 ? void 0 : _a.httpErrorStatus);
10
+ };
11
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/data/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;AAExF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAsB,EAAE;;IAAC,OAAA,CACxE,MAAC,KAA0C,aAA1C,KAAK,uBAAL,KAAK,CAAuC,gBAAgB,0CAAE,eAAe,CAC/E,CAAA;CAAA,CAAC","sourcesContent":["import { getSiteConfig } from '@openedx/frontend-base';\n\nexport const getApiUrl = (path: string) => `${getSiteConfig().lmsBaseUrl}${path || ''}`;\n\n/**\n * Safely reads the HTTP status that @edx/frontend-platform's HTTP client attaches\n * to thrown errors. Returns `undefined` when no status is present.\n */\nexport const getHttpErrorStatus = (error: unknown): number | undefined => (\n (error as PlatformError | null | undefined)?.customAttributes?.httpErrorStatus\n);\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,3 @@
1
+ export { default as adminConsoleApp } from './app';
2
+ export { default as adminConsoleRoutes } from './routes';
3
+ export { default as adminConsoleMessages } from './i18n';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { default as adminConsoleApp } from './app';
2
+ export { default as adminConsoleRoutes } from './routes';
3
+ export { default as adminConsoleMessages } from './i18n';
4
+ //# sourceMappingURL=index.js.map