@instructure/canvas-rce 5.14.1 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +8 -56
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +7 -28
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +104 -59
  25. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +15 -8
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +17 -28
  36. package/es/enhance-user-content/enhance_user_content.js +28 -60
  37. package/es/enhance-user-content/external_links.js +5 -8
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +12 -34
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +35 -82
  42. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  43. package/es/format-message.js +3 -4
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.js +3 -1
  47. package/es/rce/AlertMessageArea.js +1 -1
  48. package/es/rce/DraggingBlocker.js +4 -2
  49. package/es/rce/KeyboardShortcutModal.js +1 -0
  50. package/es/rce/RCE.js +12 -11
  51. package/es/rce/RCEGlobals.js +12 -10
  52. package/es/rce/RCEVariants.js +27 -10
  53. package/es/rce/RCEWrapper.js +167 -386
  54. package/es/rce/RCEWrapperProps.js +8 -3
  55. package/es/rce/RceHtmlEditor.js +5 -8
  56. package/es/rce/ResizeHandle.js +3 -8
  57. package/es/rce/RestoreAutoSaveModal.js +1 -2
  58. package/es/rce/ShowOnFocusButton/index.js +0 -6
  59. package/es/rce/StatusBar.js +8 -37
  60. package/es/rce/alertHandler.js +1 -4
  61. package/es/rce/contentInsertion.js +35 -57
  62. package/es/rce/contentInsertionUtils.js +6 -8
  63. package/es/rce/contentRendering.js +7 -12
  64. package/es/rce/customEvents.js +1 -0
  65. package/es/rce/editorLanguage.js +22 -10
  66. package/es/rce/indicatorRegion.js +6 -5
  67. package/es/rce/normalizeLocale.js +5 -3
  68. package/es/rce/normalizeProps.js +3 -1
  69. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  70. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  71. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  73. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  74. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  75. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  76. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  82. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  83. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  84. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  85. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  86. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  92. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  94. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  95. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  96. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  97. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  98. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  99. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  100. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  101. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  102. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  103. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  126. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  127. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  128. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  129. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  130. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  131. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  132. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  134. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  135. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  136. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  137. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  138. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  139. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  140. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  141. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  143. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  144. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  146. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  147. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  148. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  149. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  150. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  152. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  153. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  154. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  155. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  158. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  159. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  163. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  164. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  165. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  166. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  167. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  168. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  169. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  170. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  171. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  172. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  173. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  174. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  175. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  176. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  181. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  183. package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
  184. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  185. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  186. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  187. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  188. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  197. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  199. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  201. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  202. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  204. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  205. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  206. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  207. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  208. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  210. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  211. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  212. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  213. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  214. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  215. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  216. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  217. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  218. package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
  219. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  220. package/es/rce/plugins/shared/ColorInput.js +5 -14
  221. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  222. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  223. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  224. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  225. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  226. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  227. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  228. package/es/rce/plugins/shared/EventUtils.js +1 -3
  229. package/es/rce/plugins/shared/Filter.js +8 -38
  230. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  231. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  232. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  233. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  234. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  235. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  236. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  237. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  238. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  239. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  240. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  241. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  242. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  243. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  244. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  245. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  247. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  249. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  250. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  252. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  253. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  254. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  255. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  256. package/es/rce/plugins/shared/Previewable.js +1 -0
  257. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  258. package/es/rce/plugins/shared/StoreContext.js +1 -2
  259. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  260. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  261. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  262. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  263. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  264. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  265. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  266. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  267. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  268. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  269. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  270. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  271. package/es/rce/plugins/shared/Upload/index.js +1 -0
  272. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  273. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  274. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  276. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  277. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  278. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  279. package/es/rce/plugins/shared/dateUtils.js +1 -1
  280. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  281. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  282. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  283. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  284. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  285. package/es/rce/plugins/shared/fileShape.js +4 -9
  286. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  287. package/es/rce/plugins/shared/fileUtils.js +1 -2
  288. package/es/rce/plugins/shared/linkUtils.js +1 -16
  289. package/es/rce/plugins/shared/round.js +1 -0
  290. package/es/rce/plugins/shared/trayUtils.js +4 -3
  291. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  292. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  293. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  294. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  295. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  296. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  297. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  299. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  300. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  314. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  320. package/es/rce/root.js +9 -8
  321. package/es/rce/sanitizePlugins.js +1 -3
  322. package/es/rce/style.js +1 -4
  323. package/es/rce/tinyRCE.js +13 -9
  324. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  325. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  326. package/es/rce/transformContent.js +8 -10
  327. package/es/rce/types.js +1 -0
  328. package/es/rce/userOS.js +1 -1
  329. package/es/rce/wrapInitCb.js +50 -43
  330. package/es/rcs/api.js +61 -116
  331. package/es/rcs/buildError.js +5 -17
  332. package/es/rcs/fake.js +4 -13
  333. package/es/sidebar/actions/all_files.js +2 -0
  334. package/es/sidebar/actions/data.js +4 -7
  335. package/es/sidebar/actions/documents.js +9 -6
  336. package/es/sidebar/actions/files.js +3 -6
  337. package/es/sidebar/actions/filter.js +1 -0
  338. package/es/sidebar/actions/flickr.js +1 -1
  339. package/es/sidebar/actions/images.js +12 -11
  340. package/es/sidebar/actions/links.js +1 -0
  341. package/es/sidebar/actions/media.js +12 -10
  342. package/es/sidebar/actions/session.js +1 -3
  343. package/es/sidebar/actions/ui.js +1 -0
  344. package/es/sidebar/actions/upload.js +14 -39
  345. package/es/sidebar/containers/Sidebar.js +1 -2
  346. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  347. package/es/sidebar/dragHtml.js +5 -3
  348. package/es/sidebar/reducers/all_files.js +4 -3
  349. package/es/sidebar/reducers/collection.js +12 -13
  350. package/es/sidebar/reducers/collections.js +5 -5
  351. package/es/sidebar/reducers/documents.js +6 -13
  352. package/es/sidebar/reducers/files.js +3 -3
  353. package/es/sidebar/reducers/filter.js +1 -8
  354. package/es/sidebar/reducers/flickr.js +9 -9
  355. package/es/sidebar/reducers/folder.js +15 -15
  356. package/es/sidebar/reducers/folders.js +3 -3
  357. package/es/sidebar/reducers/images.js +3 -13
  358. package/es/sidebar/reducers/index.js +3 -1
  359. package/es/sidebar/reducers/media.js +6 -13
  360. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  361. package/es/sidebar/reducers/noop.js +1 -0
  362. package/es/sidebar/reducers/rootFolderId.js +1 -2
  363. package/es/sidebar/reducers/session.js +3 -3
  364. package/es/sidebar/reducers/ui.js +3 -16
  365. package/es/sidebar/reducers/upload.js +8 -40
  366. package/es/sidebar/store/configureStore.js +1 -0
  367. package/es/sidebar/store/initialState.js +13 -24
  368. package/es/translations/locales/ab.js +1 -0
  369. package/es/translations/locales/ar.js +67 -9
  370. package/es/translations/locales/ca.js +67 -9
  371. package/es/translations/locales/cs.js +1 -0
  372. package/es/translations/locales/cs_CZ.js +1 -0
  373. package/es/translations/locales/cy.js +67 -9
  374. package/es/translations/locales/da-x-k12.js +67 -9
  375. package/es/translations/locales/da.js +67 -9
  376. package/es/translations/locales/da_DK.js +1 -0
  377. package/es/translations/locales/de.js +67 -9
  378. package/es/translations/locales/el.js +4 -0
  379. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  380. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  381. package/es/translations/locales/en.js +72 -8
  382. package/es/translations/locales/en_AU.js +67 -9
  383. package/es/translations/locales/en_CA.js +67 -9
  384. package/es/translations/locales/en_CY.js +67 -9
  385. package/es/translations/locales/en_GB.js +67 -9
  386. package/es/translations/locales/en_NZ.js +1 -0
  387. package/es/translations/locales/en_SE.js +1 -0
  388. package/es/translations/locales/en_US.js +1 -0
  389. package/es/translations/locales/es.js +67 -9
  390. package/es/translations/locales/es_ES.js +67 -9
  391. package/es/translations/locales/es_GT.js +1 -0
  392. package/es/translations/locales/fa_IR.js +7 -0
  393. package/es/translations/locales/fi.js +67 -9
  394. package/es/translations/locales/fr.js +67 -9
  395. package/es/translations/locales/fr_CA.js +68 -10
  396. package/es/translations/locales/ga.js +5 -13
  397. package/es/translations/locales/he.js +7 -0
  398. package/es/translations/locales/hi.js +67 -9
  399. package/es/translations/locales/ht.js +67 -9
  400. package/es/translations/locales/hu.js +7 -6
  401. package/es/translations/locales/hu_HU.js +1 -0
  402. package/es/translations/locales/hy.js +1 -0
  403. package/es/translations/locales/id.js +67 -9
  404. package/es/translations/locales/id_ID.js +1 -0
  405. package/es/translations/locales/is.js +67 -9
  406. package/es/translations/locales/it.js +67 -9
  407. package/es/translations/locales/ja.js +67 -9
  408. package/es/translations/locales/ko.js +1 -0
  409. package/es/translations/locales/ko_KR.js +1 -0
  410. package/es/translations/locales/lt.js +1 -0
  411. package/es/translations/locales/lt_LT.js +1 -0
  412. package/es/translations/locales/mi.js +67 -9
  413. package/es/translations/locales/mn_MN.js +1 -0
  414. package/es/translations/locales/ms.js +67 -9
  415. package/es/translations/locales/nb-x-k12.js +67 -9
  416. package/es/translations/locales/nb.js +67 -9
  417. package/es/translations/locales/nl.js +67 -9
  418. package/es/translations/locales/nl_NL.js +1 -0
  419. package/es/translations/locales/nn.js +7 -6
  420. package/es/translations/locales/pl.js +67 -9
  421. package/es/translations/locales/pt.js +67 -9
  422. package/es/translations/locales/pt_BR.js +67 -9
  423. package/es/translations/locales/ro.js +1 -0
  424. package/es/translations/locales/ru.js +67 -9
  425. package/es/translations/locales/se.js +1 -0
  426. package/es/translations/locales/sl.js +67 -9
  427. package/es/translations/locales/sv-x-k12.js +67 -9
  428. package/es/translations/locales/sv.js +67 -9
  429. package/es/translations/locales/sv_SE.js +1 -0
  430. package/es/translations/locales/tg.js +1 -0
  431. package/es/translations/locales/th.js +67 -9
  432. package/es/translations/locales/th_TH.js +1 -0
  433. package/es/translations/locales/tl_PH.js +1 -0
  434. package/es/translations/locales/tr.js +7 -0
  435. package/es/translations/locales/uk_UA.js +7 -0
  436. package/es/translations/locales/vi.js +67 -9
  437. package/es/translations/locales/vi_VN.js +1 -0
  438. package/es/translations/locales/zh-Hans.js +67 -9
  439. package/es/translations/locales/zh-Hant.js +67 -9
  440. package/es/translations/locales/zh.js +67 -9
  441. package/es/translations/locales/zh_HK.js +67 -9
  442. package/es/translations/locales/zh_TW.Big5.js +1 -0
  443. package/es/translations/locales/zh_TW.js +1 -0
  444. package/es/translations/tinymce/ar_SA.js +1 -0
  445. package/es/translations/tinymce/fi.js +1 -0
  446. package/es/translations/tinymce/ga.js +1 -0
  447. package/es/translations/tinymce/id.js +1 -0
  448. package/es/translations/tinymce/ru.js +1 -0
  449. package/es/translations/tinymce/ru_RU.js +1 -0
  450. package/es/translations/tinymce/sl.js +1 -0
  451. package/es/translations/tinymce/sr.js +1 -0
  452. package/es/translations/tinymce/th.js +1 -0
  453. package/es/translations/tinymce/uk_UA.js +1 -0
  454. package/es/translations/tinymce/vi_VN.js +1 -0
  455. package/es/util/TypedDict.js +4 -2
  456. package/es/util/encrypted-storage.js +3 -13
  457. package/es/util/file-url-util.js +1 -6
  458. package/es/util/fullscreenHelpers.js +4 -1
  459. package/es/util/instui-icon-helper.js +4 -3
  460. package/es/util/loadingPlaceholder.js +38 -39
  461. package/es/util/simpleCache.js +0 -3
  462. package/es/util/string-util.js +1 -1
  463. package/es/util/textarea-editing-util.js +3 -7
  464. package/es/util/tinymce-plugin-util.js +0 -5
  465. package/es/util/url-util.js +16 -25
  466. package/eslint.config.js +239 -0
  467. package/jest.config.js +1 -1
  468. package/package.json +76 -81
  469. package/scripts/build-canvas +2 -1
  470. package/scripts/build.js +4 -4
  471. package/testcafe/RCEWrapper.test.js +0 -1
  472. package/testcafe/StatusBar.test.js +0 -1
  473. package/testcafe/axe.test.js +3 -4
  474. package/testcafe/enhanceUserContent.test.js +0 -1
  475. package/tsconfig.json +20 -15
  476. package/.eslintrc +0 -45
  477. package/.prettierignore +0 -6
  478. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  479. package/es/rce/__mocks__/styleMock.js +0 -18
  480. package/es/rce/__mocks__/tinymceReact.js +0 -55
  481. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
