@instructure/canvas-rce 5.14.0 → 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 (484) hide show
  1. package/CHANGELOG.md +33 -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/__tests__/sidebar/reducers/all_files.test.js +28 -0
  17. package/babel.config.js +3 -1
  18. package/build.sh +7 -7
  19. package/es/bridge/Bridge.js +8 -56
  20. package/es/bridge/index.js +1 -0
  21. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  22. package/es/canvasFileBrowser/en-US.js +3 -6
  23. package/es/common/FlashAlert.js +7 -28
  24. package/es/common/browser.js +4 -2
  25. package/es/common/fileUrl.js +104 -59
  26. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  27. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  28. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  29. package/es/common/incremental-loading/index.js +1 -0
  30. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  31. package/es/common/indicate.js +15 -8
  32. package/es/common/mimeClass.js +3 -4
  33. package/es/common/natcompare.js +1 -4
  34. package/es/defaultTinymceConfig.js +5 -3
  35. package/es/elementDenylist.js +1 -0
  36. package/es/enhance-user-content/doc_previews.js +17 -28
  37. package/es/enhance-user-content/enhance_user_content.js +28 -60
  38. package/es/enhance-user-content/external_links.js +5 -8
  39. package/es/enhance-user-content/index.js +1 -0
  40. package/es/enhance-user-content/instructure_helper.js +25 -38
  41. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  42. package/es/enhance-user-content/mathml.js +35 -82
  43. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  44. package/es/format-message.js +3 -4
  45. package/es/getThemeVars.js +8 -6
  46. package/es/getTranslations.js +1 -78
  47. package/es/index.js +3 -1
  48. package/es/rce/AlertMessageArea.js +1 -1
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +1 -0
  51. package/es/rce/RCE.js +12 -11
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +27 -10
  54. package/es/rce/RCEWrapper.js +167 -386
  55. package/es/rce/RCEWrapperProps.js +8 -3
  56. package/es/rce/RceHtmlEditor.js +5 -8
  57. package/es/rce/ResizeHandle.js +3 -8
  58. package/es/rce/RestoreAutoSaveModal.js +1 -2
  59. package/es/rce/ShowOnFocusButton/index.js +0 -6
  60. package/es/rce/StatusBar.js +8 -37
  61. package/es/rce/alertHandler.js +1 -4
  62. package/es/rce/contentInsertion.js +35 -57
  63. package/es/rce/contentInsertionUtils.js +6 -8
  64. package/es/rce/contentRendering.js +7 -12
  65. package/es/rce/customEvents.js +1 -0
  66. package/es/rce/editorLanguage.js +22 -10
  67. package/es/rce/indicatorRegion.js +6 -5
  68. package/es/rce/normalizeLocale.js +5 -3
  69. package/es/rce/normalizeProps.js +3 -1
  70. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  71. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  74. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  75. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  76. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  77. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  83. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  84. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  85. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  86. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  95. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  96. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  97. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  98. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  99. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  100. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  101. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  102. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  103. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  127. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  128. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  129. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  130. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  131. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  132. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  134. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  135. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  136. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  137. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  138. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  139. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  140. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  141. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  144. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  147. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  148. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  149. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  150. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  153. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  154. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  155. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  156. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  159. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  164. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  165. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  166. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  167. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  168. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  169. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  170. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  171. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  172. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  173. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  174. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  175. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  176. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  184. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  185. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  186. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  187. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  188. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  198. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  199. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  201. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  202. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  204. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  205. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  206. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  207. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  208. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  210. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  211. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  212. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  213. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  214. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  215. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  216. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  217. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  218. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  219. package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
  220. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  221. package/es/rce/plugins/shared/ColorInput.js +5 -14
  222. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  223. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  224. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  225. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  226. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  227. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  228. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  229. package/es/rce/plugins/shared/EventUtils.js +1 -3
  230. package/es/rce/plugins/shared/Filter.js +8 -38
  231. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  232. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  233. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  234. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  235. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  236. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  237. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  239. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  240. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  241. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  242. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  244. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  245. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  247. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  248. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  250. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  251. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  252. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  253. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  254. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  255. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  256. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  257. package/es/rce/plugins/shared/Previewable.js +1 -0
  258. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  259. package/es/rce/plugins/shared/StoreContext.js +1 -2
  260. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  261. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  262. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  263. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  264. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  265. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  266. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  267. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  268. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  269. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  270. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  271. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  272. package/es/rce/plugins/shared/Upload/index.js +1 -0
  273. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  274. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  275. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  276. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  277. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  278. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  279. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  280. package/es/rce/plugins/shared/dateUtils.js +1 -1
  281. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  282. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  283. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  284. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  285. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  286. package/es/rce/plugins/shared/fileShape.js +4 -9
  287. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  288. package/es/rce/plugins/shared/fileUtils.js +1 -2
  289. package/es/rce/plugins/shared/linkUtils.js +1 -16
  290. package/es/rce/plugins/shared/round.js +1 -0
  291. package/es/rce/plugins/shared/trayUtils.js +4 -3
  292. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  293. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  294. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  295. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  296. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  297. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  299. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  300. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  321. package/es/rce/root.js +9 -8
  322. package/es/rce/sanitizePlugins.js +1 -3
  323. package/es/rce/style.js +1 -4
  324. package/es/rce/tinyRCE.js +13 -9
  325. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  326. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  327. package/es/rce/transformContent.js +8 -10
  328. package/es/rce/types.js +1 -0
  329. package/es/rce/userOS.js +1 -1
  330. package/es/rce/wrapInitCb.js +50 -43
  331. package/es/rcs/api.js +61 -116
  332. package/es/rcs/buildError.js +5 -17
  333. package/es/rcs/fake.js +4 -13
  334. package/es/sidebar/actions/all_files.js +2 -0
  335. package/es/sidebar/actions/data.js +4 -7
  336. package/es/sidebar/actions/documents.js +9 -6
  337. package/es/sidebar/actions/files.js +3 -6
  338. package/es/sidebar/actions/filter.js +1 -0
  339. package/es/sidebar/actions/flickr.js +1 -1
  340. package/es/sidebar/actions/images.js +12 -11
  341. package/es/sidebar/actions/links.js +1 -0
  342. package/es/sidebar/actions/media.js +12 -10
  343. package/es/sidebar/actions/session.js +1 -3
  344. package/es/sidebar/actions/ui.js +1 -0
  345. package/es/sidebar/actions/upload.js +14 -39
  346. package/es/sidebar/containers/Sidebar.js +1 -2
  347. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  348. package/es/sidebar/dragHtml.js +5 -3
  349. package/es/sidebar/reducers/all_files.js +4 -3
  350. package/es/sidebar/reducers/collection.js +12 -13
  351. package/es/sidebar/reducers/collections.js +5 -5
  352. package/es/sidebar/reducers/documents.js +6 -13
  353. package/es/sidebar/reducers/files.js +3 -3
  354. package/es/sidebar/reducers/filter.js +1 -8
  355. package/es/sidebar/reducers/flickr.js +9 -9
  356. package/es/sidebar/reducers/folder.js +15 -15
  357. package/es/sidebar/reducers/folders.js +3 -3
  358. package/es/sidebar/reducers/images.js +3 -13
  359. package/es/sidebar/reducers/index.js +3 -1
  360. package/es/sidebar/reducers/media.js +6 -13
  361. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  362. package/es/sidebar/reducers/noop.js +1 -0
  363. package/es/sidebar/reducers/rootFolderId.js +1 -2
  364. package/es/sidebar/reducers/session.js +3 -3
  365. package/es/sidebar/reducers/ui.js +3 -16
  366. package/es/sidebar/reducers/upload.js +8 -40
  367. package/es/sidebar/store/configureStore.js +1 -0
  368. package/es/sidebar/store/initialState.js +13 -24
  369. package/es/translations/locales/ab.js +1 -0
  370. package/es/translations/locales/ar.js +67 -9
  371. package/es/translations/locales/ca.js +67 -9
  372. package/es/translations/locales/cs.js +1 -0
  373. package/es/translations/locales/cs_CZ.js +1 -0
  374. package/es/translations/locales/cy.js +67 -9
  375. package/es/translations/locales/da-x-k12.js +67 -9
  376. package/es/translations/locales/da.js +67 -9
  377. package/es/translations/locales/da_DK.js +1 -0
  378. package/es/translations/locales/de.js +67 -9
  379. package/es/translations/locales/el.js +4 -0
  380. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  381. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  382. package/es/translations/locales/en.js +72 -8
  383. package/es/translations/locales/en_AU.js +67 -9
  384. package/es/translations/locales/en_CA.js +67 -9
  385. package/es/translations/locales/en_CY.js +67 -9
  386. package/es/translations/locales/en_GB.js +67 -9
  387. package/es/translations/locales/en_NZ.js +1 -0
  388. package/es/translations/locales/en_SE.js +1 -0
  389. package/es/translations/locales/en_US.js +1 -0
  390. package/es/translations/locales/es.js +67 -9
  391. package/es/translations/locales/es_ES.js +67 -9
  392. package/es/translations/locales/es_GT.js +1 -0
  393. package/es/translations/locales/fa_IR.js +7 -0
  394. package/es/translations/locales/fi.js +67 -9
  395. package/es/translations/locales/fr.js +67 -9
  396. package/es/translations/locales/fr_CA.js +68 -10
  397. package/es/translations/locales/ga.js +5 -13
  398. package/es/translations/locales/he.js +7 -0
  399. package/es/translations/locales/hi.js +67 -9
  400. package/es/translations/locales/ht.js +67 -9
  401. package/es/translations/locales/hu.js +7 -6
  402. package/es/translations/locales/hu_HU.js +1 -0
  403. package/es/translations/locales/hy.js +1 -0
  404. package/es/translations/locales/id.js +67 -9
  405. package/es/translations/locales/id_ID.js +1 -0
  406. package/es/translations/locales/is.js +67 -9
  407. package/es/translations/locales/it.js +67 -9
  408. package/es/translations/locales/ja.js +67 -9
  409. package/es/translations/locales/ko.js +1 -0
  410. package/es/translations/locales/ko_KR.js +1 -0
  411. package/es/translations/locales/lt.js +1 -0
  412. package/es/translations/locales/lt_LT.js +1 -0
  413. package/es/translations/locales/mi.js +67 -9
  414. package/es/translations/locales/mn_MN.js +1 -0
  415. package/es/translations/locales/ms.js +67 -9
  416. package/es/translations/locales/nb-x-k12.js +67 -9
  417. package/es/translations/locales/nb.js +67 -9
  418. package/es/translations/locales/nl.js +67 -9
  419. package/es/translations/locales/nl_NL.js +1 -0
  420. package/es/translations/locales/nn.js +7 -6
  421. package/es/translations/locales/pl.js +67 -9
  422. package/es/translations/locales/pt.js +67 -9
  423. package/es/translations/locales/pt_BR.js +67 -9
  424. package/es/translations/locales/ro.js +1 -0
  425. package/es/translations/locales/ru.js +67 -9
  426. package/es/translations/locales/se.js +1 -0
  427. package/es/translations/locales/sl.js +67 -9
  428. package/es/translations/locales/sv-x-k12.js +67 -9
  429. package/es/translations/locales/sv.js +67 -9
  430. package/es/translations/locales/sv_SE.js +1 -0
  431. package/es/translations/locales/tg.js +1 -0
  432. package/es/translations/locales/th.js +67 -9
  433. package/es/translations/locales/th_TH.js +1 -0
  434. package/es/translations/locales/tl_PH.js +1 -0
  435. package/es/translations/locales/tr.js +7 -0
  436. package/es/translations/locales/uk_UA.js +7 -0
  437. package/es/translations/locales/vi.js +67 -9
  438. package/es/translations/locales/vi_VN.js +1 -0
  439. package/es/translations/locales/zh-Hans.js +67 -9
  440. package/es/translations/locales/zh-Hant.js +67 -9
  441. package/es/translations/locales/zh.js +67 -9
  442. package/es/translations/locales/zh_HK.js +67 -9
  443. package/es/translations/locales/zh_TW.Big5.js +1 -0
  444. package/es/translations/locales/zh_TW.js +1 -0
  445. package/es/translations/tinymce/ar_SA.js +1 -0
  446. package/es/translations/tinymce/fi.js +1 -0
  447. package/es/translations/tinymce/ga.js +1 -0
  448. package/es/translations/tinymce/id.js +1 -0
  449. package/es/translations/tinymce/ru.js +1 -0
  450. package/es/translations/tinymce/ru_RU.js +1 -0
  451. package/es/translations/tinymce/sl.js +1 -0
  452. package/es/translations/tinymce/sr.js +1 -0
  453. package/es/translations/tinymce/th.js +1 -0
  454. package/es/translations/tinymce/uk_UA.js +1 -0
  455. package/es/translations/tinymce/vi_VN.js +1 -0
  456. package/es/util/TypedDict.js +4 -2
  457. package/es/util/encrypted-storage.js +3 -13
  458. package/es/util/file-url-util.js +1 -6
  459. package/es/util/fullscreenHelpers.js +4 -1
  460. package/es/util/instui-icon-helper.js +4 -3
  461. package/es/util/loadingPlaceholder.js +38 -39
  462. package/es/util/simpleCache.js +0 -3
  463. package/es/util/string-util.js +1 -1
  464. package/es/util/textarea-editing-util.js +3 -7
  465. package/es/util/tinymce-plugin-util.js +0 -5
  466. package/es/util/url-util.js +16 -25
  467. package/eslint.config.js +239 -0
  468. package/jest.config.js +1 -1
  469. package/package.json +77 -82
  470. package/scripts/build-canvas +2 -1
  471. package/scripts/build.js +4 -4
  472. package/scripts/publish_to_npm.sh +1 -1
  473. package/testcafe/RCEWrapper.test.js +0 -1
  474. package/testcafe/StatusBar.test.js +0 -1
  475. package/testcafe/axe.test.js +3 -4
  476. package/testcafe/enhanceUserContent.test.js +0 -1
  477. package/tsconfig.json +20 -15
  478. package/.eslintrc +0 -45
  479. package/.prettierignore +0 -6
  480. package/es/common/components/FileTree/File.js +0 -64
  481. package/es/common/components/FileTree/Folder.js +0 -110
  482. package/es/common/components/FileTree/index.js +0 -84
  483. package/es/common/components/FileTree/styles.js +0 -72
  484. package/es/common/components/Loading.js +0 -83
