@instructure/canvas-rce 5.14.1 → 5.15.0

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