@clickview/lite 0.75.0-rc.2 → 0.75.0-rc.3

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 (160) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{119-lite-a1f592f602.chunk.css → 1243-lite-13eda8f6a0.chunk.css} +2 -4
  3. package/dist/css/{7230-lite-36ff6e6d53.chunk.css → 1867-lite-8baa8af02b.chunk.css} +3 -5
  4. package/dist/css/{5241-lite-baab687563.chunk.css → 4203-lite-9ffab89741.chunk.css} +3 -5
  5. package/dist/css/{8364-lite-99938dea56.chunk.css → 5193-lite-d434056013.chunk.css} +1 -0
  6. package/dist/css/{7339-lite-05c396fed3.chunk.css → 6756-lite-839687d3d7.chunk.css} +1 -0
  7. package/dist/css/{9527-lite-1d2221b6a8.chunk.css → 7103-lite-fef3024f61.chunk.css} +2 -4
  8. package/dist/css/{8856-lite-827b34aed7.chunk.css → 8856-lite-c114ab5c89.chunk.css} +1 -1
  9. package/dist/languages/en.json +1 -1
  10. package/dist/scripts/104-7abe2b09dd-lite.chunk.js +2 -0
  11. package/dist/scripts/104-7abe2b09dd-lite.chunk.js.map +1 -0
  12. package/dist/scripts/1074-2ab8b03e30-lite.chunk.js +2 -0
  13. package/dist/scripts/1074-2ab8b03e30-lite.chunk.js.map +1 -0
  14. package/dist/scripts/1087-861be5211f-lite.chunk.js +2 -0
  15. package/dist/scripts/1087-861be5211f-lite.chunk.js.map +1 -0
  16. package/dist/scripts/1199-6522b1d291-lite.chunk.js +2 -0
  17. package/dist/scripts/1199-6522b1d291-lite.chunk.js.map +1 -0
  18. package/dist/scripts/121-1b744469ee-lite.chunk.js +2 -0
  19. package/dist/scripts/121-1b744469ee-lite.chunk.js.map +1 -0
  20. package/dist/scripts/{1221-502395e693-lite.chunk.js → 1221-894d8474d5-lite.chunk.js} +3 -3
  21. package/dist/scripts/1221-894d8474d5-lite.chunk.js.map +1 -0
  22. package/dist/scripts/1243-ede924125c-lite.chunk.js +2 -0
  23. package/dist/scripts/1243-ede924125c-lite.chunk.js.map +1 -0
  24. package/dist/scripts/147-44ee7e9a78-lite.chunk.js +2 -0
  25. package/dist/scripts/147-44ee7e9a78-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{1610-7f58bb25a9-lite.chunk.js → 1610-bf848cce4d-lite.chunk.js} +2 -2
  27. package/dist/scripts/{1610-7f58bb25a9-lite.chunk.js.map → 1610-bf848cce4d-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js → 1867-3b447a1b85-lite.chunk.js} +2 -2
  29. package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js.map → 1867-3b447a1b85-lite.chunk.js.map} +1 -1
  30. package/dist/scripts/2258-ed7383502f-lite.chunk.js +3 -0
  31. package/dist/scripts/2258-ed7383502f-lite.chunk.js.map +1 -0
  32. package/dist/scripts/3268-2736356687-lite.chunk.js +2 -0
  33. package/dist/scripts/{3268-faca1bf46e-lite.chunk.js.map → 3268-2736356687-lite.chunk.js.map} +1 -1
  34. package/dist/scripts/3836-425334ab13-lite.chunk.js +2 -0
  35. package/dist/scripts/{3836-f2a0c9f713-lite.chunk.js.map → 3836-425334ab13-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/3837-e4c5bb738b-lite.chunk.js +2 -0
  37. package/dist/scripts/3837-e4c5bb738b-lite.chunk.js.map +1 -0
  38. package/dist/scripts/4185-1f65c7adc9-lite.chunk.js +2 -0
  39. package/dist/scripts/4185-1f65c7adc9-lite.chunk.js.map +1 -0
  40. package/dist/scripts/4203-ee50e89841-lite.chunk.js +3 -0
  41. package/dist/scripts/4203-ee50e89841-lite.chunk.js.map +1 -0
  42. package/dist/scripts/4598-bcd3f6f8a7-lite.chunk.js +2 -0
  43. package/dist/scripts/{4598-2b1daca7ae-lite.chunk.js.map → 4598-bcd3f6f8a7-lite.chunk.js.map} +1 -1
  44. package/dist/scripts/4948-f21dad2ca1-lite.chunk.js +2 -0
  45. package/dist/scripts/4948-f21dad2ca1-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{5153-079b4125ae-lite.chunk.js → 5153-acc6c13153-lite.chunk.js} +3 -3
  47. package/dist/scripts/5153-acc6c13153-lite.chunk.js.map +1 -0
  48. package/dist/scripts/6137-bc8b193237-lite.chunk.js +2 -0
  49. package/dist/scripts/6137-bc8b193237-lite.chunk.js.map +1 -0
  50. package/dist/scripts/6756-e90680dfcd-lite.chunk.js +3 -0
  51. package/dist/scripts/6756-e90680dfcd-lite.chunk.js.map +1 -0
  52. package/dist/scripts/6790-c8a9efba50-lite.chunk.js +2 -0
  53. package/dist/scripts/6790-c8a9efba50-lite.chunk.js.map +1 -0
  54. package/dist/scripts/705-10a85bae7a-lite.chunk.js +2 -0
  55. package/dist/scripts/705-10a85bae7a-lite.chunk.js.map +1 -0
  56. package/dist/scripts/7103-14bd3771d2-lite.chunk.js +2 -0
  57. package/dist/scripts/7103-14bd3771d2-lite.chunk.js.map +1 -0
  58. package/dist/scripts/7205-12a6b2ac55-lite.chunk.js +2 -0
  59. package/dist/scripts/7205-12a6b2ac55-lite.chunk.js.map +1 -0
  60. package/dist/scripts/7438-88d11bb89a-lite.chunk.js +2 -0
  61. package/dist/scripts/7438-88d11bb89a-lite.chunk.js.map +1 -0
  62. package/dist/scripts/7480-e0749592fc-lite.chunk.js +2 -0
  63. package/dist/scripts/7480-e0749592fc-lite.chunk.js.map +1 -0
  64. package/dist/scripts/8010-e9163f5bee-lite.chunk.js +2 -0
  65. package/dist/scripts/8010-e9163f5bee-lite.chunk.js.map +1 -0
  66. package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js +3 -0
  67. package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js.map +1 -0
  68. package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js +2 -0
  69. package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js.map +1 -0
  70. package/dist/scripts/8856-02dd2e486c-lite.chunk.js +2 -0
  71. package/dist/scripts/8856-02dd2e486c-lite.chunk.js.map +1 -0
  72. package/dist/scripts/9003-1db925f5ec-lite.chunk.js +2 -0
  73. package/dist/scripts/9003-1db925f5ec-lite.chunk.js.map +1 -0
  74. package/dist/scripts/9042-1a42fcbba2-lite.chunk.js +2 -0
  75. package/dist/scripts/9042-1a42fcbba2-lite.chunk.js.map +1 -0
  76. package/dist/scripts/9103-4eec16d73b-lite.chunk.js +2 -0
  77. package/dist/scripts/9103-4eec16d73b-lite.chunk.js.map +1 -0
  78. package/dist/scripts/9134-19912ca3ee-lite.chunk.js +2 -0
  79. package/dist/scripts/9134-19912ca3ee-lite.chunk.js.map +1 -0
  80. package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js +2 -0
  81. package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js.map +1 -0
  82. package/dist/scripts/9740-9d50d31b72-lite.chunk.js +2 -0
  83. package/dist/scripts/9740-9d50d31b72-lite.chunk.js.map +1 -0
  84. package/dist/scripts/{bundle-95a6fc2722.min.js → bundle-828ca65de8.min.js} +3 -3
  85. package/dist/scripts/{bundle-95a6fc2722.min.js.map → bundle-828ca65de8.min.js.map} +1 -1
  86. package/package.json +1 -1
  87. package/dist/scripts/104-b62a8447f0-lite.chunk.js +0 -2
  88. package/dist/scripts/104-b62a8447f0-lite.chunk.js.map +0 -1
  89. package/dist/scripts/107-989ac2dc47-lite.chunk.js +0 -2
  90. package/dist/scripts/107-989ac2dc47-lite.chunk.js.map +0 -1
  91. package/dist/scripts/119-e3a8bd94dd-lite.chunk.js +0 -2
  92. package/dist/scripts/119-e3a8bd94dd-lite.chunk.js.map +0 -1
  93. package/dist/scripts/1199-a2ac2338d0-lite.chunk.js +0 -2
  94. package/dist/scripts/1199-a2ac2338d0-lite.chunk.js.map +0 -1
  95. package/dist/scripts/121-bf7a153eb8-lite.chunk.js +0 -2
  96. package/dist/scripts/121-bf7a153eb8-lite.chunk.js.map +0 -1
  97. package/dist/scripts/1221-502395e693-lite.chunk.js.map +0 -1
  98. package/dist/scripts/2258-4d0639c9fe-lite.chunk.js +0 -3
  99. package/dist/scripts/2258-4d0639c9fe-lite.chunk.js.map +0 -1
  100. package/dist/scripts/3268-faca1bf46e-lite.chunk.js +0 -2
  101. package/dist/scripts/3836-f2a0c9f713-lite.chunk.js +0 -2
  102. package/dist/scripts/3837-fe321e8deb-lite.chunk.js +0 -2
  103. package/dist/scripts/3837-fe321e8deb-lite.chunk.js.map +0 -1
  104. package/dist/scripts/4025-306e0fbdd5-lite.chunk.js +0 -2
  105. package/dist/scripts/4025-306e0fbdd5-lite.chunk.js.map +0 -1
  106. package/dist/scripts/4164-5d3af57b67-lite.chunk.js +0 -2
  107. package/dist/scripts/4164-5d3af57b67-lite.chunk.js.map +0 -1
  108. package/dist/scripts/4185-e8e40dab72-lite.chunk.js +0 -2
  109. package/dist/scripts/4185-e8e40dab72-lite.chunk.js.map +0 -1
  110. package/dist/scripts/4562-545f04c53f-lite.chunk.js +0 -2
  111. package/dist/scripts/4562-545f04c53f-lite.chunk.js.map +0 -1
  112. package/dist/scripts/4598-2b1daca7ae-lite.chunk.js +0 -2
  113. package/dist/scripts/4948-66ba60c8e3-lite.chunk.js +0 -2
  114. package/dist/scripts/4948-66ba60c8e3-lite.chunk.js.map +0 -1
  115. package/dist/scripts/5153-079b4125ae-lite.chunk.js.map +0 -1
  116. package/dist/scripts/5241-163f5ac64c-lite.chunk.js +0 -3
  117. package/dist/scripts/5241-163f5ac64c-lite.chunk.js.map +0 -1
  118. package/dist/scripts/5349-bc0fcb4083-lite.chunk.js +0 -2
  119. package/dist/scripts/5349-bc0fcb4083-lite.chunk.js.map +0 -1
  120. package/dist/scripts/6135-a878a9cff0-lite.chunk.js +0 -3
  121. package/dist/scripts/6135-a878a9cff0-lite.chunk.js.map +0 -1
  122. package/dist/scripts/6509-23fdb20a4b-lite.chunk.js +0 -2
  123. package/dist/scripts/6509-23fdb20a4b-lite.chunk.js.map +0 -1
  124. package/dist/scripts/6790-5086b72662-lite.chunk.js +0 -2
  125. package/dist/scripts/6790-5086b72662-lite.chunk.js.map +0 -1
  126. package/dist/scripts/7205-2428f775a5-lite.chunk.js +0 -2
  127. package/dist/scripts/7205-2428f775a5-lite.chunk.js.map +0 -1
  128. package/dist/scripts/7339-5793c921bb-lite.chunk.js +0 -3
  129. package/dist/scripts/7339-5793c921bb-lite.chunk.js.map +0 -1
  130. package/dist/scripts/7438-a5f96e58fc-lite.chunk.js +0 -2
  131. package/dist/scripts/7438-a5f96e58fc-lite.chunk.js.map +0 -1
  132. package/dist/scripts/7926-6b040931aa-lite.chunk.js +0 -2
  133. package/dist/scripts/7926-6b040931aa-lite.chunk.js.map +0 -1
  134. package/dist/scripts/8536-f75009dd87-lite.chunk.js +0 -2
  135. package/dist/scripts/8536-f75009dd87-lite.chunk.js.map +0 -1
  136. package/dist/scripts/8856-df102acdff-lite.chunk.js +0 -2
  137. package/dist/scripts/8856-df102acdff-lite.chunk.js.map +0 -1
  138. package/dist/scripts/9134-42dc2390ce-lite.chunk.js +0 -2
  139. package/dist/scripts/9134-42dc2390ce-lite.chunk.js.map +0 -1
  140. package/dist/scripts/9266-c5d6705147-lite.chunk.js +0 -2
  141. package/dist/scripts/9266-c5d6705147-lite.chunk.js.map +0 -1
  142. package/dist/scripts/9284-402a14d41c-lite.chunk.js +0 -2
  143. package/dist/scripts/9284-402a14d41c-lite.chunk.js.map +0 -1
  144. package/dist/scripts/9470-11c8c2ca71-lite.chunk.js +0 -2
  145. package/dist/scripts/9470-11c8c2ca71-lite.chunk.js.map +0 -1
  146. package/dist/scripts/9527-111c8586a7-lite.chunk.js +0 -2
  147. package/dist/scripts/9527-111c8586a7-lite.chunk.js.map +0 -1
  148. package/dist/scripts/9591-230bcf0935-lite.chunk.js +0 -2
  149. package/dist/scripts/9591-230bcf0935-lite.chunk.js.map +0 -1
  150. /package/dist/css/{5349-lite-829df3b4e7.chunk.css → 6137-lite-829df3b4e7.chunk.css} +0 -0
  151. /package/dist/css/{9470-lite-edb2d29928.chunk.css → 8010-lite-edb2d29928.chunk.css} +0 -0
  152. /package/dist/css/{6135-lite-41bdd1c5a3.chunk.css → 8410-lite-41bdd1c5a3.chunk.css} +0 -0
  153. /package/dist/css/{121-lite-1337d9acf0.chunk.css → 9042-lite-1337d9acf0.chunk.css} +0 -0
  154. /package/dist/scripts/{1221-502395e693-lite.chunk.js.LICENSE.txt → 1221-894d8474d5-lite.chunk.js.LICENSE.txt} +0 -0
  155. /package/dist/scripts/{2258-4d0639c9fe-lite.chunk.js.LICENSE.txt → 2258-ed7383502f-lite.chunk.js.LICENSE.txt} +0 -0
  156. /package/dist/scripts/{5153-079b4125ae-lite.chunk.js.LICENSE.txt → 4203-ee50e89841-lite.chunk.js.LICENSE.txt} +0 -0
  157. /package/dist/scripts/{5241-163f5ac64c-lite.chunk.js.LICENSE.txt → 5153-acc6c13153-lite.chunk.js.LICENSE.txt} +0 -0
  158. /package/dist/scripts/{6135-a878a9cff0-lite.chunk.js.LICENSE.txt → 6756-e90680dfcd-lite.chunk.js.LICENSE.txt} +0 -0
  159. /package/dist/scripts/{7339-5793c921bb-lite.chunk.js.LICENSE.txt → 8410-1f1fd5ccf0-lite.chunk.js.LICENSE.txt} +0 -0
  160. /package/dist/scripts/{bundle-95a6fc2722.min.js.LICENSE.txt → bundle-828ca65de8.min.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/107-989ac2dc47-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/search/components/scoped-search-bar/scoped-search-bar.scss","file:///app/packages/libs/shared/src/apps/search/components/scoped-search-bar/ScopedSearchBar.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-filters/PartialSearchFilters.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/partial-user-list.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/PartialUserList.tsx","file:///app/packages/libs/shared/src/components/bulk-selection-summary/bulk-selection-summary.scss","file:///app/packages/libs/shared/src/components/bulk-selection-summary/BulkSelectionSummary.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/JobTitle.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/LastActive.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/UserAuthenticationMethods.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTable.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTableUtils.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/manage-users-table.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/select-with-spreadsheet.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/select-with-spreadsheet-popup.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/SelectWithSpreadsheetPopup.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/ManageUsers.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useGetActions.tsx","file:///app/packages/libs/shared/src/apps/user-manager/errors/sso-password-reset-email-not-allowed/SsoPasswordResetEmailNotAllowedError.tsx","file:///app/packages/libs/shared/src/utils/CuratorPermissionsHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/UserItemActions.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/user-manager-entries.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/UserManagerEntries.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-header/UserManagerHeader.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/warning-alert/warning-alert.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/warning-alert/WarningAlert.tsx","file:///app/packages/libs/shared/src/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useFetchUserCount.ts","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","file:///app/packages/libs/shared/src/enums/BatchJobStatus.ts","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/libs/shared/src/flight-requests/RosteringRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/projects/lite/src/apps/user-manager/constants/SelectWithSpreadsheetTemplate.ts","file:///app/packages/projects/lite/src/apps/user-manager/hooks/useFetchUsers.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"searchSvg\":\"NXv7I\",\"searchInput\":\"ntGKR\"};","import React from 'react';\n\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useDebounce } from 'libs/shared/hooks/UseDebounce';\nimport { useSearchEventLogger } from 'libs/shared/hooks/UseSearchEventLogger';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './scoped-search-bar.scss';\n\ninterface ScopedSearchBarProps {\n id: string;\n searchAppLink: Core.AppLink;\n searchIndices: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n name?: string;\n placeholder?: string;\n className?: string;\n queryParamName?: string;\n debounceTime?: number;\n size?: FormSize;\n}\n\nScopedSearchBar.defaultProps = {\n debounceTime: 300,\n queryParamName: 'query'\n};\n\nexport function ScopedSearchBar(props: ScopedSearchBarProps): JSX.Element {\n const currentQueryParams = ContextService.getCurrentRoute().appLink.params as HashObject;\n\n const [ searchQuery, setSearchQuery ] = React.useState(currentQueryParams?.[props.queryParamName] ?? '');\n\n /**\n * Update the value in the search bar to match an existing query param on first load\n */\n React.useEffect(() => {\n if (!currentQueryParams)\n return;\n\n if (currentQueryParams[props.queryParamName]) {\n setSearchQuery(currentQueryParams[props.queryParamName]?.trim() ?? '');\n return;\n }\n\n if (searchQuery.length && !currentQueryParams[props.queryParamName]?.length)\n setSearchQuery('');\n }, [props.id]);\n\n React.useEffect(() => {\n if (currentQueryParams?.[props.queryParamName] && currentQueryParams?.[props.queryParamName] !== searchQuery) {\n setSearchQuery(currentQueryParams?.[props.queryParamName]);\n }\n }, [currentQueryParams?.[props.queryParamName]]);\n\n const debouncedQuery = useDebounce(searchQuery, props.debounceTime);\n\n React.useEffect(() => {\n search(debouncedQuery);\n }, [debouncedQuery]);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>): void {\n setSearchQuery(event.target.value);\n }\n\n function search(query: string = ''): void {\n if (query === currentQueryParams[props.queryParamName] || (!query && !currentQueryParams[props.queryParamName]))\n return;\n\n const currentFilters = ObjectHelper.omit(currentQueryParams, [ props.queryParamName, 'cursor' ]);\n\n const nextParams = {\n [props.queryParamName]: query.trim() ? query.trimLeft() : '',\n ...currentFilters\n };\n\n if (!nextParams[props.queryParamName]) {\n delete nextParams[props.queryParamName];\n delete nextParams.cursor;\n }\n\n ScrollHelper.preventScrollTop();\n\n if (props.analyticsOptions) {\n AnalyticsHelper.logUserAction({\n query,\n indices: props.searchIndices\n }, AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.InstantSearch,\n workflowPhase: WorkflowPhase.Complete\n }));\n }\n\n Core.AppLinkHelper.trigger({\n ...props.searchAppLink,\n params: nextParams\n });\n }\n\n const { log } = useSearchEventLogger({\n query: searchQuery,\n indices: props.searchIndices,\n analyticsOptions: props.analyticsOptions,\n shouldLog: !!props.analyticsOptions\n });\n\n return (\n <div className='position-relative w-100'>\n <input\n name={props.name}\n type='text'\n className={classNames(\n `form-control pe-2 w-100 border-dark ${styles.searchInput}`,\n props.size === 'lg' && 'form-control-lg',\n props.className\n )}\n id={props.id}\n autoComplete='off'\n placeholder={props.placeholder}\n aria-label='Search'\n onChange={onChange}\n onBlur={e => log(e.target.value ?? '')}\n value={searchQuery}\n />\n <SvgContainer\n svgName={cvSvgLibrary.Search}\n className={`${styles.searchSvg} svg-container cursor-pointer text-dark`}\n />\n </div>\n );\n}","import * as React from 'react';\n\nimport styles from './search-filters.scss';\n\ninterface PartialSearchFiltersProps {\n count?: number;\n}\n\nexport function PartialSearchFilters({ count = 6 }: PartialSearchFiltersProps): JSX.Element {\n return (\n <div className='d-flex'>\n <div className='d-flex ps-1'>\n {Array(count).fill(null).map((item, index) => (\n <div key={index} className={`${styles.partialButton} partial-loading-background mx-1`} />\n ))}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userManagerSearchEmptyState';\n\ninterface UserManagerSearchEmptyStateProps {\n imageUrl: string;\n}\n\nexport function UserManagerSearchEmptyState(props: UserManagerSearchEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text namespace={namespace} phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text namespace={namespace} phrase='info' /></EmptyState.Info>\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialEntries\":\"TOmcn\",\"partialCreateUser\":\"Yf4Wx\",\"partialBulkUpload\":\"sp3ux\",\"partialCheckbox\":\"REK11\",\"partialYearGroup\":\"d2NEw\",\"partialName\":\"qmSU8\",\"partialEmail\":\"uHYQO\",\"partialAvatar\":\"Y796I\",\"lastActiveLabel\":\"aItB8\",\"lastActiveDate\":\"RMdcx\",\"partialAction\":\"jn0FO\"};","import React from 'react';\n\nimport styles from './partial-user-list.scss';\n\nfunction PartialUserItem(): JSX.Element {\n return (\n <li className='d-flex align-items-center py-2'>\n <div className={`ms-4 me-3 partial-loading-background ${styles.partialCheckbox}`} />\n\n <div className={`me-2 ms-n1 rounded-circle partial-loading-background ${styles.partialAvatar}`} />\n\n <div className='d-flex flex-column justify-content-center me-auto'>\n <div className='pb-1 d-flex align-items-center'>\n <div>\n <div className={`partial-loading-background align-middle d-inline-block ${styles.partialName}`} />\n </div>\n </div>\n\n <div className={`partial-loading-background me-1 align-middle d-inline-block ${styles.partialEmail}`} />\n </div>\n\n <div className='d-flex ps-1 me-3 d-flex justify-content-end'>\n <div className={`partial-loading-background ${styles.partialYearGroup}`} />\n </div>\n\n <span className='d-flex flex-column me-3'>\n <div className={`partial-loading-background mb-1 ${styles.lastActiveLabel}`} />\n <div className={`partial-loading-background ${styles.lastActiveDate}`} />\n </span>\n\n <div className='d-flex align-items-center'>\n <div className={`partial-loading-background ${styles.partialAction}`} />\n <div className={`partial-loading-background ${styles.partialAction}`} />\n </div>\n </li>\n );\n}\n\nexport function PartialUserList(): JSX.Element {\n return (\n <ul className='m-0 list-unstyled striped-list'>\n {Array(20).fill(null).map((item, index) => <PartialUserItem key={index} />)}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"iconContainer\":\"lUFJg\",\"loadingContainer\":\"b0Mz5\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './bulk-selection-summary.scss';\n\nconst namespace = 'shared.bulkSelectionSummary';\n\ninterface BulkSelectionSummaryProps {\n selectedCount: number;\n onClickDeselectAll: () => void;\n onClickSelectBulk: () => void;\n getTypeText: (count: number) => string;\n \n selectAllCount?: number;\n allSelected?: boolean;\n showSelectingSpinner?: boolean;\n onClickSelectAll?: (success: () => void) => void;\n\n hasRostering?: boolean;\n}\n\nexport function BulkSelectionSummary(props: BulkSelectionSummaryProps): JSX.Element {\n const [ selectAllSpinner, setSelectAllSpinner ] = React.useState(false);\n\n function onClickSelectAll(): void {\n setSelectAllSpinner(true);\n props.onClickSelectAll(() => {\n setSelectAllSpinner(false);\n });\n }\n\n if (!props.selectedCount && !props.showSelectingSpinner)\n return <></>;\n\n const showSelectAll = (\n !!props.onClickSelectAll &&\n !props.allSelected &&\n props.selectAllCount !== 0 &&\n props.selectAllCount > UserManagerConstants.USER_PAGE_LIMIT\n );\n\n return (\n <div className='border border-dark rounded-3 d-flex justify-content-between align-items-center p-2 mb-3'>\n {props.showSelectingSpinner ? (\n <div className={`px-2 d-flex align-items-center ${styles.loadingContainer}`}>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n ) : (\n <>\n <div className='d-flex align-items-center'>\n <div className={`${styles.iconContainer} text-white rounded-circle bg-dark me-3 ms-2 d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={cvSvgLibrary.Group} />\n </div>\n\n <Text\n namespace={namespace}\n phrase='selectedCount'\n options={{ smartCount: props.selectedCount, type: props.getTypeText(props.selectedCount) }}\n />\n\n {(() => {\n if (!showSelectAll)\n return <></>;\n\n if (selectAllSpinner || props.selectAllCount === undefined)\n return (\n <div className='px-2 py-1'>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n );\n\n return (\n <DivButton className='info-link px-2' onClick={onClickSelectAll}>\n <Text\n namespace={namespace}\n phrase='selectAll'\n options={{ smartCount: props.selectAllCount, type: props.getTypeText(props.selectAllCount) }}\n />\n </DivButton>\n );\n })()}\n </div>\n <div className='d-flex'>\n <button className='btn btn-link me-2' onClick={props.onClickDeselectAll}>\n <Text namespace={namespace} phrase='deselectAll' />\n </button>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n >\n <button\n className={props.hasRostering ? 'btn btn-outline-dark cursor-default disabled' : 'btn btn-outline-dark'}\n onClick={props.onClickSelectBulk}\n disabled={props.hasRostering}\n >\n <Text namespace={namespace} phrase='selectBulkAction' />\n </button>\n </Tooltip>\n </div>\n </>\n )}\n \n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface JobTitleProps {\n user: Partial<User>;\n}\n\nexport function JobTitle(props: JobTitleProps): JSX.Element {\n const jobTitle = props.user.userProfile?.metadata?.jobTitle || '-';\n\n return (\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='jobTitle' />\n </small>\n <span className={jobTitle === '-' ? 'ms-3' : ''}>\n {jobTitle}\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\nfunction isDateValid(date: string, status: ObjectStatus): boolean {\n return !!date && status === ObjectStatus.Active && DateHelper.get(date, 'year') >= 2000;\n}\n\nfunction getLastActiveDate(date: string, status: ObjectStatus): string {\n if (!isDateValid(date, status))\n return '-';\n\n const lastSignedIn = DateHelper.fromNow(date);\n\n if (lastSignedIn === 'a day ago')\n return LanguageService.getPhrase(namespace, 'yesterday');\n\n if (lastSignedIn.includes('hour'))\n return LanguageService.getPhrase(namespace, 'today');\n\n // If the string starts with a char that's not a number, convert it to uppercase. E.g. \"a year ago\"\n if (Number.isNaN(+lastSignedIn.substr(0, 1)))\n return lastSignedIn.substr(0, 1).toUpperCase() + lastSignedIn.substr(1);\n\n return lastSignedIn;\n}\n\ninterface LastActiveProps {\n user: User;\n currentUser?: CurrentUser;\n}\n\nexport function LastActive(props: LastActiveProps): JSX.Element {\n const date = getLastActiveDate(props.user.metadata?.lastSignInTime, props.user.status);\n\n const isCurrentUser = props.user.id.toString() === props.currentUser?.id.toString();\n\n return (\n <span className={`${styles.lastActiveContainer} ${isCurrentUser ? styles.isCurrentUser : ''}`}>\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='lastActive' />\n </small>\n <span className={date === '-' ? 'ms-3' : ''}>\n {date}\n </span>\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserAuthenticationMethodsProps {\n user: User;\n}\n\nexport function UserAuthenticationMethods(props: UserAuthenticationMethodsProps): JSX.Element {\n /**\n * Sort the authentication methods so that SSO always appear on top of ClickView\n */\n const sortedAuthMethods = React.useMemo(() => {\n return props.user.authenticationMethods?.sort(method => {\n return method.local ? 1 : -1;\n });\n }, [props.user.authenticationMethods]);\n \n if (!props.user.authenticationMethods?.length)\n return <></>;\n\n const hasSSO = props.user.authenticationMethods?.find(am => !am.local);\n\n return (\n <div className={`${styles.authMethodContainer} d-flex flex-row-reverse justify-content-center ms-n3`}>\n <Tooltip\n title={LanguageService.getPhrase(namespace, hasSSO ? 'ssoTooltip' : 'noSsoTooltip')}\n spanHack\n >\n {sortedAuthMethods.map((authMethod, i) => {\n const backgroundColor = authMethod.backgroundColour ? `#${authMethod.backgroundColour}` : '#fff';\n\n return (\n <div\n key={authMethod.displayName}\n className={`${styles.authMethodLogo} rounded-circle border`}\n style={{\n zIndex: props.user.authenticationMethods.length - i,\n backgroundImage: `url(${authMethod.logoUrl})`,\n backgroundColor\n }}\n />\n );\n })}\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './ManageUsersTableUtils';\n\nconst TABLE_THEME: TableTheme = {\n table: 'striped-list no-full-width pb-3',\n row: 'striped-row rounded',\n cell: 'd-flex align-items-center py-2'\n};\n\ninterface ManageUsersTableProps {\n users: User[];\n currentUser: CurrentUser;\n isChecked: (id: string) => boolean;\n onToggleCheckbox: (id: string) => void;\n imageCdnUrl: string;\n appLinks: UserManagerAppLinks;\n products?: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n shouldDisplayAuthenticationMethods: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n}\n\nexport const ManageUsersTable = React.memo(function (props: ManageUsersTableProps): JSX.Element {\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n const data = useGetData(props.users, props.isChecked);\n\n const columns = getColumns(\n props.onToggleCheckbox,\n props.imageCdnUrl,\n props.currentUser,\n props.appLinks,\n props.products,\n props.onClickResendActivationEmail,\n props.onClickSendResetEmail,\n props.onClickSendVerificationEmail,\n props.shouldDisplayAuthenticationMethods,\n props.ssoHelpArticle,\n props.hasRostering,\n client\n );\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={TABLE_THEME}\n />\n );\n});","import React from 'react';\nimport { CellProps, Column } from 'react-table';\n\nimport { JobTitle } from 'libs/shared/apps/user-manager/components/user-list-items/components/JobTitle';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { UserManagerAppLinks } from '../../interfaces';\nimport { BasicUserDetails } from '../user-list-items/components/BasicUserDetails';\nimport { LastActive } from '../user-list-items/components/LastActive';\nimport { RoleOrYearGroup } from '../user-list-items/components/RoleOrYearGroup';\nimport { UserAuthenticationMethods } from '../user-list-items/components/UserAuthenticationMethods';\nimport { UserItemActions } from '../user-list-items/components/UserItemActions';\nimport { UserItemAvatar } from '../user-list-items/components/UserItemAvatar';\n\nimport styles from './manage-users-table.scss';\n\ninterface ManageUsersTableData {\n user: User;\n checked: boolean;\n}\n\nexport function getColumns(\n onToggleCheckbox: (id: string) => void,\n imageCdnUrl: string,\n currentUser: CurrentUser,\n appLinks: UserManagerAppLinks,\n products: ProductId[],\n onClickResendActivationEmail?: (user: User) => void,\n onClickSendResetEmail?: (user: User) => void,\n onClickSendVerificationEmail?: (user: User) => void,\n shouldDisplayAuthenticationMethods?: boolean,\n ssoHelpArticle?: string,\n hasRostering?: boolean,\n client?: UserManagerClient\n): Column<ManageUsersTableData>[] {\n const columns: Column<ManageUsersTableData>[] = [\n {\n id: 'checkboxes',\n accessor: (data: ManageUsersTableData) => ({ id: data.user.id, checked: data.checked }),\n Cell: (cell: CellProps<ManageUsersTableData, { id: string; checked: boolean; }>) => React.useMemo(() => (\n <div className='w-100 text-center ms-3 ps-2'>\n <Checkbox\n id={cell.value.id}\n checked={cell.value.checked}\n onChange={() => onToggleCheckbox(cell.value.id)}\n />\n </div>\n ), []),\n width: 5\n },\n {\n accessor: 'user',\n id: 'avatar',\n Cell: ({ value }) => React.useMemo(\n () => {\n return (\n value.name ? (\n <div className='w-100'>\n <UserItemAvatar user={value} imageCdnUrl={imageCdnUrl} />\n </div>\n ) : (\n <div className={`${styles.avatarContainer} mx-2`}>\n <IconCircle\n svgName={cvSvgLibrary.User}\n variant='blue'\n svgSize={SvgContainerSize.ExtraLarge}\n svgWrapperClassName='p-1'\n />\n </div>\n ));\n }\n , []\n ),\n width: 5\n },\n {\n accessor: 'user',\n id: 'basicDetails',\n Cell: ({ value }) => React.useMemo(() => {\n return (\n <div className='w-100'>\n <BasicUserDetails user={value} currentUser={currentUser} />\n </div>\n );\n }, []),\n width: 50\n },\n {\n accessor: 'user',\n id: 'roleOrYearGroup',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 text-end'>\n <RoleOrYearGroup userType={value.userType} user={value} />\n </div>\n ), []),\n width: 11\n }\n ];\n\n if (client === UserManagerClient.Curator) {\n columns.push({\n accessor: 'user',\n id: 'jobTitle',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <JobTitle user={value} />\n </div>\n ), []),\n width: 8\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'lastActive',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <LastActive user={value} currentUser={currentUser} />\n </div>\n ), []),\n width: 8\n });\n \n if (shouldDisplayAuthenticationMethods) {\n columns.push({\n accessor: 'user',\n id: 'authMethods',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 d-flex justify-content-center'>\n <UserAuthenticationMethods user={value} />\n </div>\n ), []),\n width: 6\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'actions',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <UserItemActions\n user={value}\n userType={value.userType}\n appLinks={appLinks}\n onClickSendResetEmail={onClickSendResetEmail}\n onClickResendActivationEmail={onClickResendActivationEmail}\n onClickSendVerificationEmail={onClickSendVerificationEmail}\n currentUser={currentUser}\n ssoHelpArticle={ssoHelpArticle}\n products={products}\n hasRostering={hasRostering}\n />\n </div>\n ), []),\n width: 8\n });\n\n return columns;\n}\n\nexport function useGetData(users: User[], isChecked: (id: string) => boolean): ManageUsersTableData[] {\n return users.map(user => {\n return {\n user,\n checked: isChecked(user.id),\n isCurrentUser: false\n };\n });\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kq2Bn\"};","// extracted by mini-css-extract-plugin\nexport default {\"cell\":\"Vsgxg\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BulkUploadFileSelect } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-upload-file-select/BulkUploadFileSelect';\nimport { InvalidSpreadsheetError } from 'libs/shared/apps/user-manager/errors/invalid-spreadsheet/InvalidSpreadsheetError';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './select-with-spreadsheet.scss';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.selectStudentWithSpreadsheet',\n [UserGroup.Staff]: 'userManager.selectStaffWithSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ninterface SelectWithSpreadsheetProps {\n onSelectSpreadsheet: (userQuery: string[], spreadsheetRowCount: number) => void;\n onClickCancel: () => void;\n userType: UserGroup;\n templateLink: string;\n}\n\nexport function SelectWithSpreadsheet(props: SelectWithSpreadsheetProps): JSX.Element {\n const namespace = namespaces[props.userType];\n\n function onSelectSpreadsheet(data: string[][]): void {\n const isEmpty = BulkUserUploadHelper.validateEmptySpreadsheetData(data);\n if (isEmpty) {\n props.onClickCancel();\n return;\n }\n\n const clone = [...data];\n const headings = clone.shift();\n\n const { isValid, errorMessage } = BulkUserUploadHelper.validateSelectWithSpreadsheet(\n headings,\n [ 'Email', 'Username' ]\n );\n\n if (!isValid) {\n Core.ErrorHelper.throw(new InvalidSpreadsheetError(errorMessage));\n props.onClickCancel();\n return;\n }\n\n const requests = BulkUserUploadHelper.buildUserQueryFromSpreadsheet(headings, clone, props.userType);\n\n props.onSelectSpreadsheet(requests, data.length);\n }\n\n const ExampleSpreadSheet = () => {\n return (\n <LanguageNamespaceContext.Provider value={namespaces[props.userType]}>\n <table cellPadding={5}>\n <tbody>\n\n <tr className='text-center bg-light'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='a' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='b' /></td>\n </tr>\n\n <tr className='fw-semibold'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='email' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='username' /></td>\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleEmail' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n </tr>\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleUsername' /></td>\n </tr>\n </tbody>\n </table>\n </LanguageNamespaceContext.Provider>\n );\n };\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n {/* Step 1 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='downloadTemplateHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='downloadTemplateInfo' /></p>\n <div className='ms-n1 ps-3'>\n <a className='btn btn-outline-dark mx-auto' download href={props.templateLink}>\n <SvgContainer svgName={cvSvgLibrary.Download} className='svg-container std me-1 ms-n1 align-middle' />\n <div className='align-middle d-inline-block'><Text phrase='downloadBtn' /></div>\n </a>\n </div>\n </div>\n\n {/* Step 2 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='addUsersHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='addUsersInfo' /></p>\n <div className='mx-n1 px-3'>\n <ExampleSpreadSheet/>\n </div>\n </div>\n\n {/* Step 3 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='uploadHeading' /></div>\n <div className='d-inline-block ms-n1 ps-3 mt-1'>\n <div className='d-inline-block'>\n <BulkUploadFileSelect onSelectSpreadsheet={onSelectSpreadsheet} />\n </div>\n </div>\n </div>\n\n {/* Step 4 */}\n <div>\n <div className='h6'><Text phrase='matchesHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='matchesInfo' /></p>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"modalWidth\":\"KYu7Y\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { useManageUsersCheckboxHelper } from 'libs/shared/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper';\nimport { SelectWithSpreadsheet } from 'libs/shared/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './select-with-spreadsheet-popup.scss';\n\nconst namespaces = 'userManager.selectWithSpreadsheetPopup';\n\ntype ICheckboxHelper = ReturnType<typeof useManageUsersCheckboxHelper>\n\ntype SelectWithSpreadsheetPopupProps = {\n userType: UserGroup;\n users: User[];\n template: string;\n closePopup: () => void;\n checkboxHelper: ICheckboxHelper;\n setShowSelectingSpinner: (arg: boolean) => void;\n userRequest: (query: string) => Flight.Request;\n};\n\nexport function SelectWithSpreadsheetPopup(props: SelectWithSpreadsheetPopupProps): JSX.Element {\n const CheckboxHelper = props.checkboxHelper;\n const fetchAsync = Flight.useGetFetchAsync();\n let ids: string[] = [];\n\n function onSelectSpreadsheet(queries: string[], spreadsheetRowCount: number) {\n props.setShowSelectingSpinner(true);\n\n const requests = queries.map(q => {\n return fetchAsync<string[]>(props.userRequest(q));\n });\n\n Promise.all(requests).then(res => {\n res.forEach(r => {\n ids = ids.concat(r);\n });\n\n CheckboxHelper.selectAll(ids.map(id => id.toString()));\n\n AnalyticsHelper.logUserAction({\n userType: props.userType,\n spreadsheetRowCount: spreadsheetRowCount,\n totalUsersFound: ids.length\n }, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: LocationContext.Popup\n });\n\n props.setShowSelectingSpinner(false);\n });\n\n props.closePopup();\n }\n\n const dataLoaded = props.users.length;\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={LanguageService.getPhrase(namespaces, 'heading')}\n showLoadingSpinner={!dataLoaded}\n dialogClassName={styles.modalWidth}\n >\n {dataLoaded && (\n <SelectWithSpreadsheet\n userType={props.userType}\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.closePopup}\n templateLink={props.template}\n />\n )}\n </Popup>\n );\n}","import React from 'react';\n\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkCheckboxManagerOptions, useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { User } from 'libs/shared/interfaces';\n\ntype UsedParamNames = keyof Omit<UserManagerQueryParams, 'cursor' | 'sort'>;\n\ninterface ManagerUsersCheckboxHelper extends BulkCheckboxManagerOptions {\n queryParams: UserManagerQueryParams;\n}\n\n/**\n * Used by ManageUsers to determine if we should show the \"Select all X users\"\n * button or not, based on which filters we've previously selected all on\n */\nexport const useManageUsersCheckboxHelper = (\n users: User[],\n options: ManagerUsersCheckboxHelper\n) => {\n const CheckboxHelper = useBulkCheckboxManager(users, options);\n\n const [ bulkSelections, setBulkSelections ] = React.useState<any>({});\n\n function getSelectionKey(): string {\n // Need to disable linting complaining about our params\n // eslint-disable-next-line\n const { cursor, sort, ...queryParams } = options.queryParams;\n return Object.keys(queryParams)\n .sort()\n .map((key: UsedParamNames) => {\n const param = queryParams[key];\n return Array.isArray(param) ?\n param.sort().join(',') :\n param;\n })\n .join(':');\n }\n\n function selectAll(userIds: string[]): void {\n CheckboxHelper.setSelected(userIds);\n\n setBulkSelections({\n ...bulkSelections,\n [getSelectionKey()]: true\n });\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n setBulkSelections({});\n\n CheckboxHelper.onToggleItem(id);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n setBulkSelections({});\n\n if (!users?.length)\n return;\n\n CheckboxHelper.onToggleBulk();\n }\n\n function reset(): void {\n setBulkSelections({});\n CheckboxHelper.reset();\n }\n\n function allSelected(): boolean {\n if (!Object.keys(bulkSelections).length)\n return false;\n\n /**\n * This will be our selection key if they click select all\n * with no filters or queries\n */\n if (bulkSelections[''])\n return true;\n\n return bulkSelections[getSelectionKey()];\n }\n\n return {\n ...CheckboxHelper,\n selectAll,\n onToggleItem,\n onToggleBulk,\n reset,\n allSelected: allSelected()\n };\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { ClickDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ScopedSearchBar } from 'libs/shared/apps/search/components/scoped-search-bar/ScopedSearchBar';\nimport { PartialSearchFilters } from 'libs/shared/apps/search/components/search-filters/PartialSearchFilters';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { UserManagerSearchEmptyState } from 'libs/shared/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState';\nimport { PartialUserList } from 'libs/shared/apps/user-manager/components/user-list/partial-loading/PartialUserList';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { BulkSelectionSummary } from 'libs/shared/components/bulk-selection-summary/BulkSelectionSummary';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { Config, CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\n\nimport { ManageUsersTable } from '../manage-users-table/ManageUsersTable';\n\nimport { SelectWithSpreadsheetPopup } from './components/select-with-spreadsheet/SelectWithSpreadsheetPopup';\nimport { useGetActions } from './useGetActions';\nimport { useManageUsersCheckboxHelper } from './useManageUsersCheckboxHelper';\n\nconst namespace = 'userManager.manageUsers';\n\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.manageStudents',\n [UserGroup.Staff]: 'userManager.manageStaff',\n [UserGroup.Unknown]: ''\n};\n\ninterface ManageUsersListProps {\n users: User[];\n userType: UserGroup;\n config: Config;\n currentUser: CurrentUser;\n searchEmptyState: string;\n appLinks: UserManagerAppLinks;\n totalUsers: number;\n queryParams: UserManagerQueryParams;\n hasSso: boolean;\n hasRostering?: boolean;\n searchInputSize?: FormSize;\n onClickResendActivationEmail?: (user: User) => void;\n fetchUserIds: (success: (userIds: string[]) => void) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n ssoHelpArticle?: string;\n selectWithSpreadsheetTemplate: string;\n userRequest: (query: string, success?: (ids: string[]) => void) => Flight.Request;\n products?: ProductId[];\n}\n\ntype StudentProps = ManageUsersListProps & {\n userType: UserGroup.Learner;\n yearGroups: YearGroup[];\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n}\n\ntype StaffProps = ManageUsersListProps & {\n userType: UserGroup.Staff;\n yearGroups?: never;\n};\n\nexport function ManageUsers(props: StudentProps | StaffProps): JSX.Element {\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n const subNamespace = subNamespaces[props.userType];\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n const [ viewModel, setBulkActionViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const [ isSelectingWithSpreadsheet, setIsSelectingWithSpreadsheet ] = React.useState<boolean>(false);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const CheckboxHelper = useManageUsersCheckboxHelper(props.users, {\n persistNamespace: `manage:users:${props.userType}`,\n initialState: viewModel?.userIdMap,\n queryParams: props.queryParams\n });\n\n const extraActions = useGetActions({\n ...props,\n onSelectWithSpreadsheetSelect: () => setIsSelectingWithSpreadsheet(true),\n namespace: subNamespace,\n yearGroups: props.userType === UserGroup.Learner ? props.yearGroups : []\n });\n\n /**\n * We use this to unset our userIdMap when the user is leaving user manager.\n * When the user is going to bulk actions, we set clearOnExit to false\n * so that this hook cleanup doesn't unset our userIdMap.\n */\n const clearOnExit = React.useRef(true);\n React.useEffect(() => {\n return () => {\n if (clearOnExit.current)\n setBulkActionViewModel('userIdMap', undefined);\n };\n }, []);\n\n React.useEffect(() => {\n if (!CheckboxHelper.bulkChecked)\n return;\n\n if (props.totalUsers !== CheckboxHelper.getSelectedCount())\n return;\n\n setBulkActionViewModel('allUsersSelected', true);\n setBulkActionViewModel('allUsersCount', props.totalUsers);\n }, [CheckboxHelper.bulkChecked]);\n\n function onClickSelectBulkAction(): void {\n if (!CheckboxHelper.getSelectedCount())\n return;\n\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start\n });\n\n clearOnExit.current = false;\n setBulkActionViewModel('userIdMap', CheckboxHelper.getMap());\n Core.AppLinkHelper.trigger(props.appLinks.bulkActionsReviewAccounts);\n }\n \n function onToggleSelectAll(success: () => void): void {\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.SelectAllUsers,\n entity: EntityType.User\n });\n\n props.fetchUserIds(userIds => {\n CheckboxHelper.selectAll(userIds);\n\n /**\n * Used for determining if the user can use year level rollover\n */\n const allUsersSelected = !BulkUserActionsHelper.hasFilterOrQuery(props.queryParams);\n setBulkActionViewModel('allUsersSelected', allUsersSelected);\n\n if (allUsersSelected)\n setBulkActionViewModel('allUsersCount', userIds.length);\n\n success();\n });\n }\n\n function unsetAllUsersSelected(): void {\n setBulkActionViewModel('allUsersSelected', false);\n setBulkActionViewModel('allUsersCount', undefined);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n unsetAllUsersSelected();\n CheckboxHelper.onToggleBulk();\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n unsetAllUsersSelected();\n CheckboxHelper.onToggleItem(id);\n }\n\n function onClickDeselectAll(): void {\n unsetAllUsersSelected();\n CheckboxHelper.reset();\n }\n\n const mainFilters = React.useMemo(() => {\n return UserManagerHelper.getFilters(\n props.userType,\n props.userType === UserGroup.Learner ? props.yearGroups : []\n );\n }, [props.yearGroups?.length]);\n\n const showFiltersPartialLoading = (\n !props.currentUser?.id ||\n (props.userType === UserGroup.Learner && !props.yearGroups?.length)\n );\n\n return (\n <>\n {props.hasRostering && (\n <RosteringAlert />\n )}\n <div className='d-flex align-items-center pb-3'>\n <div className='ps-4 pe-1'>\n <Checkbox\n id='user-manager'\n name='user-manager'\n checked={CheckboxHelper.bulkChecked}\n onChange={onToggleBulk}\n indeterminate={CheckboxHelper.hasSomeSelections()}\n />\n </div>\n <div className='me-auto'>\n {!showFiltersPartialLoading ? (\n <SearchFilters\n queryParams={props.queryParams}\n mainFilters={mainFilters}\n appLink={props.appLinks.userManager}\n analyticsOptions={{\n entity: EntityType.User,\n location: analyticsLocation\n }}\n hideHeading\n hideDivider\n constantIndices={['user']}\n />\n ) : (\n <PartialSearchFilters count={3} />\n )}\n </div>\n\n <div className='w-25'>\n <ScopedSearchBar\n id={`user-manager-search-${props.userType}`}\n name={`user-manager-search-${props.userType}`}\n placeholder={LanguageService.getPhrase(namespace, 'searchBarPlaceholder')}\n searchAppLink={props.appLinks.search}\n size={props.searchInputSize}\n searchIndices={['user']}\n analyticsOptions={{ entity: EntityType.User, location: analyticsLocation }}\n />\n </div>\n <ActionsDropdown\n actions={extraActions}\n dropdownToggleClassName='btn btn-outline-dark ms-2'\n />\n </div>\n\n <BulkSelectionSummary\n getTypeText={count => LanguageService.getPhrase(subNamespace, 'bulkSelectLabel', { smartCount: count })}\n selectedCount={CheckboxHelper.getSelectedCount()}\n onClickSelectAll={onToggleSelectAll}\n selectAllCount={props.totalUsers}\n onClickDeselectAll={onClickDeselectAll}\n onClickSelectBulk={onClickSelectBulkAction}\n allSelected={CheckboxHelper.allSelected}\n showSelectingSpinner={showSpinner}\n hasRostering={props.hasRostering}\n />\n\n {(() => {\n if (!props.users)\n return <PartialUserList />;\n \n if (!props.users.length)\n return <UserManagerSearchEmptyState imageUrl={props.searchEmptyState} />;\n\n return (\n <ManageUsersTable\n users={props.users}\n currentUser={props.currentUser}\n imageCdnUrl={props.config.imageCdnUrl}\n appLinks={props.appLinks}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n isChecked={CheckboxHelper.isChecked}\n onToggleCheckbox={onToggleItem}\n ssoHelpArticle={props.ssoHelpArticle}\n shouldDisplayAuthenticationMethods={props.hasSso}\n products={props.products}\n hasRostering={props.hasRostering}\n />\n );\n })()}\n\n {isSelectingWithSpreadsheet && (\n <SelectWithSpreadsheetPopup\n users={props.users}\n template={props.selectWithSpreadsheetTemplate}\n userType={props.userType}\n checkboxHelper={CheckboxHelper}\n closePopup={() => {\n setIsSelectingWithSpreadsheet(false);\n }}\n setShowSelectingSpinner={setShowSpinner}\n userRequest={props.userRequest}\n />\n )}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CannotYearGroupRolloverError } from 'libs/shared/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { UserManagerConstants } from '../../constants/UserManagerConstants';\nimport { BulkUserActionsAnalyticsHelper } from '../../utils/BulkUserActionsAnalyticsHelper';\n\ntype UserGetActionProps = {\n userType: UserGroup;\n namespace: string;\n appLinks: UserManagerAppLinks;\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n onSelectWithSpreadsheetSelect: () => void;\n hasRostering?: boolean;\n yearGroups: YearGroup[];\n};\n\nexport function useGetActions(props: UserGetActionProps): ActionOptions[] {\n const [ , setWizardViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n\n const actions: ActionOptions[] = [{\n label: LanguageService.getPhrase(props.namespace, 'export'),\n appLink: props.appLinks.exportUserList,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Export,\n entity: EntityType.User,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n }];\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'auditLog'),\n appLink: props.appLinks.auditLog,\n onClick: () => {\n LocalStorageHelper.set(UserManagerConstants.AUDIT_LOG_REFERRER_KEY, props.userType);\n }\n });\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'selectWithSpreadsheet'),\n onClick: props.onSelectWithSpreadsheetSelect,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n });\n\n if (props.userType === UserGroup.Learner && props.yearGroupRolloverStatus && props.yearGroups?.length > 1) {\n const canRollover = !!props.yearGroupRolloverStatus?.canRollover && !props.hasRostering;\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'rollover'),\n appLink: canRollover && !props.hasRostering && props.appLinks.bulkActionsActionDetails.yearGroupRollover,\n disabled: !!props.hasRostering,\n className: props.hasRostering ? 'cursor-default disabled' : '',\n tooltip: props.hasRostering ? LanguageService.getPhrase(props.namespace, 'editControlledByRostering') : '',\n onClick: () => {\n if (canRollover) {\n setWizardViewModel({\n action: 'yearGroupRollover',\n subAction: 'yearGroupRollover'\n });\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n BulkUserActionsAnalyticsHelper.logYearGroupRolloverEntry(locationContext);\n return;\n }\n\n const error = new CannotYearGroupRolloverError(\n props.yearGroupRolloverStatus?.previousRolloverDate\n );\n\n Core.ErrorHelper.throw(error);\n }\n });\n }\n\n return actions;\n}\n","import React from 'react';\n\nimport { WarningAlert } from 'libs/shared/apps/user-manager/components/warning-alert/WarningAlert';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.ssoPasswordResetEmailNotAllowedError';\n\ninterface SsoPasswordResetEmailNotAllowedErrorProps {\n helpArticle: string;\n}\n\nexport function SsoPasswordResetEmailNotAllowedError(props: SsoPasswordResetEmailNotAllowedErrorProps): JSX.Element {\n return (\n <WarningAlert>\n <p className='mb-1 fw-semibold'>\n <Text namespace={namespace} phrase='warning' />\n </p>\n {props.helpArticle && (\n <a href={props.helpArticle} target='_blank' className='info-link'>\n <Text namespace={namespace} phrase='findMore' />\n </a>\n )}\n </WarningAlert>\n );\n}","import { CuratorGroup } from 'libs/shared/enums/CuratorGroup';\nimport { CuratorUser } from 'libs/shared/interfaces';\n\nfunction getGroupNames(user: CuratorUser): string[] {\n return (user && user.groups) ? user.groups.map(g => g.name) : [];\n}\n \nexport const CuratorPermissionsHelper = {\n isDev(user: CuratorUser): boolean {\n return getGroupNames(user).includes(CuratorGroup.Developer);\n },\n\n hasSubjectsAccess(user: CuratorUser): boolean {\n const allowedGroups = [\n CuratorGroup.Developer,\n CuratorGroup.Content,\n CuratorGroup.Curator,\n CuratorGroup.StreamableCurator\n ];\n\n return allowedGroups.some(group => getGroupNames(user).includes(group));\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, ClickDescriptor, EmailDescriptor, EntityType, LocationContext, OperationDescriptor, ToggleDescriptor, UserAction, VerifyEmailDescriptor, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { SsoPasswordResetEmailNotAllowedError } from 'libs/shared/apps/user-manager/errors/sso-password-reset-email-not-allowed/SsoPasswordResetEmailNotAllowedError';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkRemoveUsersViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkRemoveUsersViewModel';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CuratorUser, CurrentUser, User } from 'libs/shared/interfaces';\nimport { CuratorPermissionsHelper } from 'libs/shared/utils/CuratorPermissionsHelper';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.userList');\n\nfunction useGetActions(props: UserItemActionsProps): ActionOptions[] {\n const client = React.useContext(UserManagerClientContext);\n\n const hasStatus = (status: ObjectStatus) => status === props.user.status;\n\n const hasVerifiedEmail = props.user.metadata?.isEmailVerified;\n\n // eslint-disable-next-line\n const isCurrentUser = props.user.id == props.currentUser?.id;\n\n const [ , setBulkRemoveUsers ] = useViewModel<BulkRemoveUsersViewModel>(SharedViewModelKeys.BULK_REMOVE_USERS);\n\n function logAnalytics(actionOptions: AnalyticsOptions): void {\n AnalyticsHelper.logUserAction({ id: props.user.id }, AnalyticsHelper.mergeOptions({\n entity: EntityType.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext[props.userType === UserGroup.Learner ? 'StaffManagerListItem' : 'StudentManagerListItem']\n }, actionOptions));\n }\n\n const actions: ActionOptions[] = [];\n \n if (!props.isEditUserForm) {\n function getTooltip(): string {\n if (props.hasRostering)\n return getPhrase('editControlledByRostering');\n\n if (hasStatus(ObjectStatus.Disabled))\n return getPhrase('editUserDisabled');\n\n if (hasStatus(ObjectStatus.Inactive) && client !== UserManagerClient.Curator)\n return getPhrase('editUserPending');\n\n return getPhrase('editUser');\n }\n\n function canEdit(): boolean {\n if (props.hasRostering)\n return false;\n\n if (hasStatus(ObjectStatus.Active))\n return true;\n\n if (hasStatus(ObjectStatus.Inactive) && client === UserManagerClient.Curator)\n return true;\n\n return false;\n }\n\n actions.push({\n order: 0,\n onClick: () => {\n if (!canEdit())\n return;\n \n logAnalytics({ actionType: UserAction.Edit });\n \n const appLink = {\n ...props.appLinks.editUser,\n args: [ ...(props.appLinks.editUser.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n },\n svgName: cvSvgLibrary.Edit,\n className: `btn btn-link svg-container ${!canEdit() ? 'disabled' : ''}`,\n tooltip: getTooltip(),\n button: true\n });\n }\n\n if (props.user.email && hasStatus(ObjectStatus.Inactive) && props.onClickResendActivationEmail) {\n actions.push({\n order: 5,\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n label: getPhrase('resendActivationEmail'),\n onClick: () => {\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ActivateUser\n });\n props.onClickResendActivationEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (\n props.user.email &&\n hasStatus(ObjectStatus.Active) &&\n !hasVerifiedEmail\n ) {\n actions.push({\n order: 5,\n label: getPhrase('sendVerificationEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n onClick: () => {\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.VerifyEmail\n });\n props.onClickSendVerificationEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (!isCurrentUser) {\n if (hasVerifiedEmail && hasStatus(ObjectStatus.Active) && props.onClickSendResetEmail) {\n actions.push({\n order: 5,\n label: getPhrase('sendResetEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n onClick: () => {\n if (UserHelper.hasSso(props.user)) {\n DialogHelper.render(\n <SsoPasswordResetEmailNotAllowedError helpArticle={props.ssoHelpArticle} />,\n {\n title: getPhrase('sendResetEmail'),\n cancelButtonProps: {\n text: getPhrase('close'),\n variant: 'dark'\n }\n }\n );\n return;\n }\n\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ResetPasswordEmail\n });\n props.onClickSendResetEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (!hasStatus(ObjectStatus.Inactive)) {\n actions.push({\n order: 10,\n label: getPhrase(hasStatus(ObjectStatus.Active) ? 'deactivate' : 'activate'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({\n actionType: UserAction.Activate,\n descriptor: hasStatus(ObjectStatus.Active) ? ToggleDescriptor.Off : ToggleDescriptor.On\n });\n \n const appLink = {\n ...props.appLinks.toggleStatus,\n args: [ ...(props.appLinks.toggleStatus.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n }\n });\n }\n\n const showDelete = client !== UserManagerClient.Primary || props.products?.includes(ProductId.Online);\n if (showDelete) {\n actions.push({\n order: 25,\n disabled: props.hasRostering,\n onClick: () => {\n if (hasStatus(ObjectStatus.Active))\n return;\n \n logAnalytics({ actionType: UserAction.Delete, descriptor: OperationDescriptor.Single });\n \n setBulkRemoveUsers({ users: [props.user], totalUsers: 1 });\n \n Core.AppLinkHelper.trigger(props.appLinks.deleteUser);\n },\n label: getPhrase('delete'),\n className: `btn btn-link text-danger ${hasStatus(ObjectStatus.Active) || props.hasRostering ? 'cursor-default disabled' : ''}`,\n button: false,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : hasStatus(ObjectStatus.Active) ? getPhrase('deleteDisabledTooltip') : null\n });\n }\n\n const showRemove = client !== UserManagerClient.Online && !props.products?.includes(ProductId.Online);\n if (showRemove) {\n actions.push({\n order: 25,\n disabled: props.hasRostering,\n onClick: () => {\n if (hasStatus(ObjectStatus.Active))\n return;\n \n logAnalytics({ actionType: UserAction.Remove, descriptor: OperationDescriptor.Single });\n \n const appLink = {\n ...props.appLinks.removeUser,\n args: [ ...(props.appLinks.editUser.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n },\n label: getPhrase('remove'),\n className: `btn btn-link text-danger ${hasStatus(ObjectStatus.Active) || props.hasRostering ? 'cursor-default disabled' : ''}`,\n button: false,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : hasStatus(ObjectStatus.Active) ? getPhrase('removeDisabledTooltip') : null\n });\n }\n }\n\n if (client === UserManagerClient.Online && props.userType === UserGroup.Learner && hasStatus(ObjectStatus.Active)) {\n actions.push({\n order: 15,\n label: getPhrase('viewWorkspace'),\n onClick: () => logAnalytics({ actionType: UserAction.Click, descriptor: ClickDescriptor.ViewStudentWorkspace }),\n appLink: {\n ...props.appLinks.viewStudentWorkspace,\n params: { username: props.user.username }\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link',\n button: false\n });\n }\n\n if (\n client === UserManagerClient.Primary &&\n props.userType === UserGroup.Learner &&\n !hasStatus(ObjectStatus.Inactive)\n ) {\n actions.push({\n order: 15,\n label: getPhrase('viewStudentsVideos'),\n onClick: () => logAnalytics({ actionType: UserAction.Click, descriptor: ClickDescriptor.ViewStudentWorkspace }),\n appLink: {\n ...props.appLinks.viewStudentWorkspace,\n args: [props.user.id]\n },\n className: 'btn btn-link',\n button: false\n });\n }\n\n if (\n hasStatus(ObjectStatus.Active) &&\n (\n (props.userType === UserGroup.Staff && !hasVerifiedEmail) ||\n props.userType === UserGroup.Learner\n )\n ) {\n actions.push({\n order: 20,\n disabled: props.hasRostering,\n label: getPhrase('changePassword'),\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.ChangePassword });\n\n const appLink = {\n ...props.appLinks.changePassword,\n args: [ ...(props.appLinks.changePassword.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n }\n });\n }\n\n if (client === UserManagerClient.Curator\n && CuratorPermissionsHelper.isDev(props.currentUser as unknown as CuratorUser)) {\n actions.push(...[\n {\n order: 2,\n label: getPhrase('manageCuratorGroups'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.ManageGroup });\n\n Core.AppLinkHelper.trigger({\n ...props.appLinks.manageUserCuratorGroups,\n args: [props.user.id]\n });\n }\n },\n {\n order: 3,\n label: getPhrase('editUserOptions'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n appLink: {\n ...props.appLinks.editUserOptions,\n args: [ ...(props.appLinks.editUserOptions.args ?? []), props.user.id ]\n }\n }\n ]);\n }\n\n if (client === UserManagerClient.Curator && props.hasUserCredit) {\n actions.push({\n order: 4,\n label: getPhrase('editUserCredits'),\n appLink: {\n ...props.appLinks.userCredit,\n args: [ ...(props.appLinks.userCredit.args ?? []), props.user.id ]\n }\n });\n }\n\n if (\n client === UserManagerClient.Curator &&\n props.user.metadata?.isEmailVerified &&\n !hasStatus(ObjectStatus.Inactive)\n ) {\n actions.push({\n order: 5,\n label: getPhrase('unverifyEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.VerifyEmail, descriptor: VerifyEmailDescriptor.Remove });\n\n Core.AppLinkHelper.trigger({\n ...props.appLinks.deleteUserEmail,\n args: [ ...(props.appLinks.deleteUserEmail.args ?? []), props.user.id ]\n });\n }\n });\n }\n\n if (client === UserManagerClient.Curator && props.isEditUserForm) {\n actions.push({\n order: 6,\n label: getPhrase('addToAnotherCustomer'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n appLink: {\n ...props.appLinks.addToAnotherCustomer,\n args: [ ...(props.appLinks.addToAnotherCustomer.args ?? []), props.user.id ]\n }\n });\n }\n\n return actions;\n}\n\ninterface UserItemActionsProps {\n user: User;\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n currentUser: CurrentUser;\n products?: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n isEditUserForm?: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n hasUserCredit?: boolean;\n}\n\nexport function UserItemActions(props: UserItemActionsProps): JSX.Element {\n const actions = useGetActions(props);\n\n return (\n <Actions\n actions={actions}\n className={props.isEditUserForm ? 'mb-2' : 'pe-4'}\n actionsDropdownClassName={props.isEditUserForm ? 'btn btn-outline-dark' : 'btn btn-link ms-1'}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialLoading\":\"mXgLg\"};","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './user-manager-entries.scss';\n\nconst namespace = 'userManager.userManagerEntries';\n\ninterface UserManagerEntriesProps {\n totalShowing: number;\n totalUsers: number;\n}\n\nexport function UserManagerEntries(props: UserManagerEntriesProps): JSX.Element {\n return (\n <p className='mb-0 fw-semibold'>\n <Text\n namespace={namespace}\n phrase='users'\n options={{\n totalShowing: props.totalShowing ?? 0,\n totalUsers: props.totalUsers ?? 0,\n smartCount: props.totalUsers ?? 0\n }}\n />\n </p>\n );\n}\n\nexport function PartialUserManagerEntries(): JSX.Element {\n return <div className={`partial-loading-background ${styles.partialLoading} d-inline-block`} />;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PartialUserManagerEntries, UserManagerEntries } from 'libs/shared/apps/user-manager/components/user-manager-entries/UserManagerEntries';\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.userManagerHeader';\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.studentManagerHeader',\n [UserGroup.Staff]: 'userManager.staffManagerHeader',\n [UserGroup.Unknown]: ''\n};\n\ninterface UserManagerHeaderProps {\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n users: User[];\n userCount: GetUserCountResponse;\n hasSso?: boolean;\n hasRostering?: boolean;\n /**\n * Allows curator to specify a different heading component\n */\n headingComponent?: JSX.Element\n}\n\nexport function UserManagerHeader(props: UserManagerHeaderProps): JSX.Element {\n const subNamespace = subNamespaces[props.userType];\n\n const hasNumbers = props.users && typeof (props.userCount?.count) === 'number';\n const totalShowing = hasNumbers && props.users.length;\n\n return (\n <>\n <div className='d-flex justify-content-between'>\n {props.headingComponent ?\n <>{props.headingComponent}</> :\n <span>\n <h1 className='h2'><Text namespace={subNamespace} phrase='heading' /></h1>\n\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n { name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'), appLink: props.appLinks.settings },\n { name: LanguageService.getPhrase(subNamespace, 'managerBreadcrumb'), active: true }\n ]}\n />\n </div>\n </span>\n }\n <span>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n placement='left'\n >\n <IconButton\n className='btn btn-outline-dark'\n svgName={cvSvgLibrary.Plus}\n appLink={!props.hasSso ? props.appLinks.addNewUsers : props.appLinks.ssoAddUserConfirm}\n disabled={props.hasRostering}\n >\n <Text namespace={subNamespace} phrase='addNew' />\n </IconButton>\n </Tooltip>\n <div className='text-end mt-1'>\n {hasNumbers ? (\n <UserManagerEntries\n totalShowing={totalShowing}\n totalUsers={props.userCount.count}\n />\n ) : <PartialUserManagerEntries />}\n </div>\n </span>\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"eCi4v\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './warning-alert.scss';\n\ninterface Props extends HashObject {\n className?: string;\n}\n\ntype WarningAlertProps = React.PropsWithChildren<Props>;\n\nexport function WarningAlert(props: WarningAlertProps): JSX.Element {\n return (\n <div className={`alert alert-warning d-flex align-items-center px-2 mb-3 ${props.className || ''}`}>\n <SvgContainer\n svgName={cvSvgLibrary.WarningOutline}\n className={`svg-container me-2 ${styles.icon}`}\n />\n <div>\n {props.children}\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nconst lang = 'userManager.cannotYearGroupRolloverError';\n\nexport class CannotYearGroupRolloverError extends DialogError {\n private previousRolloverDate: string;\n\n constructor(previousRolloverDate: string) {\n super('CannotYearGroupRolloverError');\n\n const localDate = DateHelper.convertUTCToLocal(previousRolloverDate);\n this.previousRolloverDate = DateHelper.format(localDate, 'MMMM Do YYYY');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'CannotYearGroupRolloverError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'text', {\n previousRolloverDate: this.previousRolloverDate,\n supportUrl: ArticleHelper.getSupportRequestUrl(),\n linkClass: 'info-link'\n }),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}","import { Flight } from 'libs/common/flight';\n\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface Options {\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n getUserCountRequest: (\n customerId: string,\n userId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n ) => Flight.Request\n}\n\nexport const useFetchUserCount = (options: Options) => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const userCount = Flight.useBasicFetch<GetUserCountResponse>(\n currentUser.data &&\n options.getUserCountRequest(currentUser.data.customerId, currentUser.data.id, options.userType, options.queryParams)\n );\n\n return userCount;\n};","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text}&nbsp;\n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows(): JSX.Element[] {\n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","export enum BatchJobStatus {\n Submitted = 0,\n Queued = 1,\n Pending = 2,\n InProgress = 3,\n Completed = 4,\n CompletedWithError = 5,\n Failed = 6\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { BatchJob, ScheduleSettingRequest } from 'libs/shared/interfaces';\nimport { CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const RosteringRequests = {\n getRostering(): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/rostering`,\n key: `rostering`\n };\n },\n\n getSyncList(queryParams: BulkJobsQueryParams): Flight.Request {\n const params: HashObject = {};\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.jobStatus) {\n const statuses = [];\n if (queryParams.jobStatus.includes('completed')) {\n statuses.push(...[ BatchJobStatus.Completed, BatchJobStatus.CompletedWithError ]);\n }\n if (queryParams.jobStatus.includes('failed')) {\n statuses.push(BatchJobStatus.Failed);\n }\n if (queryParams.jobStatus.includes('inProgress')) {\n statuses.push(...[\n BatchJobStatus.Submitted,\n BatchJobStatus.Queued,\n BatchJobStatus.Pending,\n BatchJobStatus.InProgress ]);\n }\n params.status = statuses;\n }\n\n params.type = BatchJobType.Rostering;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `rostering:sync:${queryParams.cursor}:${queryParams.sort}:${queryParams.jobStatus}`\n };\n },\n\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'rostering:sync',\n type: HttpVerbs.POST,\n invalidationKeys: ['rostering:sync'],\n data,\n success,\n error\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n },\n\n getSyncScheduleSettings(integrationId: string): Flight.SimulatedRequest {\n return {\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `sync-settings:${integrationId}`\n };\n },\n\n updateScheduleSetting(\n data: ScheduleSettingRequest,\n integrationId: string,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n type: HttpVerbs.PUT,\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `update:sync-settings:${data.customerId}:${integrationId}`,\n invalidationKeys: [`sync-settings:${integrationId}`],\n data,\n success,\n error,\n always\n };\n }\n};","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","export const SelectWithSpreadsheetTemplates = '/templates/Template_Select_With_Spreadsheet.csv';\n","import { Flight } from 'libs/common/flight';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\ntype Response = UserCollection | SearchResults<User>;\n\nexport function useFetchUsers(\n currentUser: CurrentUser,\n queryParams: UserManagerQueryParams,\n userType: UserGroup\n): Flight.Response<Response> {\n function getFetchRequest(): Flight.Request {\n if (!currentUser)\n return null;\n const queryParamsKeys = Object.keys(queryParams);\n\n const onlyPagination = queryParamsKeys.length === 1 && !!queryParams.cursor\n || queryParamsKeys.length === 2 && queryParamsKeys.includes('cursor') && queryParamsKeys.includes('previous');\n\n const onlyHasSort = queryParamsKeys.length === 1 && !!queryParams.sort;\n\n // If we have a search query or filter, we want to use it to limit our search. If not, we want to search all students.\n if (Object.keys(queryParams).length && !onlyPagination && !onlyHasSort)\n return UserManagerRequests.searchUsers(\n currentUser.customerId,\n currentUser.id,\n userType,\n queryParams,\n queryParams?.cursor\n );\n\n return UserManagerRequests.getUsers(currentUser.customerId, userType, queryParams, queryParams?.cursor);\n }\n\n return Flight.useBasicFetch<Response>(getFetchRequest());\n}"],"names":["ScopedSearchBar","props","currentQueryParams","ContextService","appLink","params","queryParamName","searchQuery","setSearchQuery","trim","length","id","debouncedQuery","debounceTime","query","currentFilters","ObjectHelper","nextParams","trimLeft","cursor","ScrollHelper","analyticsOptions","AnalyticsHelper","indices","searchIndices","actionType","workflowPhase","searchAppLink","search","log","shouldLog","className","name","type","size","autoComplete","placeholder","onChange","event","target","value","onBlur","e","SvgContainer","svgName","defaultProps","PartialSearchFilters","count","Array","fill","map","item","index","key","namespace","UserManagerSearchEmptyState","EmptyState","src","imageUrl","Text","phrase","PartialUserItem","PartialUserList","BulkSelectionSummary","selectAllSpinner","setSelectAllSpinner","selectedCount","showSelectingSpinner","showSelectAll","onClickSelectAll","allSelected","selectAllCount","UserManagerConstants","Spinner","as","animation","role","options","smartCount","getTypeText","undefined","DivButton","onClick","onClickDeselectAll","Tooltip","spanHack","title","hasRostering","LanguageService","onClickSelectBulk","disabled","JobTitle","jobTitle","user","userProfile","metadata","LastActive","date","status","ObjectStatus","DateHelper","isDateValid","lastSignedIn","includes","Number","isNaN","substr","toUpperCase","getLastActiveDate","lastSignInTime","isCurrentUser","toString","currentUser","UserAuthenticationMethods","sortedAuthMethods","authenticationMethods","sort","method","local","hasSSO","find","am","authMethod","i","backgroundColor","backgroundColour","displayName","style","zIndex","backgroundImage","logoUrl","TABLE_THEME","table","row","cell","ManageUsersTable","users","isChecked","client","UserManagerClientContext","data","checked","columns","onToggleCheckbox","imageCdnUrl","appLinks","products","onClickResendActivationEmail","onClickSendResetEmail","onClickSendVerificationEmail","shouldDisplayAuthenticationMethods","ssoHelpArticle","accessor","Cell","Checkbox","width","UserItemAvatar","IconCircle","variant","svgSize","S","svgWrapperClassName","BasicUserDetails","RoleOrYearGroup","userType","UserManagerClient","push","UserItemActions","getColumns","Table","theme","namespaces","UserGroup","SelectWithSpreadsheet","download","href","templateLink","cellPadding","BulkUploadFileSelect","onSelectSpreadsheet","BulkUserUploadHelper","onClickCancel","clone","headings","shift","isValid","errorMessage","InvalidSpreadsheetError","requests","SelectWithSpreadsheetPopup","CheckboxHelper","checkboxHelper","fetchAsync","ids","dataLoaded","Popup","closePopup","showLoadingSpinner","dialogClassName","queries","spreadsheetRowCount","setShowSelectingSpinner","q","userRequest","Promise","all","then","res","forEach","r","concat","selectAll","totalUsersFound","entity","descriptor","location","template","useManageUsersCheckboxHelper","useBulkCheckboxManager","bulkSelections","setBulkSelections","getSelectionKey","queryParams","Object","keys","param","isArray","join","userIds","setSelected","onToggleItem","onToggleBulk","bulkChecked","reset","subNamespaces","ManageUsers","analyticsLocation","subNamespace","locationContext","SharedViewModelKeys","viewModel","setBulkActionViewModel","isSelectingWithSpreadsheet","setIsSelectingWithSpreadsheet","showSpinner","setShowSpinner","persistNamespace","initialState","userIdMap","extraActions","setWizardViewModel","actions","label","exportUserList","analyticsData","auditLog","LocalStorageHelper","onSelectWithSpreadsheetSelect","yearGroupRolloverStatus","yearGroups","canRollover","bulkActionsActionDetails","yearGroupRollover","tooltip","action","subAction","BulkUserActionsAnalyticsHelper","error","CannotYearGroupRolloverError","previousRolloverDate","useGetActions","clearOnExit","unsetAllUsersSelected","current","totalUsers","getSelectedCount","mainFilters","UserManagerHelper","showFiltersPartialLoading","RosteringAlert","indeterminate","hasSomeSelections","SearchFilters","userManager","hideHeading","hideDivider","constantIndices","searchInputSize","ActionsDropdown","dropdownToggleClassName","success","userCount","fetchUserIds","allUsersSelected","BulkUserActionsHelper","getMap","bulkActionsReviewAccounts","config","hasSso","searchEmptyState","selectWithSpreadsheetTemplate","SsoPasswordResetEmailNotAllowedError","WarningAlert","W","helpArticle","getGroupNames","groups","g","CuratorPermissionsHelper","isDev","CuratorGroup","hasSubjectsAccess","Curator","some","group","getPhrase","hasStatus","hasVerifiedEmail","isEmailVerified","setBulkRemoveUsers","logAnalytics","actionOptions","isEditUserForm","canEdit","order","editUser","args","button","email","UserHelper","DialogHelper","cancelButtonProps","text","toggleStatus","ProductId","deleteUser","removeUser","viewStudentWorkspace","username","changePassword","manageUserCuratorGroups","editUserOptions","hasUserCredit","userCredit","deleteUserEmail","addToAnotherCustomer","Actions","actionsDropdownClassName","UserManagerEntries","totalShowing","PartialUserManagerEntries","UserManagerHeader","hasNumbers","headingComponent","Breadcrumbs","breadcrumbs","settings","active","placement","IconButton","ssoAddUserConfirm","addNewUsers","children","lang","localDate","this","supportUrl","linkClass","buttons","useFetchUserCount","getUserCountRequest","customerId","BaseBulkUserActionsViewModelKeys","getAnalyticsActionName","onClickNext","currentStep","step","actionName","actionData","logYearGroupRolloverEntry","getJobStatus","BatchJobStatus","DragOverlayStyles","opacity","calculateScrollState","ref","canScrollLeft","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","column","canSort","isSorted","sortIndicator","isSortedDesc","BaseTable","idHash","tableOptions","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","AppLink","renderCells","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","onSortEnd","onSortingRowsEnd","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","hide","scrollContainerClassName","PartialTagItem","tagClass","classNames","TagWidgetItem","colorClass","selectedItems","selection","tag","OnlineSupportArticle","LiteSupportArticle","RosteringRequests","getRostering","url","getSyncList","jobStatus","statuses","createJob","invalidationKeys","getJobSummary","getSyncScheduleSettings","integrationId","updateScheduleSetting","always","generateCacheKey","flightObjs","obj","statusCode","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","useEffect","collection","idField","initial","Map","items","forceUpdate","prevCollection","prevNamespace","clear","get","isBulkChecked","every","set","preselectedIds","setValue","nextItemState","getSelected","from","deselectAll","SelectWithSpreadsheetTemplates","useFetchUsers","queryParamsKeys","onlyPagination","onlyHasSort","getFetchRequest"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[119],{39157:(e,t,r)=>{r.d(t,{HI:()=>m,R6:()=>s,Rt:()=>v,UU:()=>d,Zs:()=>u,nq:()=>f});var n=r(75896),a=r(94892),i=r(28972),o=r(8246),l=r(83140),c=r(80845);function s(e,t,r){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},o=(0,c.Q)(e),l=new Set(o.map((function(e){return e.id})));t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:v(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):n.m.last(t.results).attempts.filter((function(e){var t;return!!l.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length===l.size?(i.completed.push(o),o.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)}));var s=n.m.sortBy(i.lowScore,(function(e){return e.summary.percentCorrect})),u=n.m.sortBy(i.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},i),{lowScore:s,highScore:u})}function u(e,t){return(0,c.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===o.N.Correct})))?o.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===o.N.Incorrect})))?o.N.Incorrect:void 0}function f(e,t){var r=t.students.length,n=0,a=0,o=0,s=0,u=0;return t.students.forEach((function(t){var r=(0,c.j_)(t);if(r){u+=t.results.length;var d=l.A.isInteractionCorrect(e,r);d===i.w.Correct&&n++,d===i.w.UnAnswered&&o++,d===i.w.AwaitingMarking&&s++,d!==i.w.UnAnswered&&a++}})),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:o,awaitingMarking:s,attempts:u}}function v(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,o=0,s=0;n.forEach((function(e){var t=l.A.isInteractionCorrect(e,r);t===i.w.Correct&&o++,t===i.w.AwaitingMarking&&s++}));var u=a>0?o/a:0,d=new Set(n.map((function(e){return e.id}))),m=r.attempts.filter((function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:o,awaitingMarking:s}}},6748:(e,t,r)=>{r.d(t,{i:()=>I});var n=r(32735),a=r(42648),i=r(35509),o=r(91967),l=r(15611),c=r(17808),s=r(1287),u=r(83914),d=r(90281),m={opacity:"0.8",cursor:"grabbing"},f=r(35223);function v(e){return function(e){if(Array.isArray(e))return p(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||g(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function g(e,t){if(e){if("string"==typeof e)return p(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?p(e,t):void 0}}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function h(e){var t,r,n,a;return{canScrollLeft:(null===(t=e.current)||void 0===t?void 0:t.scrollLeft)>0,canScrollRight:(null===(r=e.current)||void 0===r?void 0:r.scrollLeft)+1<(null===(n=e.current)||void 0===n?void 0:n.scrollWidth)-(null===(a=e.current)||void 0===a?void 0:a.clientWidth)}}const b={sortIndicator:"gFhu0",scrollContainer:"sWUp9",scrollbarTrack:"Vn2qM"};function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var w=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(n=Object.getOwnPropertySymbols(e);a<n.length;a++)t.indexOf(n[a])<0&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(r[n[a]]=e[n[a]])}return r};function S(e){var t,r;return e.column.canSort?n.createElement("span",{className:"".concat(b.sortIndicator,"\n ").concat(e.column.isSorted?"":"text-secondary","\n ").concat(null!==(r=null===(t=e.theme)||void 0===t?void 0:t.sortIndicator)&&void 0!==r?r:"")},n.createElement(u.x,{svgName:e.column.isSortedDesc||!e.column.isSorted?f.vn.ArrowRight:f.vn.ArrowLeft,size:u.S.Small})):n.createElement(n.Fragment,null)}function E(e){var t,r,a,u,d,f,g,p,h={columns:e.columns,data:e.data,disableSortBy:!e.enableSort,manualSortBy:e.manualSort,autoResetHiddenColumns:e.autoResetHiddenColumns,autoResetSortBy:e.autoResetSortBy,initialState:{sortBy:e.initialSortBy||[]}};e.initialSelectedRowIds&&(h.initialState={selectedRowIds:(g=e.initialSelectedRowIds,p={},g.forEach((function(e){return p[e]=!0})),p)}),e.getRowId&&(h.getRowId=e.getRowId);var b,w=i.useTable.apply(void 0,[h].concat((b=function(e){var t=[i.useSortBy,i.useRowSelect,"flex"===e.layout?i.useFlexLayout:i.useBlockLayout];return e.allowFiltering&&(t=[].concat(v(t),[i.useFilters])),e.allowGlobalFiltering&&(t=[].concat(v(t),[i.useGlobalFilter])),t}(Object.assign({},e)),function(e){if(Array.isArray(e))return y(e)}(b)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(b)||function(e,t){if(e){if("string"==typeof e)return y(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?y(e,t):void 0}}(b)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))),E=w.getTableProps,I=w.getTableBodyProps,C=w.headerGroups,R=w.rows,k=w.prepareRow,A=w.toggleAllRowsSelected,N=w.setGlobalFilter,O=w.setHiddenColumns,j=w.state.sortBy;function M(){return R.map((function(t){k(t);var r=function(t){var r,n,a,i,l,c=o.q.isFunction(null===(r=e.theme)||void 0===r?void 0:r.row)?e.theme.row(t):null!==(a=null===(n=e.theme)||void 0===n?void 0:n.row)&&void 0!==a?a:"";return t.isSelected&&(null===(i=e.theme)||void 0===i?void 0:i.selectedRow)&&(c+=" ".concat(null===(l=e.theme)||void 0===l?void 0:l.selectedRow)),e.onSelectRow&&(c+=" cursor-pointer"),e.enableSortableRows&&(c+=" cursor-grab"),c}(t),a=!!e.getRowAppLink&&e.getRowAppLink(t);function i(){e.onSelectRow&&(e.allowSelectMultipleRows||A(!1),e.onSelectRow(t),t.toggleRowSelected(!0))}function c(e,o){var c=function(e,t){return"dragAttributes"in e&&"dragListeners"in e?Object.assign(Object.assign(Object.assign({},e.dragAttributes),e.dragListeners),{"aria-roledescription":"Sortable row",ref:t}):{}}(e,o);return a?n.createElement("div",{role:"row",key:t.id},n.createElement(l.F,Object.assign({},e,c,{className:r,appLink:a}),U(t))):n.createElement("div",Object.assign({},e,c,{key:t.id,role:"row",className:r,onClick:i}),U(t))}var u=t.getRowProps();return e.enableSortableRows?n.createElement(s.W,{id:t.original.id,key:t.id,childProps:u,childComponent:n.forwardRef((function(e,t){return c(e,t)}))}):c(u)}))}function U(t){return t.cells.map((function(r){var a=function(t,r){var n,a,i="";return"function"==typeof(null===(n=e.theme)||void 0===n?void 0:n.cell)&&(i=e.theme.cell(t,r)),"string"==typeof(null===(a=e.theme)||void 0===a?void 0:a.cell)&&(i=e.theme.cell),e.onSelectCell&&(i+=" cursor-pointer"),i}(t,r);return n.createElement("div",Object.assign({key:r.column.id},r.getCellProps(),{className:a,onClick:function(){e.onSelectCell&&e.onSelectCell(r)}}),r.render("Cell"))}))}return n.useEffect((function(){e.onSort&&e.onSort(j)}),[j]),n.useEffect((function(){e.globalFilter&&N(e.globalFilter)}),[e.globalFilter]),n.useEffect((function(){e.hiddenColumns&&O(e.hiddenColumns)}),[e.hiddenColumns&&e.hiddenColumns.length]),n.createElement("div",Object.assign({},E(),{className:null!==(r=null===(t=e.theme)||void 0===t?void 0:t.table)&&void 0!==r?r:""}),n.createElement("div",{className:null!==(u=null===(a=e.theme)||void 0===a?void 0:a.header)&&void 0!==u?u:""},C.map((function(t){var r,a;return n.createElement("div",Object.assign({},t.getHeaderGroupProps(),{className:null!==(a=null===(r=e.theme)||void 0===r?void 0:r.headerRow)&&void 0!==a?a:""}),t.headers.map((function(t){var r,a;return n.createElement("div",Object.assign({},t.getHeaderProps(t.getSortByToggleProps()),{className:null!==(a=null===(r=e.theme)||void 0===r?void 0:r.headerCell)&&void 0!==a?a:""}),t.render("Header",{renderSortIndicator:function(){return n.createElement(S,{column:t,theme:e.theme})}}),!t.hideSortIndicator&&n.createElement(S,{column:t,theme:e.theme}))})))}))),n.createElement("div",Object.assign({},I(),{className:null!==(f=null===(d=e.theme)||void 0===d?void 0:d.body)&&void 0!==f?f:""}),e.enableSortableRows?n.createElement(c.Q,{ids:R.map((function(e){return e.original.id})),getDragOverlay:function(t){var r,a,i=R.findIndex((function(e){return e.original.id===t})),o=R[i];return n.createElement("div",Object.assign({},e,{className:(r=e.theme,a="g-0 ",r&&(a+=r.row),a),style:m}),U(o))},onSortEnd:e.onSortingRowsEnd},M()):M()))}function I(e){var t=e.enableSlider,r=e.scrollIncrement,i=e.scrollable,l=w(e,["enableSlider","scrollIncrement","scrollable"]),c=function(){var e,t,r=n.useRef(null),a=(e=n.useState(h(r)),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(e,t)||g(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i=a[0],l=a[1],c=o.q.throttle((function(){l(h(r))}),200),s=n.useCallback((function(e){var t;r.current&&(null===(t=r.current)||void 0===t||t.removeEventListener("scroll",c)),e&&(l(h(r)),e.addEventListener("scroll",c)),r.current=e}),[]);return n.useEffect((function(){(null==r?void 0:r.current)&&l(h(r))}),[r]),{ref:s,scrollState:i,scroll:function(e){var t;null===(t=r.current)||void 0===t||t.scrollBy({left:e,top:0,behavior:"smooth"})}}}(),s=c.ref,u=c.scrollState,m=c.scroll;if(i)return n.createElement(a.$B,{renderTrackHorizontal:function(){return n.createElement("div",{className:b.scrollbarTrack})},autoHeightMax:1e4,autoHeight:!0},n.createElement(E,Object.assign({},l)));if(!t)return n.createElement(E,Object.assign({},l));function f(e){m(r*("right"===e?1:-1))}return n.createElement("div",{className:"mx-n4 overflow-x-hidden overflow-y-hidden"},n.createElement("div",{className:"px-4"},n.createElement("div",{className:"position-relative"},n.createElement(d.W,{direction:d.f.Left,onClick:function(){return f("left")},hide:!u.canScrollLeft}),n.createElement("div",{className:"".concat(b.scrollContainer," ").concat(e.scrollContainerClassName),ref:s},n.createElement(E,Object.assign({},l))),n.createElement(d.W,{direction:d.f.Right,onClick:function(){return f("right")},hide:!u.canScrollRight}))))}I.defaultProps={scrollIncrement:250,scrollable:!1,layout:"flex"}},28972:(e,t,r)=>{var n;r.d(t,{w:()=>n}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(n||(n={}))},8246:(e,t,r)=>{var n;r.d(t,{N:()=>n}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(n||(n={}))},54405:(e,t,r)=>{r.d(t,{X:()=>n});var n={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},83140:(e,t,r)=>{r.d(t,{A:()=>g});var n=r(28972),a=r(8246),i=r(38129);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function l(e,t,r){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(){return n.w.NotApplicable}function s(e,t){var r=e.actionableItems.filter((function(e){return e.isCorrect}));return r.every((function(e){return!t(e.id)}))?n.w.UnAnswered:r.every((function(e){var r;return e.name.trim().toLowerCase()===(null===(r=t(e.id))||void 0===r?void 0:r.trim().toLowerCase())}))?n.w.Correct:n.w.Incorrect}function u(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?n.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var r,n=t(e.id);return(null==n?void 0:n.toString())===(null===(r=e.id)||void 0===r?void 0:r.toString())||n===e.name}))?n.w.Correct:n.w.Incorrect}function d(e,t){return function(r){var n=null==t?void 0:t.attempts.find((function(t){return t.id===e.id}));return null==n?void 0:n.answers.find((function(e){return e.id===r}))}}function m(e,t){var r=d(e,t);return u(e,(function(e){var t=r(e);return null==t?void 0:t.text}))}function f(e,t){return function(e,t){var r;return e.actionableItems.forEach((function(e){var i=t(e.id);r=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?n.w.AwaitingMarking:n.w.Incorrect:n.w.Correct:n.w.UnAnswered})),r}(e,d(e,t))}var v=l(l(l(l(l(l(l({},i.Z9.Annotation,c),i.Z9.Image,c),i.Z9.MissingWord,(function(e,t){var r=d(e,t);return s(e,(function(e){var t=r(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,f),i.Z9.TrueOrFalse,m),i.Z9.Illustration,f),g={notApplicable:c,awaitingMarking:function(){return n.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,v[e.typeId])(e,t)}}},78057:(e,t,r)=>{r.d(t,{R:()=>C});var n=r(32735),a=r(75896),i=r(23481),o=r(97958),l=i.T.encloseNamespace("shared.studentResultsTable");function c(e){return"not_completed"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.notCompletedImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("notCompletedDescription"))):"marking_required"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.markingRequiredImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("markingRequiredDescription"))):"helping_hand"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.helpingHandImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("helpingHandDescription"))):n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.emptyStateImageUrl,size:"small"}),n.createElement(o.u.Heading,null,l("emptyStateHeading")),n.createElement(o.u.Info,null,l("emptyStateDescription")))}var s=r(83345),u="shared.studentResultsTable";function d(e){function t(t){var r=e.filter===t?null:t;e.setFilter(r)}function r(t){return"btn btn-outline-dark ".concat(function(t){return e.filter===t}(t)?"bg-dark text-white":"")}return n.createElement("div",{className:"d-flex align-items-center mb-3"},n.createElement("p",{className:"h6 mb-0"},n.createElement(s.x,{namespace:u,phrase:"filters"})),n.createElement("div",{className:"d-flex border-start ps-3 ms-3 gap-2"},n.createElement("button",{className:r("not_completed"),onClick:function(){return t("not_completed")}},n.createElement(s.x,{namespace:u,phrase:"notCompletedFilter"})),n.createElement("button",{className:r("marking_required"),onClick:function(){return t("marking_required")}},n.createElement(s.x,{namespace:u,phrase:"markingRequiredFilter"})),n.createElement("button",{className:r("helping_hand"),onClick:function(){return t("helping_hand")}},n.createElement(s.x,{namespace:u,phrase:"helpingHandFilter"}))))}var m=r(97364),f=r(6748),v=r(84806),g=r(19912);function p(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return h(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?h(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var b={table:"".concat(g.Z.fixedTable," bg-white rounded-start border border-end-0"),header:"".concat(g.Z.header," border-bottom"),headerRow:"h-100",headerCell:"d-flex align-items-center justify-content-start",row:g.Z.row},y={header:"".concat(g.Z.header," fw-bold"),headerRow:"h-100",headerCell:"".concat(g.Z.interactionHeaderCellOuter," bg-white border-bottom"),row:"".concat(g.Z.row," ").concat(g.Z.resultsRow),cell:g.Z.resultsCellOuter};function w(e){var t,r=p(n.useState((0,m.P)(e.sortBy,"score")),2),i=r[0],o=r[1],l=p(n.useState(e.filterBy),2),s=l[0],u=l[1],h=n.useRef(null),w=(0,v.R7)(e.results,e.anonymiseUsers,null===(t=e.config)||void 0===t?void 0:t.imageCdnUrl),S=(0,v.lE)(e.interactive,e.interactiveMetadata,e.results,(function(e){(0,v.bB)(h.current,e)}),e.refreshTable),E=(0,v.Fx)(e.interactive,e.results,e.refreshTable,e.anonymiseUsers,a.m.first(i),s);function I(e){(0,v.l8)(h.current,e)}return n.createElement("div",null,!!e.results.students.length&&n.createElement(d,{filter:s,setFilter:u}),!E.length&&n.createElement(c,{emptyStateImageUrl:e.emptyStateImageUrl,helpingHandImageUrl:e.helpingHandImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,notCompletedImageUrl:e.notCompletedImageUrl,filter:s}),!!E.length&&n.createElement("div",{ref:h,className:"d-flex".concat(E.length?" ".concat(g.Z.hasResults):"")},n.createElement(f.i,{columns:w,data:E,theme:b,onSelectRow:function(t){var r=t.original;e.viewStudentResults(r.user,e.interactiveMetadata.id)},onRowMouseOver:function(e){return I(e.index)},onRowMouseLeave:function(){return I()},enableSort:!0,manualSort:!0,onSort:o,initialSortBy:i}),n.createElement(f.i,{columns:S,data:E,theme:y,enableSlider:!0,scrollIncrement:8*v.Ju,onSelectCell:function(t){e.viewStudentResults(t.row.original.user,e.interactiveMetadata.id,t.column.id)},scrollContainerClassName:"rounded-end border border-start-0 border"})))}var S=r(99742);const E={partialInsights:"qSeTe"};function I(){return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-3"},n.createElement("p",{className:"h6 px-4 mb-0 me-4 partial-loading-background"}," "),n.createElement("div",{className:"row g-2 w-50"},n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")))),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-12"},n.createElement("div",{className:"".concat(E.partialInsights," rounded partial-loading-background")}))))}function C(e){return n.createElement(n.Fragment,null,!e.hasDataLoaded&&n.createElement(I,null),e.hasDataLoaded&&n.createElement(w,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,refreshTable:e.isFetching,viewStudentResults:e.viewStudentResults,emptyStateImageUrl:S.W.Insights.NO_RESPONSES,sortBy:e.sortBy,filterBy:e.filterBy,anonymiseUsers:e.anonymiseUsers,notCompletedImageUrl:S.W.Insights.JIGSAW,markingRequiredImageUrl:S.W.Insights.CLIPBOARD,helpingHandImageUrl:S.W.Insights.SPEECH_BUBBLE_HEART,config:e.config}))}},9566:(e,t,r)=>{r.d(t,{G6:()=>m,GJ:()=>f,VE:()=>g});var n=r(23481),a=r(110),i=r(33518),o=r(2510),l=r(4594),c=r(35223),s=r(14070),u=r(97291),d=n.T.encloseNamespace("myShares.demoInsights"),m={type:o.y.Link,privacy:i.e.JustMySchool,objectId:"0",objectTypeId:l.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},f={share:m,sharedObject:null,shareRecipients:null,dateShared:a.O.subtract(new Date,7,"days").toISOString()},v={application:u.O.MY_SHARES,action:s.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},g={svgName:c.vn.Analytics,label:d("demoInsights"),appLink:v,group:"insights",className:"btn btn-outline-dark"}},82433:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsStudentsDemoView:()=>E});var n=r(32735),a=r(81886),i=r(23481),o=r(2948),l=r(20354),c=r(26025),s=r(38143),u=r(39151),d=r(54405),m=r(93322),f=r(79612),v=r(14070),g=r(97291),p=r(40913),h=r(78057),b=r(9566),y=r(10447);function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var S=i.T.encloseNamespace("insights.interactiveInsightsStudents");function E(e){var t,r,i,E,I,C=(E=(0,o.D)(s.g.ANONYMISE_USERS),I=1,function(e){if(Array.isArray(e))return e}(E)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(E,I)||function(e,t){if(e){if("string"==typeof e)return w(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?w(e,t):void 0}}(E,I)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,m.F)();var R=l.a.useBasicFetch(u.L.config()),k=l.a.useBasicFetch(d.X.interactiveMetadata()),A=l.a.useBasicFetch(d.X.interactive()),N=c.B.getAudienceAppLinkParams(),O=c.B.getDateRangeAppLinkParams(),j=l.a.useBasicFetch(d.X.interactiveResults()),M=A.data&&k.data&&!!j.data;(0,f.M)({title:k.data?S("pageTitle",{video:null===(t=k.data)||void 0===t?void 0:t.name}):null});var U=Object.assign(Object.assign({},N),O);return n.createElement("div",{className:"px-3"},n.createElement(p.j,{tabs:(0,y.aq)(null===(r=k.data)||void 0===r?void 0:r.id,"results",U),video:k.data,dateRangeAppLinkParams:O,share:Object.assign(Object.assign({},b.G6),{objectId:null===(i=k.data)||void 0===i?void 0:i.id}),yearGroups:[],isDemo:!0}),n.createElement(h.R,{interactiveMetadata:k.data,viewStudentResults:function(e,t,r){a.Q.C$.trigger({application:g.O.MY_SHARES,action:v.e.MyShares.INTERACTIVE_STUDENT_RESULTS_DEMO,params:{studentId:e.id,interactiveMetadataId:t,interactionId:r,sessionId:e.sessionId}})},interactive:A.data,results:j.data,filterBy:e.filterBy,sortBy:e.sortBy,isFetching:j.isFetching,anonymiseUsers:C,hasDataLoaded:M,config:R.data}))}}}]);
2
- //# sourceMappingURL=119-e3a8bd94dd-lite.chunk.js.map