@@ -15,6 +15,7 @@
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 React, { Suspense } from 'react';
19
20
  import { Spinner } from '@instructure/ui-spinner';
20
21
  import formatMessage from '../../../format-message';
@@ -27,19 +28,18 @@ const thePanels = {
27
28
  media: /*#__PURE__*/React.lazy(() => import('../instructure_record/MediaPanel')),
28
29
  all: /*#__PURE__*/React.lazy(() => import('./RceFileBrowser')),
29
30
  unknown: /*#__PURE__*/React.lazy(() => import('./UnknownFileTypePanel'))
30
- }; // Returns a Suspense wrapped lazy loaded component
31
- // pulled from useLazy's cache
31
+ };
32
32
 
33
+ // Returns a Suspense wrapped lazy loaded component
34
+ // pulled from useLazy's cache
33
35
  export function DynamicPanel(props) {
34
36
  let key = '';
35
-
36
37
  if (props.contentType === 'links') {
37
38
  key = 'links';
38
39
  } else {
39
40
  key = props.contentSubtype in thePanels ? props.contentSubtype : 'unknown';
40
- } // @ts-expect-error
41
-
42
-
41
+ }
42
+ // @ts-expect-error
43
43
  const Component = thePanels[key];
44
44
  return /*#__PURE__*/React.createElement(Suspense, {
45
45
  fallback: /*#__PURE__*/React.createElement(Spinner, {
@@ -164,14 +164,11 @@ export const FILTER_SETTINGS_BY_PLUGIN = {
164
164
  };
165
165
  export function isLoading(sprops) {
166
166
  var _sprops$collections$a, _sprops$collections$a2, _sprops$collections$d, _sprops$collections$m, _sprops$collections$q, _sprops$collections$w, _sprops$documents$cou, _sprops$documents$use, _sprops$documents$gro, _sprops$media$course, _sprops$media$user, _sprops$media$group, _sprops$all_files;
167
-
168
167
  return ((_sprops$collections$a = sprops.collections.announcements) === null || _sprops$collections$a === void 0 ? void 0 : _sprops$collections$a.isLoading) || ((_sprops$collections$a2 = sprops.collections.assignments) === null || _sprops$collections$a2 === void 0 ? void 0 : _sprops$collections$a2.isLoading) || ((_sprops$collections$d = sprops.collections.discussions) === null || _sprops$collections$d === void 0 ? void 0 : _sprops$collections$d.isLoading) || ((_sprops$collections$m = sprops.collections.modules) === null || _sprops$collections$m === void 0 ? void 0 : _sprops$collections$m.isLoading) || ((_sprops$collections$q = sprops.collections.quizzes) === null || _sprops$collections$q === void 0 ? void 0 : _sprops$collections$q.isLoading) || ((_sprops$collections$w = sprops.collections.wikiPages) === null || _sprops$collections$w === void 0 ? void 0 : _sprops$collections$w.isLoading) || ((_sprops$documents$cou = sprops.documents.course) === null || _sprops$documents$cou === void 0 ? void 0 : _sprops$documents$cou.isLoading) || ((_sprops$documents$use = sprops.documents.user) === null || _sprops$documents$use === void 0 ? void 0 : _sprops$documents$use.isLoading) || ((_sprops$documents$gro = sprops.documents.group) === null || _sprops$documents$gro === void 0 ? void 0 : _sprops$documents$gro.isLoading) || ((_sprops$media$course = sprops.media.course) === null || _sprops$media$course === void 0 ? void 0 : _sprops$media$course.isLoading) || ((_sprops$media$user = sprops.media.user) === null || _sprops$media$user === void 0 ? void 0 : _sprops$media$user.isLoading) || ((_sprops$media$group = sprops.media.group) === null || _sprops$media$group === void 0 ? void 0 : _sprops$media$group.isLoading) || ((_sprops$all_files = sprops.all_files) === null || _sprops$all_files === void 0 ? void 0 : _sprops$all_files.isLoading);
169
168
  }
170
-
171
169
  function renderLoading() {
172
170
  return formatMessage('Loading');
173
171
  }
174
-
175
172
  export const UploadCanvasPanelIds = ['user_documents', 'course_documents', 'group_documents', 'user_images', 'course_images', 'group_images', 'user_media', 'course_media', 'group_media', 'course_links', 'group_links', 'list_icon_maker_icons', 'all'];
176
173
  export const CanvasPanelTitles = {
177
174
  user_documents: formatMessage('User Documents'),
@@ -15,19 +15,16 @@
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
  const DEFAULT_TARGET_QUALITY = 0.75;
19
20
  export const MAX_IMAGE_SIZE_BYTES = 500 * 1024;
20
-
21
21
  function blobToBase64(blob) {
22
22
  return new Promise(resolve => {
23
23
  const reader = new FileReader();
24
-
25
24
  reader.onloadend = () => resolve(reader.result);
26
-
27
25
  reader.readAsDataURL(blob);
28
26
  });
29
27
  }
30
-
31
28
  function drawImageOnCanvasElement(_ref) {
32
29
  let {
33
30
  image,
@@ -42,7 +39,6 @@ function drawImageOnCanvasElement(_ref) {
42
39
  height
43
40
  } = image;
44
41
  let compressedImageWidth, compressedImageHeight;
45
-
46
42
  if (width > previewWidth || height > previewHeight) {
47
43
  if (width > height) {
48
44
  compressedImageWidth = previewWidth;
@@ -54,7 +50,6 @@ function drawImageOnCanvasElement(_ref) {
54
50
  compressedImageWidth = compressedImageHeight = previewHeight;
55
51
  }
56
52
  }
57
-
58
53
  const canvas = document.createElement('canvas');
59
54
  canvas.width = compressedImageWidth;
60
55
  canvas.height = compressedImageHeight;
@@ -62,7 +57,6 @@ function drawImageOnCanvasElement(_ref) {
62
57
  ctx.drawImage(image, 0, 0, compressedImageWidth, compressedImageHeight);
63
58
  canvas.toBlob(blob => blob ? resolve(blob) : reject(blob), 'image/jpeg', quality);
64
59
  }
65
-
66
60
  export function canCompressImage() {
67
61
  // Some old browsers don't support toBlob
68
62
  return Boolean(document.createElement('canvas').toBlob);
@@ -83,7 +77,6 @@ export function compressImage(_ref3) {
83
77
  return new Promise((resolve, reject) => {
84
78
  const image = new Image();
85
79
  image.src = encodedImage;
86
-
87
80
  image.onload = function () {
88
81
  drawImageOnCanvasElement({
89
82
  image,
@@ -15,12 +15,12 @@
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 moment from 'moment-timezone';
19
20
  export const applyTimezoneOffsetToDate = (date, targetTimezone) => {
20
21
  if (!targetTimezone) {
21
22
  return moment(date).toDate();
22
23
  }
23
-
24
24
  const currentTimezoneOffset = moment(date).utcOffset();
25
25
  const expectedTimezoneOffset = moment.tz(date, targetTimezone).utcOffset();
26
26
  const totalOffset = expectedTimezoneOffset - currentTimezoneOffset;
@@ -15,12 +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 getCookie from './get-cookie';
19
- const csrfToken = getCookie('_csrf_token'); // these are duplicated in application_helper.rb#prefetch_xhr
20
+ const csrfToken = getCookie('_csrf_token');
21
+
22
+ // these are duplicated in application_helper.rb#prefetch_xhr
20
23
  // because we don't have a good pattern for sharing them yet.
21
24
  // If you change these defaults, you should probably cascade that change
22
25
  // to that ruby location
23
-
24
26
  export const defaultFetchOptions = () => ({
25
27
  credentials: 'same-origin',
26
28
  headers: {
@@ -1,5 +1,3 @@
1
- // @ts-nocheck
2
-
3
1
  /*
4
2
  * Copyright (C) 2019 - present Instructure, Inc.
5
3
  *
@@ -17,10 +15,11 @@
17
15
  * You should have received a copy of the GNU Affero General Public License along
18
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
17
  */
18
+
19
+ // @ts-expect-error
20
20
  import parseLinkHeader from './parse-link-header';
21
21
  import { defaultFetchOptions } from './defaultFetchOptions';
22
22
  import { toQueryString } from './query-string-encoding';
23
-
24
23
  function constructRelativeUrl(_ref) {
25
24
  let {
26
25
  path,
@@ -29,8 +28,9 @@ function constructRelativeUrl(_ref) {
29
28
  const queryString = toQueryString(params);
30
29
  if (queryString.length === 0) return path;
31
30
  return path + '?' + queryString;
32
- } // https://fetch.spec.whatwg.org/#requestinit
31
+ }
33
32
 
33
+ // https://fetch.spec.whatwg.org/#requestinit
34
34
 
35
35
  // NOTE: we do NOT deep-merge customFetchOptions.headers, they should be passed
36
36
  // in the headers arg instead.
@@ -43,14 +43,13 @@ export default async function doFetchApi(_ref2) {
43
43
  body,
44
44
  fetchOpts = {}
45
45
  } = _ref2;
46
- const finalFetchOptions = { ...defaultFetchOptions()
46
+ const finalFetchOptions = {
47
+ ...defaultFetchOptions()
47
48
  };
48
-
49
49
  if (body && typeof body !== 'string') {
50
50
  body = JSON.stringify(body);
51
51
  finalFetchOptions.headers['Content-Type'] = 'application/json';
52
52
  }
53
-
54
53
  Object.assign(finalFetchOptions.headers, headers);
55
54
  Object.assign(finalFetchOptions, fetchOpts);
56
55
  const url = constructRelativeUrl({
@@ -61,18 +60,16 @@ export default async function doFetchApi(_ref2) {
61
60
  body,
62
61
  method,
63
62
  ...finalFetchOptions,
63
+ // eslint-disable-next-line no-undef
64
64
  credentials: finalFetchOptions.credentials
65
65
  });
66
-
67
66
  if (!response.ok) {
68
67
  const err = new Error(`doFetchApi received a bad response: ${response.status} ${response.statusText}`);
69
68
  Object.assign(err, {
70
69
  response
71
70
  }); // in case anyone wants to check it for something
72
-
73
71
  throw err;
74
72
  }
75
-
76
73
  const linkHeader = response.headers.get('Link');
77
74
  const link = linkHeader && parseLinkHeader(linkHeader) || undefined;
78
75
  const text = await response.text();
@@ -15,6 +15,7 @@
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 doFetchApi from './doFetchApi';
19
20
  export * from './get-cookie';
20
21
  export * from './parse-link-header';
@@ -15,29 +15,26 @@
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
  // based on https://github.com/thlorenz/parse-link-header/blob/master/index.js (MIT)
20
+
19
21
  function parseQueryParams(linkUrl) {
20
22
  const queryParams = {};
21
23
  const urlParts = linkUrl.split('?');
22
-
23
24
  if (urlParts.length > 1) {
24
25
  urlParts[1].split('&').forEach(param => {
25
26
  const [key, value] = param.split('=');
26
27
  queryParams[key] = decodeURIComponent(value);
27
28
  });
28
29
  }
29
-
30
30
  return queryParams;
31
31
  }
32
-
33
32
  function parseLink(link) {
34
33
  try {
35
34
  const linkMatch = link.match(/<([^>]*)>\s*(.*)/);
36
-
37
35
  if (!linkMatch) {
38
36
  return null;
39
37
  }
40
-
41
38
  const [, linkUrl, partsString] = linkMatch;
42
39
  const parts = partsString.split(';').map(part => part.trim());
43
40
  const info = {
@@ -45,46 +42,40 @@ function parseLink(link) {
45
42
  };
46
43
  parts.forEach(part => {
47
44
  const partMatch = part.match(/(.+)\s*=\s*"?([^"]+)"?/);
48
-
49
45
  if (partMatch) {
50
46
  const [, key, value] = partMatch;
51
47
  info[key.trim()] = value.trim();
52
48
  }
53
49
  });
54
- return { ...parseQueryParams(linkUrl),
50
+ return {
51
+ ...parseQueryParams(linkUrl),
55
52
  ...info
56
53
  };
57
54
  } catch (e) {
58
55
  return null;
59
56
  }
60
57
  }
61
-
62
58
  function hasRel(x) {
63
59
  return x !== null && 'rel' in x;
64
60
  }
65
-
66
61
  function intoRels(acc, x) {
67
62
  x.rel.split(/\s+/).forEach(rel => {
68
- const { ...rest
63
+ const {
64
+ ...rest
69
65
  } = x;
70
-
71
66
  switch (rel) {
72
67
  case 'first':
73
68
  acc.first = rest;
74
69
  break;
75
-
76
70
  case 'prev':
77
71
  acc.prev = rest;
78
72
  break;
79
-
80
73
  case 'current':
81
74
  acc.current = rest;
82
75
  break;
83
-
84
76
  case 'next':
85
77
  acc.next = rest;
86
78
  break;
87
-
88
79
  case 'last':
89
80
  acc.last = rest;
90
81
  break;
@@ -92,13 +83,10 @@ function intoRels(acc, x) {
92
83
  });
93
84
  return acc;
94
85
  }
95
-
96
86
  const PARSE_LINK_HEADER_MAXLEN = 2000;
97
87
  const PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED = process.env.PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED != null;
98
-
99
88
  function checkHeader(linkHeader) {
100
89
  if (!linkHeader) return false;
101
-
102
90
  if (linkHeader.length > PARSE_LINK_HEADER_MAXLEN) {
103
91
  if (PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED) {
104
92
  throw new Error(`Input string too long, it should be under ${PARSE_LINK_HEADER_MAXLEN} characters.`);
@@ -106,10 +94,8 @@ function checkHeader(linkHeader) {
106
94
  return false;
107
95
  }
108
96
  }
109
-
110
97
  return true;
111
98
  }
112
-
113
99
  export default function parseLinkHeader(linkHeader) {
114
100
  if (!checkHeader(linkHeader)) return null;
115
101
  return linkHeader.split(/,\s*(?=<)/).map(parseLink).filter(hasRel).reduce(intoRels, {});
@@ -15,19 +15,22 @@
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
  // toQueryString does what jQuery's .param() does, only without having to bring in
19
20
  // all of jQuery.
21
+
20
22
  // URLSearchParams turns arrays into queries like a=1,2,3
21
23
  // But our jQuery makes the older "PHP" style like a[]=1&a[]=2&a[]=3
22
24
  // JQuery also magically deals with parameters that are functions, and recursive
23
25
  // objects within objects, {a: 1, b: {c: 2, d: 3}, e: 4} => a=1&b[c]=2&b[d]=3&e=4
24
26
  // ... so we have to do a lot of massaging with the params object before using it
25
27
  // So fun!
28
+
26
29
  export function toQueryString(params) {
27
- const paramsWithIndexes = []; // fix up the array/object indexes to match the PHP standard
30
+ const paramsWithIndexes = [];
28
31
 
32
+ // fix up the array/object indexes to match the PHP standard
29
33
  const fixIndexes = elt => [elt[0].replace(/\[\d+\]$/, '[]').replace(/{/g, '[').replace(/}/g, ']'), elt[1]];
30
-
31
34
  function serialize(k, elt, suffix) {
32
35
  if (elt instanceof Function) {
33
36
  paramsWithIndexes.push([k + suffix, elt()]);
@@ -45,7 +48,6 @@ export function toQueryString(params) {
45
48
  paramsWithIndexes.push([k + suffix, elt]);
46
49
  }
47
50
  }
48
-
49
51
  Object.keys(params).forEach(k => serialize(k, params[k], ''));
50
52
  return new URLSearchParams(paramsWithIndexes.map(fixIndexes)).toString();
51
53
  }
@@ -31,10 +31,12 @@ export const fileShape = {
31
31
  locked_for_user: bool,
32
32
  published: bool
33
33
  };
34
- export const imageShape = { ...fileShape,
34
+ export const imageShape = {
35
+ ...fileShape,
35
36
  thumbnail_url: string
36
37
  };
37
- export const mediaObjectShape = { ...imageShape,
38
+ export const mediaObjectShape = {
39
+ ...imageShape,
38
40
  title: string.isRequired,
39
41
  embedded_iframe_url: string,
40
42
  media_entry_id: string
@@ -76,32 +78,26 @@ export const mediaQueryReturnShape = {
76
78
  isLoading: bool,
77
79
  error: string
78
80
  };
79
-
80
81
  function createContentTrayDocumentShape(isRequired) {
81
82
  return function validateContentTrayDocuments(props, propName, componentName) {
82
83
  const p = props[propName];
83
-
84
84
  if (!p) {
85
85
  if (isRequired) {
86
86
  if (!p) {
87
87
  return new Error(`Required prop \`${propName}\` not supplied to \`${componentName}\`. Validation failed.`);
88
88
  }
89
89
  }
90
-
91
90
  return undefined;
92
91
  } else {
93
92
  const files = p.user || p.course || p.group || p.User || p.Course || p.Group;
94
-
95
93
  if (!files) {
96
94
  return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. Missing "user"|"course"|"group" key.`);
97
95
  }
98
-
99
96
  if ('searchString' in p) {
100
97
  if (!(typeof p.searchString === 'string')) {
101
98
  return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. "searchString" must be a string.`);
102
99
  }
103
100
  }
104
-
105
101
  if (propName === 'documents') {
106
102
  checkPropTypes({
107
103
  docs: shape(documentQueryReturnShape)
@@ -124,6 +120,5 @@ function createContentTrayDocumentShape(isRequired) {
124
120
  }
125
121
  };
126
122
  }
127
-
128
123
  export const contentTrayDocumentShape = createContentTrayDocumentShape(false);
129
124
  contentTrayDocumentShape.isRequired = createContentTrayDocumentShape(true);
@@ -15,7 +15,7 @@
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
- import { format, parse } from 'url';
18
+
19
19
  import { absoluteToRelativeUrl } from '../../../common/fileUrl';
20
20
  import { IconAudioLine, IconDocumentLine, IconMsExcelLine, IconMsPptLine, IconMsWordLine, IconPdfLine, IconVideoLine } from '@instructure/ui-icons';
21
21
  import RCEGlobals from '../../RCEGlobals';
@@ -25,26 +25,21 @@ export function getIconFromType(type) {
25
25
  } else if (isAudio(type)) {
26
26
  return IconAudioLine;
27
27
  }
28
-
29
28
  switch (type) {
30
29
  case 'application/msword':
31
30
  case 'application/vnd.apple.pages':
32
31
  case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
33
32
  return IconMsWordLine;
34
-
35
33
  case 'application/vnd.ms-powerpoint':
36
34
  case 'application/vnd.apple.keynote':
37
35
  case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
38
36
  return IconMsPptLine;
39
-
40
37
  case 'application/pdf':
41
38
  return IconPdfLine;
42
-
43
39
  case 'application/vnd.ms-excel':
44
40
  case 'application/vnd.apple.numbers':
45
41
  case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
46
42
  return IconMsExcelLine;
47
-
48
43
  default:
49
44
  return IconDocumentLine;
50
45
  }
@@ -70,72 +65,67 @@ export function isIWork(filename) {
70
65
  export function getIWorkType(filename) {
71
66
  const tokens = filename.split('.');
72
67
  if (tokens.length <= 1) return '';
73
- const lastToken = tokens[tokens.length - 1];
74
-
75
- switch (lastToken.toLowerCase()) {
68
+ const lastToken = tokens[tokens.length - 1].toLowerCase();
69
+ switch (lastToken) {
76
70
  case 'pages':
77
71
  return 'application/vnd.apple.pages';
78
-
79
72
  case 'key':
80
73
  return 'application/vnd.apple.keynote';
81
-
82
74
  case 'numbers':
83
75
  return 'application/vnd.apple.numbers';
84
-
85
76
  default:
86
77
  return '';
87
78
  }
88
79
  }
89
80
  export function mediaPlayerURLFromFile(file, canvasOrigin) {
90
81
  var _RCEGlobals$getFeatur;
91
-
92
82
  // why oh why aren't we consistent?
93
83
  const content_type = file['content-type'] || file.content_type || file.type;
84
+ if (typeof content_type !== 'string') throw new Error('Invalid content type');
94
85
  const type = content_type.replace(/\/.*$/, '');
95
-
86
+ const baseOrigin = canvasOrigin !== null && canvasOrigin !== void 0 ? canvasOrigin : window.location.origin;
96
87
  if ((_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur !== void 0 && _RCEGlobals$getFeatur.media_links_use_attachment_id && isAudioOrVideo(content_type) && file.id) {
97
88
  var _RCEGlobals$getFeatur2;
98
-
99
- const url = parse(`/media_attachments_iframe/${file.id}`, true);
100
- url.query.type = type;
101
- url.query.embedded = true;
102
-
103
- if (file.uuid && (file.contextType == 'User' || !!canvasOrigin && canvasOrigin !== window.location.origin && (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.file_verifiers_for_quiz_links)) {
104
- url.query.verifier = file.uuid;
89
+ const url = new URL(`/media_attachments_iframe/${file.id}`, baseOrigin);
90
+ url.searchParams.set('type', type);
91
+ url.searchParams.set('embedded', 'true');
92
+ if (file.uuid && (file.contextType === 'User' || canvasOrigin && canvasOrigin !== window.location.origin && (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.file_verifiers_for_quiz_links)) {
93
+ url.searchParams.set('verifier', file.uuid);
105
94
  } else if (file.url || file.href) {
106
- const parsed_url = parse(file.url || file.href, true);
107
-
108
- if (parsed_url.query.verifier) {
109
- url.query.verifier = parsed_url.query.verifier;
95
+ const href = file.url || file.href;
96
+ if (typeof href !== 'string') {
97
+ throw new Error('Invalid URL');
98
+ }
99
+ const parsedUrl = new URL(href, baseOrigin);
100
+ const verifier = parsedUrl.searchParams.get('verifier');
101
+ if (verifier) {
102
+ url.searchParams.set('verifier', verifier);
110
103
  }
111
104
  }
112
-
113
- return format(url);
105
+ return url.toString().replace(baseOrigin, '');
114
106
  }
115
-
116
107
  if (file.embedded_iframe_url) {
117
- const url = new URL(file.embedded_iframe_url, canvasOrigin);
118
-
119
- if (url.searchParams.has('type')) {
120
- return `${absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin)}`;
108
+ const embedUrl = new URL(file.embedded_iframe_url, baseOrigin);
109
+ if (embedUrl.searchParams.has('type')) {
110
+ return absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin);
121
111
  }
122
-
123
- return `${absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin)}?type=${type}`;
112
+ const relative = absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin);
113
+ return `${relative}?type=${type}`;
124
114
  }
125
-
126
115
  if (isAudioOrVideo(content_type)) {
127
116
  var _file$embed;
128
-
129
117
  const mediaEntryId = file.media_entry_id || ((_file$embed = file.embed) === null || _file$embed === void 0 ? void 0 : _file$embed.id) || file.mediaEntryId;
130
-
131
118
  if (mediaEntryId && mediaEntryId !== 'maybe') {
132
119
  return `/media_objects_iframe/${mediaEntryId}?type=${type}`;
133
120
  }
134
-
135
- const parsed_url = parse(file.url || file.href, true);
136
- const verifier = parsed_url.query.verifier ? `&verifier=${parsed_url.query.verifier}` : '';
137
- return `/media_objects_iframe?mediahref=${parsed_url.pathname}${verifier}&type=${type}`;
121
+ const href = file.url || file.href;
122
+ if (typeof href !== 'string') {
123
+ throw new Error('Invalid URL');
124
+ }
125
+ const parsedUrl = new URL(href, baseOrigin);
126
+ const verifier = parsedUrl.searchParams.get('verifier');
127
+ const verifierParam = verifier ? `&verifier=${verifier}` : '';
128
+ return `/media_objects_iframe?mediahref=${parsedUrl.pathname}${verifierParam}&type=${type}`;
138
129
  }
139
-
140
130
  return undefined;
141
131
  }
@@ -15,11 +15,10 @@
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
  export const convertFileToBase64 = blob => new Promise((resolve, reject) => {
19
20
  const reader = new FileReader();
20
21
  reader.readAsDataURL(blob);
21
-
22
22
  reader.onload = () => resolve(reader.result);
23
-
24
23
  reader.onerror = error => reject(error);
25
24
  });
@@ -15,6 +15,7 @@
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 React from 'react';
19
20
  import { SVGIcon } from '@instructure/ui-svg-images';
20
21
  import { IconAssignmentLine, IconDiscussionLine, IconModuleLine, IconQuizLine, IconQuizSolid as IconNewQuiz, IconAnnouncementLine, IconDocumentLine } from '@instructure/ui-icons';
@@ -31,28 +32,20 @@ export const getIcon = type => {
31
32
  switch (type) {
32
33
  case 'assignments':
33
34
  return IconAssignmentLine;
34
-
35
35
  case 'discussions':
36
36
  return IconDiscussionLine;
37
-
38
37
  case 'modules':
39
38
  return IconModuleLine;
40
-
41
39
  case 'quizzes':
42
40
  return IconQuizLine;
43
-
44
41
  case 'quizzes.next':
45
42
  return IconNewQuiz;
46
-
47
43
  case 'announcements':
48
44
  return IconAnnouncementLine;
49
-
50
45
  case 'wikiPages':
51
46
  return IconDocumentLine;
52
-
53
47
  case 'navigation':
54
48
  return IconBlank;
55
-
56
49
  default:
57
50
  return IconDocumentLine;
58
51
  }
@@ -61,28 +54,20 @@ export const getFriendlyLinkType = type => {
61
54
  switch (type) {
62
55
  case 'assignments':
63
56
  return formatMessage('Assignment');
64
-
65
57
  case 'discussions':
66
58
  return formatMessage('Discussion');
67
-
68
59
  case 'modules':
69
60
  return formatMessage('Module');
70
-
71
61
  case 'quizzes':
72
62
  return formatMessage('Quiz');
73
-
74
63
  case 'quizzes.next':
75
64
  return formatMessage('New Quiz');
76
-
77
65
  case 'announcements':
78
66
  return formatMessage('Announcement');
79
-
80
67
  case 'wikiPages':
81
68
  return formatMessage('Page');
82
-
83
69
  case 'navigation':
84
70
  return formatMessage('Navigation');
85
-
86
71
  default:
87
72
  return '';
88
73
  }
@@ -15,6 +15,7 @@
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
  export default function round(number) {
19
20
  let decimalDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
20
21
  if (decimalDigits < 0) throw new Error('decimal digits must be >= 0');
@@ -15,17 +15,18 @@
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
  const MASQUERADE_SELECTOR = 'body.is-masquerading-or-student-view';
19
- let trayHeight = null; // Adjusts the height that slide-out trays should take up based on the presence
20
+ let trayHeight = null;
21
+
22
+ // Adjusts the height that slide-out trays should take up based on the presence
20
23
  // or absence of the masquerade bottom bar. Caches the result of this check
21
24
  // forever, since we always reload the bundle when you enter/leave masquerade.
22
-
23
25
  export const getTrayHeight = () => {
24
26
  if (!trayHeight) {
25
27
  const masqueradeBar = document.querySelector(MASQUERADE_SELECTOR);
26
28
  trayHeight = masqueradeBar ? 'calc(100vh - 50px)' : '100vh';
27
29
  }
28
-
29
30
  return trayHeight;
30
31
  };
31
32
  export const isExternalUrl = url => {