package/es/rcs/api.js CHANGED
@@ -15,13 +15,14 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import 'isomorphic-fetch';
19
- import { parse } from 'url';
20
20
  import { saveClosedCaptions, saveClosedCaptionsForAttachment, CONSTANTS } from '@instructure/canvas-media';
21
21
  import { downloadToWrap, fixupFileUrl } from '../common/fileUrl';
22
22
  import alertHandler from '../rce/alertHandler';
23
23
  import buildError from './buildError';
24
24
  import RCEGlobals from '../rce/RCEGlobals';
25
+ import { parseUrlPath } from '../util/url-util';
25
26
  export function headerFor(jwt) {
26
27
  return {
27
28
  Authorization: 'Bearer ' + jwt
@@ -29,23 +30,20 @@ export function headerFor(jwt) {
29
30
  }
30
31
  export function originFromHost(host, windowOverride) {
31
32
  let origin = host;
32
-
33
33
  if (typeof origin !== 'string') {
34
34
  origin = '';
35
35
  } else if (origin && origin.substr(0, 4) !== 'http') {
36
36
  var _windowHandle$locatio;
37
-
38
37
  origin = `//${origin}`;
39
38
  const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
40
-
41
39
  if (origin.length > 0 && windowHandle !== null && windowHandle !== void 0 && (_windowHandle$locatio = windowHandle.location) !== null && _windowHandle$locatio !== void 0 && _windowHandle$locatio.protocol) {
42
40
  origin = `${windowHandle.location.protocol}${origin}`;
43
41
  }
44
42
  }
45
-
46
43
  return origin;
47
- } // filter a response to raise an error on a 400+ status
44
+ }
48
45
 
46
+ // filter a response to raise an error on a 400+ status
49
47
  function checkStatus(response) {
50
48
  if (response.status < 400) {
51
49
  return response;
@@ -55,11 +53,9 @@ function checkStatus(response) {
55
53
  throw error;
56
54
  }
57
55
  }
58
-
59
56
  function defaultRefreshTokenHandler() {
60
57
  throw new Error('Token expired, no refresh function provided');
61
58
  }
62
-
63
59
  function normalizeFileData(file) {
64
60
  return {
65
61
  // copy the name to the default display name if none provided
@@ -69,7 +65,6 @@ function normalizeFileData(file) {
69
65
  href: downloadToWrap(file.href || file.url)
70
66
  };
71
67
  }
72
-
73
68
  function throwConnectionError(error) {
74
69
  if (error.name === 'TypeError') {
75
70
  // eslint-disable-next-line no-console
@@ -78,10 +73,8 @@ function throwConnectionError(error) {
78
73
  Details can be found at https://github.com/instructure/canvas-rce-api
79
74
  `);
80
75
  }
81
-
82
76
  throw error;
83
77
  }
84
-
85
78
  class RceApiSource {
86
79
  constructor() {
87
80
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -92,7 +85,6 @@ class RceApiSource {
92
85
  this.alertFunc = options.alertFunc || alertHandler.handleAlert;
93
86
  this.canvasOrigin = options.canvasOrigin || window.origin;
94
87
  }
95
-
96
88
  getSession() {
97
89
  const headers = headerFor(this.jwt);
98
90
  const uri = this.baseUri('session');
@@ -100,10 +92,10 @@ class RceApiSource {
100
92
  this.hasSession = true;
101
93
  return data;
102
94
  }).catch(throwConnectionError);
103
- } // initial state of a collection is empty, not loading, with bookmark set to
104
- // uri for initial page fetch
105
-
95
+ }
106
96
 
97
+ // initial state of a collection is empty, not loading, with bookmark set to
98
+ // uri for initial page fetch
107
99
  initializeCollection(endpoint, props) {
108
100
  return {
109
101
  links: [],
@@ -113,7 +105,6 @@ class RceApiSource {
113
105
  searchString: props.searchString
114
106
  };
115
107
  }
116
-
117
108
  initializeUpload() {
118
109
  return {
119
110
  uploading: false,
@@ -121,11 +112,9 @@ class RceApiSource {
121
112
  formExpanded: false
122
113
  };
123
114
  }
124
-
125
115
  initializeImages(props) {
126
116
  return this.initializeDocuments(props);
127
117
  }
128
-
129
118
  initializeDocuments(props) {
130
119
  return {
131
120
  [props.contextType]: {
@@ -137,28 +126,24 @@ class RceApiSource {
137
126
  searchString: ''
138
127
  };
139
128
  }
140
-
141
129
  initializeMedia(props) {
142
130
  return this.initializeDocuments(props);
143
131
  }
144
-
145
132
  initializeFlickr() {
146
133
  return {
147
134
  searchResults: [],
148
135
  searching: false,
149
136
  formExpanded: false
150
137
  };
151
- } // fetches the given URI and filters it to either an error or parsed response
152
-
138
+ }
153
139
 
140
+ // fetches the given URI and filters it to either an error or parsed response
154
141
  fetchPage(uri) {
155
142
  return this.apiFetch(uri, headerFor(this.jwt));
156
143
  }
157
-
158
144
  fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, bookmark) {
159
145
  return fetchFunction(properties, bookmark).then(result => {
160
146
  onSuccess(result);
161
-
162
147
  if (result.bookmark) {
163
148
  this.fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, result.bookmark);
164
149
  }
@@ -166,7 +151,6 @@ class RceApiSource {
166
151
  onError(error);
167
152
  });
168
153
  }
169
-
170
154
  fetchDocs(props) {
171
155
  const documents = props.documents[props.contextType];
172
156
  const uri = documents.bookmark || this.uriFor('documents', props);
@@ -181,13 +165,10 @@ class RceApiSource {
181
165
  };
182
166
  });
183
167
  }
184
-
185
168
  fetchMedia(props) {
186
169
  var _RCEGlobals$getFeatur;
187
-
188
170
  const media = props.media[props.contextType];
189
171
  const uri = media.bookmark || this.uriFor('media', props);
190
-
191
172
  if ((_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur !== void 0 && _RCEGlobals$getFeatur.media_links_use_attachment_id) {
192
173
  return this.apiFetch(uri, headerFor(this.jwt)).then(_ref2 => {
193
174
  let {
@@ -200,10 +181,8 @@ class RceApiSource {
200
181
  };
201
182
  });
202
183
  }
203
-
204
184
  return this.apiFetch(uri, headerFor(this.jwt));
205
185
  }
206
-
207
186
  fetchFiles(uri) {
208
187
  return this.fetchPage(uri).then(_ref3 => {
209
188
  let {
@@ -216,7 +195,6 @@ class RceApiSource {
216
195
  };
217
196
  });
218
197
  }
219
-
220
198
  fetchLinks(key, props) {
221
199
  const {
222
200
  collections
@@ -224,15 +202,12 @@ class RceApiSource {
224
202
  const bookmark = collections[key].bookmark || this.uriFor(key, props);
225
203
  return this.fetchPage(bookmark);
226
204
  }
227
-
228
205
  fetchRootFolder(props) {
229
206
  return this.fetchPage(this.uriFor('folders', props), this.jwt);
230
207
  }
231
-
232
208
  mediaServerSession() {
233
209
  return this.apiPost(this.baseUri('v1/services/kaltura_session'), headerFor(this.jwt), {});
234
210
  }
235
-
236
211
  uploadMediaToCanvas(mediaObject) {
237
212
  const body = {
238
213
  id: mediaObject.entryId,
@@ -246,10 +221,8 @@ class RceApiSource {
246
221
  };
247
222
  return this.apiPost(this.baseUri('media_objects'), headerFor(this.jwt), body);
248
223
  }
249
-
250
224
  updateMediaObject(apiProps, _ref4) {
251
225
  var _RCEGlobals$getFeatur2;
252
-
253
226
  let {
254
227
  media_object_id,
255
228
  title,
@@ -257,10 +230,10 @@ class RceApiSource {
257
230
  } = _ref4;
258
231
  const uri = (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.media_links_use_attachment_id && attachment_id ? `${this.baseUri('media_attachments', apiProps.host)}/${attachment_id}?user_entered_title=${encodeURIComponent(title)}` : `${this.baseUri('media_objects', apiProps.host)}/${media_object_id}?user_entered_title=${encodeURIComponent(title)}`;
259
232
  return this.apiPost(uri, headerFor(this.jwt), null, 'PUT');
260
- } // PUT to //RCS/api/media_objects/:mediaId/media_tracks [{locale, content}, ...]
261
- // receive back a 200 with the new subtitles, or a 4xx error
262
-
233
+ }
263
234
 
235
+ // PUT to //RCS/api/media_objects/:mediaId/media_tracks [{locale, content}, ...]
236
+ // receive back a 200 with the new subtitles, or a 4xx error
264
237
  updateClosedCaptions(apiProps, _ref5) {
265
238
  let {
266
239
  media_object_id,
@@ -278,10 +251,10 @@ class RceApiSource {
278
251
  message: 'failed to save captions'
279
252
  }, e));
280
253
  });
281
- } // GET /media_objects/:mediaId/media_tracks
282
- // receive back the current list of media_tracks
283
-
254
+ }
284
255
 
256
+ // GET /media_objects/:mediaId/media_tracks
257
+ // receive back the current list of media_tracks
285
258
  fetchClosedCaptions(_mediaId) {
286
259
  return Promise.resolve([{
287
260
  locale: 'af',
@@ -290,42 +263,36 @@ class RceApiSource {
290
263
  locale: 'es',
291
264
  content: '1\r\n00:00:00,000 --> 00:00:01,251\r\nThis is the content\r\n'
292
265
  }]);
293
- } // fetches folders for the given context to upload files to
294
-
266
+ }
295
267
 
268
+ // fetches folders for the given context to upload files to
296
269
  fetchFolders(props, bookmark) {
297
270
  const headers = headerFor(this.jwt);
298
271
  const uri = bookmark || this.uriFor('folders/all', props);
299
272
  return this.apiFetch(uri, headers);
300
- } // Fetches all files for a given folder
301
-
273
+ }
302
274
 
275
+ // Fetches all files for a given folder
303
276
  fetchFilesForFolder(props, bookmark) {
304
277
  let uri;
305
-
306
278
  if (!bookmark) {
307
279
  const perPageQuery = props.perPage ? `per_page=${props.perPage}` : '';
308
280
  const searchParam = getSearchParam(props.searchString);
309
281
  uri = `${props.filesUrl}`;
310
282
  uri += perPageQuery ? `?${perPageQuery}` : '';
311
-
312
283
  if (searchParam) {
313
284
  uri += perPageQuery ? `${searchParam}` : `?${searchParam}`;
314
285
  }
315
-
316
286
  if (props.sortBy) {
317
287
  uri += `${getSortParams(props.sortBy.sort, props.sortBy.order)}`;
318
288
  }
319
289
  }
320
-
321
290
  return this.fetchPage(uri || bookmark, this.jwt);
322
291
  }
323
-
324
292
  fetchSubFolders(props, bookmark) {
325
293
  const uri = bookmark || `${this.baseUri('folders', props.host)}/${props.folderId}`;
326
294
  return this.apiFetch(uri, headerFor(this.jwt));
327
295
  }
328
-
329
296
  fetchIconMakerFolder(_ref6) {
330
297
  let {
331
298
  contextId,
@@ -339,23 +306,18 @@ class RceApiSource {
339
306
  });
340
307
  return this.fetchPage(uri);
341
308
  }
342
-
343
309
  fetchMediaFolder(props) {
344
310
  let uri;
345
-
346
311
  if (props.contextType === 'user') {
347
312
  uri = this.uriFor('folders', props);
348
313
  } else {
349
314
  uri = this.uriFor('folders/media', props);
350
315
  }
351
-
352
316
  return this.fetchPage(uri);
353
317
  }
354
-
355
318
  fetchMediaObjectIframe(mediaObjectId) {
356
319
  return this.fetchPage(this.uriFor(`media_objects_iframe/${mediaObjectId}`));
357
320
  }
358
-
359
321
  fetchImages(props) {
360
322
  const images = props.images[props.contextType];
361
323
  const uri = images.bookmark || this.uriFor('images', props);
@@ -372,7 +334,6 @@ class RceApiSource {
372
334
  };
373
335
  });
374
336
  }
375
-
376
337
  preflightUpload(fileProps, apiProps) {
377
338
  const headers = headerFor(this.jwt);
378
339
  const uri = this.baseUri('upload', apiProps.host);
@@ -386,7 +347,6 @@ class RceApiSource {
386
347
  };
387
348
  return this.apiPost(uri, headers, body);
388
349
  }
389
-
390
350
  uploadFRD(fileDomObject, preflightProps) {
391
351
  const data = new window.FormData();
392
352
  Object.keys(preflightProps.upload_params).forEach(uploadProp => {
@@ -397,20 +357,33 @@ class RceApiSource {
397
357
  method: 'POST',
398
358
  body: data
399
359
  };
400
-
401
360
  if (!preflightProps.upload_params['x-amz-signature'] && !preflightProps.upload_url.includes('files_api')) {
402
361
  // _not_ an S3 upload, include the credentials in the upload POST
403
362
  // local uploads can include crendentials for same-origin requests
404
363
  fetchOptions.credentials = 'include';
405
364
  }
406
-
407
- return fetch(preflightProps.upload_url, fetchOptions).then(checkStatus).then(res => res.json()).then(uploadResults => {
365
+ return fetch(preflightProps.upload_url, fetchOptions).then(checkStatus).then(res => {
366
+ if (res.headers.get('content-type').includes('application/xml')) {
367
+ if (res.status === 201) {
368
+ return res.text().then(text => {
369
+ const xmldoc = new window.DOMParser().parseFromString(text, 'application/xml');
370
+ const location = xmldoc.querySelector('Location').textContent;
371
+ return {
372
+ Location: location
373
+ };
374
+ });
375
+ } else {
376
+ throw new Error('upload failed to create the file');
377
+ }
378
+ } else {
379
+ return res.json();
380
+ }
381
+ }).then(uploadResults => {
408
382
  return this.finalizeUpload(preflightProps, uploadResults);
409
383
  }).catch(e => {
410
384
  this.alertFunc(buildError({}, e));
411
385
  });
412
386
  }
413
-
414
387
  finalizeUpload(preflightProps, uploadResults) {
415
388
  if (preflightProps.upload_params.success_url) {
416
389
  // s3 upload, follow-up at success_url to finalize. the success_url doesn't
@@ -421,21 +394,16 @@ class RceApiSource {
421
394
  // response. we can't just fetch the location as would be intended because
422
395
  // it requires Canvas authentication. we also don't have an RCE API
423
396
  // endpoint to forward it through.
424
- const {
425
- pathname
426
- } = parse(uploadResults.location);
397
+ const pathname = parseUrlPath(uploadResults.location);
427
398
  const matchData = pathname.match(/^\/api\/v1\/files\/((?:\d+~)?\d+)$/);
428
-
429
399
  if (!matchData) {
430
400
  const error = new Error('cannot determine file ID from location');
431
401
  error.location = uploadResults.location;
432
402
  throw error;
433
403
  }
434
-
435
404
  const fileId = matchData[1];
436
405
  return this.getFile(fileId).then(fileResults => {
437
406
  fileResults.uuid = uploadResults.uuid; // if present, we'll need the uuid for the file verifier downstream
438
-
439
407
  return fileResults;
440
408
  });
441
409
  } else {
@@ -443,7 +411,6 @@ class RceApiSource {
443
411
  return Promise.resolve(uploadResults);
444
412
  }
445
413
  }
446
-
447
414
  setUsageRights(fileId, usageRights) {
448
415
  const headers = headerFor(this.jwt);
449
416
  const uri = this.baseUri('usage_rights');
@@ -453,19 +420,18 @@ class RceApiSource {
453
420
  };
454
421
  return this.apiPost(uri, headers, body);
455
422
  }
456
-
457
423
  searchFlickr(term, apiProps) {
458
424
  const headers = headerFor(this.jwt);
459
425
  const base = this.baseUri('flickr_search', apiProps.host);
460
426
  const uri = `${base}?term=${encodeURIComponent(term)}`;
461
427
  return this.apiFetch(uri, headers);
462
428
  }
463
-
464
429
  getFile(id) {
465
430
  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
466
431
  const headers = headerFor(this.jwt);
467
- const base = this.baseUri('file'); // Valid query parameters for getFile
432
+ const base = this.baseUri('file');
468
433
 
434
+ // Valid query parameters for getFile
469
435
  const {
470
436
  replacement_chain_context_type,
471
437
  replacement_chain_context_id,
@@ -477,37 +443,33 @@ class RceApiSource {
477
443
  include
478
444
  });
479
445
  return this.apiFetch(uri, headers).then(normalizeFileData);
480
- } // @private
481
-
446
+ }
482
447
 
448
+ // @private
483
449
  addParamsIfPresent(uri, params) {
484
450
  let url;
485
-
486
451
  try {
487
452
  url = new URL(uri);
488
- } catch (e) {
453
+ } catch (_e) {
489
454
  // Just return the URI if it was invalid
490
455
  return uri;
491
- } // Add all truthy parameters to the URL
492
-
456
+ }
493
457
 
458
+ // Add all truthy parameters to the URL
494
459
  for (const [name, value] of Object.entries(params)) {
495
460
  if (!value) continue;
496
461
  url.searchParams.append(name, value);
497
462
  }
498
-
499
463
  return url.toString();
500
- } // @private
501
-
464
+ }
502
465
 
466
+ // @private
503
467
  async apiFetch(uri, headers, options) {
504
468
  if (!this.hasSession) {
505
469
  await this.getSession();
506
470
  }
507
-
508
471
  return this.apiReallyFetch(uri, headers, options);
509
472
  }
510
-
511
473
  apiReallyFetch(uri, headers) {
512
474
  let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
513
475
  uri = this.normalizeUriProtocol(uri);
@@ -528,31 +490,31 @@ class RceApiSource {
528
490
  this.alertFunc(buildError(e));
529
491
  throw e;
530
492
  });
531
- } // @private
532
-
493
+ }
533
494
 
495
+ // @private
534
496
  apiPost(uri, headers, body) {
535
497
  let method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'POST';
536
- headers = { ...headers,
498
+ headers = {
499
+ ...headers,
537
500
  'Content-Type': 'application/json'
538
501
  };
539
502
  const fetchOptions = {
540
503
  method,
541
504
  headers
542
505
  };
543
-
544
506
  if (body) {
545
507
  fetchOptions.body = JSON.stringify(body);
546
508
  } else {
547
509
  fetchOptions.form = body;
548
510
  }
549
-
550
511
  uri = this.normalizeUriProtocol(uri);
551
512
  return fetch(uri, fetchOptions).then(response => {
552
513
  if (response.status === 401) {
553
514
  // retry once with fresh token
554
515
  return this.buildRetryHeaders(fetchOptions.headers).then(newHeaders => {
555
- const newOptions = { ...fetchOptions,
516
+ const newOptions = {
517
+ ...fetchOptions,
556
518
  headers: newHeaders
557
519
  };
558
520
  return fetch(uri, newOptions);
@@ -562,54 +524,49 @@ class RceApiSource {
562
524
  }
563
525
  }).then(checkStatus).then(res => res.json()).catch(throwConnectionError).catch(e => e.response.json().then(responseBody => {
564
526
  console.error(e); // eslint-disable-line no-console
565
-
566
527
  this.alertFunc(buildError(responseBody));
567
528
  throw e;
568
529
  }));
569
- } // @private
570
-
530
+ }
571
531
 
532
+ // @private
572
533
  normalizeUriProtocol(uri, windowOverride) {
573
534
  const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
574
-
575
535
  if (windowHandle && windowHandle.location && windowHandle.location.protocol === 'https:') {
576
536
  return uri.replace('http://', 'https://');
577
537
  }
578
-
579
538
  return uri;
580
- } // @private
581
-
539
+ }
582
540
 
541
+ // @private
583
542
  buildRetryHeaders(headers) {
584
543
  return new Promise(resolve => {
585
544
  this.refreshToken(freshToken => {
586
545
  this.jwt = freshToken;
587
546
  const freshHeader = headerFor(freshToken);
588
- const mergedHeaders = { ...headers,
547
+ const mergedHeaders = {
548
+ ...headers,
589
549
  ...freshHeader
590
550
  };
591
551
  resolve(mergedHeaders);
592
552
  });
593
553
  });
594
554
  }
595
-
596
555
  baseUri(endpoint, host, windowOverride) {
597
556
  if (!host && this.host) {
598
557
  host = this.host;
599
558
  }
600
-
601
559
  host = originFromHost(host, windowOverride);
602
560
  const sharedEndpoints = ['images', 'media', 'documents', 'all']; // 'all' will eventually be something different
603
-
604
561
  const endpt = sharedEndpoints.includes(endpoint) ? 'documents' : endpoint;
605
562
  return `${host}/api/${endpt}`;
606
- } // returns the URI to use with the fetchPage method to fetch the first page of
563
+ }
564
+
565
+ // returns the URI to use with the fetchPage method to fetch the first page of
607
566
  // the given endpoint. e.g. for wikiPages it might return:
608
567
  //
609
568
  // //rce.docker/api/wikiPages?context_type=course&context_id=42
610
569
  //
611
-
612
-
613
570
  uriFor(endpoint, props) {
614
571
  const {
615
572
  host,
@@ -621,51 +578,39 @@ class RceApiSource {
621
578
  } = props;
622
579
  let extra = '';
623
580
  const pageSizeParam = perPage ? `&per_page=${perPage}` : '';
624
-
625
581
  switch (endpoint) {
626
582
  case 'images':
627
583
  extra = `&content_types=image${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}${optionalQuery(props, 'category')}`;
628
584
  break;
629
-
630
585
  case 'media':
631
586
  // when requesting media files via the documents endpoint
632
587
  extra = `&content_types=video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
633
588
  break;
634
-
635
589
  case 'documents':
636
590
  extra = `&exclude_content_types=image,video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
637
591
  break;
638
-
639
592
  case 'media_objects':
640
593
  // when requesting media objects (this is the currently used branch)
641
594
  extra = `${getSortParams(sortBy.sort === 'alphabetical' ? 'title' : 'date', sortBy.dir)}${getSearchParam(searchString)}`;
642
595
  break;
643
-
644
596
  default:
645
597
  extra = getSearchParam(searchString);
646
598
  }
647
-
648
599
  return `${this.baseUri(endpoint, host)}?contextType=${contextType}&contextId=${contextId}${pageSizeParam}${extra}`;
649
600
  }
650
-
651
601
  }
652
-
653
602
  function getSortParams(sort, dir) {
654
603
  let sortBy = sort;
655
-
656
604
  if (sortBy === 'date_added') {
657
605
  sortBy = 'created_at';
658
606
  } else if (sortBy === 'alphabetical') {
659
607
  sortBy = 'name';
660
608
  }
661
-
662
609
  return `&sort=${sortBy}&order=${dir}`;
663
610
  }
664
-
665
611
  function optionalQuery(props, name) {
666
612
  return props[name] ? `&${name}=${props[name]}` : '';
667
613
  }
668
-
669
614
  export function getSearchParam(searchString) {
670
615
  return (searchString === null || searchString === void 0 ? void 0 : searchString.length) >= 3 ? `&search_term=${encodeURIComponent(searchString)}` : '';
671
616
  }
@@ -15,7 +15,9 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import formatMessage from '../format-message';
20
+
19
21
  /*
20
22
  * builds an a displayable error based on errorContext and error
21
23
  *
@@ -25,74 +27,60 @@ import formatMessage from '../format-message';
25
27
  *
26
28
  * @returns { Object } Displayable error - An object with "text" and "variant" keys
27
29
  */
28
-
29
30
  export default function buildError(errorContext, error) {
30
31
  return getErrorClass(errorContext, error).build(error);
31
32
  }
32
-
33
33
  function getErrorClass(errorContext, error) {
34
- const errors = [QuotaError, CaptionSizeError, CaptionCreationError, DefaultError]; // Find the first error class that matches the given context and error.
35
- // Defaults to DefaultError
34
+ const errors = [QuotaError, CaptionSizeError, CaptionCreationError, DefaultError];
36
35
 
36
+ // Find the first error class that matches the given context and error.
37
+ // Defaults to DefaultError
37
38
  return errors.find(ErrorClass => ErrorClass.isMatch(errorContext, error));
38
39
  }
39
-
40
40
  class QuotaError {
41
41
  static isMatch(errorContext) {
42
42
  return (errorContext === null || errorContext === void 0 ? void 0 : errorContext.message) === 'file size exceeds quota';
43
43
  }
44
-
45
44
  static build(_error) {
46
45
  return {
47
46
  text: formatMessage('File storage quota exceeded'),
48
47
  variant: 'error'
49
48
  };
50
49
  }
51
-
52
50
  }
53
-
54
51
  class CaptionSizeError {
55
52
  static isMatch(_errorContext, error) {
56
53
  return (error === null || error === void 0 ? void 0 : error.name) === 'FileSizeError';
57
54
  }
58
-
59
55
  static build(error) {
60
56
  return {
61
57
  text: formatMessage('Closed caption file must be less than {maxKb} kb', {
62
58
  maxKb: error.maxBytes / 1000 // bytes to kb
63
-
64
59
  }),
65
60
  variant: 'error'
66
61
  };
67
62
  }
68
-
69
63
  }
70
-
71
64
  class CaptionCreationError {
72
65
  static isMatch(errorContext) {
73
66
  return (errorContext === null || errorContext === void 0 ? void 0 : errorContext.message) === 'failed to save captions';
74
67
  }
75
-
76
68
  static build(_error) {
77
69
  return {
78
70
  text: formatMessage('loading closed captions/subtitles failed.'),
79
71
  variant: 'error'
80
72
  };
81
73
  }
82
-
83
74
  }
84
-
85
75
  class DefaultError {
86
76
  static isMatch() {
87
77
  // DefaultError comes last in the list an always matches
88
78
  return true;
89
79
  }
90
-
91
80
  static build(_error) {
92
81
  return {
93
82
  text: formatMessage('Something went wrong. Check your connection, reload the page, and try again.'),
94
83
  variant: 'error'
95
84
  };
96
85
  }
97
-
98
86
  }