@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
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2021 - present Instructure, Inc.
2
+ * Copyright (C) 2020 - present Instructure, Inc.
3
3
  *
4
4
  * This file is part of Canvas.
5
5
  *
@@ -15,12 +15,13 @@
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 * as actions from '../../../src/sidebar/actions/all_files'
18
19
 
19
- module.exports = {
20
- reporterEnabled: 'mocha-junit-reporter, spec',
21
- mochaJunitReporterReporterOptions: {
22
- mochaFile: `${process.env.TEST_RESULT_OUTPUT_DIR || './coverage'}/canvas-rce-junit.xml`,
23
- testsuitesTitle: 'Canvas RCE Mocha Tests',
24
- rootSuiteTitle: 'Canvas RCE Mocha Tests'
25
- }
26
- }
20
+ describe('all_files actions', () => {
21
+ it('alFilesLoading returns ALL_FILES_LOADING with the new value', () => {
22
+ expect(actions.allFilesLoading(true)).toEqual({
23
+ type: actions.ALL_FILES_LOADING,
24
+ payload: true,
25
+ })
26
+ })
27
+ })
@@ -0,0 +1,196 @@
1
+ /*
2
+ * Copyright (C) 2018 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import * as actions from '../../../src/sidebar/actions/data'
19
+ import RceApiSource from '../../../src/rcs/api'
20
+ import {spiedStore} from './utils'
21
+
22
+ describe('Sidebar data actions', () => {
23
+ // collection key to use in testing
24
+ const collectionKey = 'theCollection'
25
+ const searchString = 'search-string'
26
+ const uriFor = () => 'uriFor/bookmark'
27
+
28
+ // trivial "always succeeds" source
29
+ const successPage = {links: 'successLinks', bookmark: 'successBookmark'}
30
+ const successSource = {
31
+ fetchLinks(key) {
32
+ return this.fetchPage(key)
33
+ },
34
+ fetchPage(_uri) {
35
+ return new Promise(resolve => {
36
+ resolve(successPage)
37
+ })
38
+ },
39
+ uriFor,
40
+ }
41
+
42
+ // trivial "always fails" source
43
+ const brokenError = new Error('broken')
44
+ const brokenSource = {
45
+ fetchLinks(key) {
46
+ return this.fetchPage(key)
47
+ },
48
+ fetchPage(_uri) {
49
+ return new Promise(() => {
50
+ throw brokenError
51
+ })
52
+ },
53
+ uriFor,
54
+ }
55
+
56
+ // returns a "black hole" source that spies fetchLinks
57
+ function stubbedSource() {
58
+ const source = new RceApiSource()
59
+ jest.spyOn(source, 'fetchPage').mockReturnValue(new Promise(resolve => resolve(successPage)))
60
+ jest.spyOn(source, 'uriFor').mockReturnValue('uriFor/bookmark')
61
+ return source
62
+ }
63
+
64
+ // constants for testing that can be overridden in props to storeState (see
65
+ // below)
66
+ const defaultCollection = {
67
+ links: [],
68
+ bookmark: 'bookmark',
69
+ isLoading: false,
70
+ searchString,
71
+ }
72
+ const defaults = {
73
+ jwt: 'theJWT',
74
+ source: successSource,
75
+ searchString,
76
+ collections: {
77
+ [`${collectionKey}`]: defaultCollection,
78
+ },
79
+ }
80
+
81
+ // defaults and reshapes the given props into the shape needed by the store
82
+ function setupState(props = {}, collectionProps = {}) {
83
+ const retval = {...defaults, ...props}
84
+ const collection = {...defaultCollection, ...collectionProps}
85
+ retval.collections[collectionKey] = collection
86
+ return retval
87
+ }
88
+
89
+ describe('fetchPage', () => {
90
+ it('uses bookmark from store to call source.fetchPage', () => {
91
+ const source = stubbedSource()
92
+ const state = setupState({source})
93
+ const store = spiedStore(state)
94
+ store.dispatch(actions.fetchPage(collectionKey))
95
+ expect(source.fetchPage).toHaveBeenCalledWith(defaultCollection.bookmark)
96
+ })
97
+
98
+ it('dispatches receivePage with page retrieved from source', async () => {
99
+ const store = spiedStore(setupState())
100
+ await store.dispatch(actions.fetchPage(collectionKey))
101
+ const callArgs = store.spy.mock.lastCall[0]
102
+ expect(callArgs.type).toEqual(actions.RECEIVE_PAGE)
103
+ expect(callArgs.key).toEqual(collectionKey)
104
+ expect(callArgs.links).toEqual(successPage.links)
105
+ expect(callArgs.bookmark).toEqual(successPage.bookmark)
106
+ })
107
+
108
+ it('dispatches failPage on error retrieving page from source', async () => {
109
+ const store = spiedStore(setupState({source: brokenSource}))
110
+ await store.dispatch(actions.fetchPage(collectionKey))
111
+ const callArgs = store.spy.mock.lastCall[0]
112
+ expect(callArgs.type).toEqual(actions.FAIL_PAGE)
113
+ expect(callArgs.key).toEqual(collectionKey)
114
+ expect(callArgs.error).toEqual(brokenError)
115
+ })
116
+ })
117
+
118
+ describe('fetchNextPage', () => {
119
+ it('dispatches requestPage first', () => {
120
+ const store = spiedStore(setupState())
121
+ store.dispatch(actions.fetchNextPage(collectionKey))
122
+ const callArgs = store.spy.mock.calls[0][0]
123
+ expect(callArgs.type).toEqual(actions.REQUEST_PAGE)
124
+ expect(callArgs.key).toEqual(collectionKey)
125
+ })
126
+
127
+ it('fetches next page if collection has bookmark and is not loading', () => {
128
+ const store = spiedStore(setupState())
129
+ store.dispatch(actions.fetchNextPage(collectionKey))
130
+ expect(store.spy).toHaveBeenCalledWith({
131
+ type: actions.REQUEST_PAGE,
132
+ cancel: expect.any(Function),
133
+ key: collectionKey,
134
+ })
135
+ })
136
+
137
+ it('cancels previous fetch if collection is already loading', () => {
138
+ const cancel = jest.fn()
139
+ const store = spiedStore(setupState({}, {isLoading: true, cancel}))
140
+ store.dispatch(actions.fetchNextPage(collectionKey))
141
+
142
+ expect(cancel).toHaveBeenCalled()
143
+ expect(store.spy).toHaveBeenCalledWith({
144
+ type: actions.REQUEST_PAGE,
145
+ cancel: expect.any(Function),
146
+ key: collectionKey,
147
+ })
148
+ })
149
+ })
150
+
151
+ describe('fetchInitialPage', () => {
152
+ it('fetches initial page if collection is empty, has bookmark, and is not loading', () => {
153
+ const store = spiedStore(setupState())
154
+ store.dispatch(actions.fetchInitialPage(collectionKey))
155
+ expect(store.spy).toHaveBeenCalledWith({
156
+ type: actions.REQUEST_INITIAL_PAGE,
157
+ cancel: expect.any(Function),
158
+ key: collectionKey,
159
+ searchString,
160
+ })
161
+ })
162
+
163
+ it('skips fetching initial page if collection is not empty', () => {
164
+ const store = spiedStore(setupState({}, {links: [{href: 'link', title: 'A Link'}]}))
165
+ store.dispatch(actions.fetchInitialPage(collectionKey))
166
+ expect(store.spy).not.toHaveBeenCalledWith({
167
+ type: actions.REQUEST_INITIAL_PAGE,
168
+ cancel: expect.any(Function),
169
+ key: collectionKey,
170
+ searchString,
171
+ })
172
+ })
173
+
174
+ it('creates the URL if collection has no bookmark', () => {
175
+ const source = stubbedSource()
176
+ const store = spiedStore(setupState({source}, {bookmark: null}))
177
+ store.dispatch(actions.fetchInitialPage(collectionKey))
178
+ expect(source.fetchPage).toHaveBeenCalledWith('uriFor/bookmark')
179
+ })
180
+
181
+ it('cancels previous fetch if collection is already loading', () => {
182
+ const cancel = jest.fn()
183
+ const store = spiedStore(setupState({}, {isLoading: true, cancel}))
184
+ store.dispatch(actions.fetchInitialPage(collectionKey))
185
+
186
+ expect(cancel).toHaveBeenCalled()
187
+
188
+ expect(store.spy).toHaveBeenCalledWith({
189
+ type: actions.REQUEST_INITIAL_PAGE,
190
+ cancel: expect.any(Function),
191
+ key: collectionKey,
192
+ searchString,
193
+ })
194
+ })
195
+ })
196
+ })
@@ -0,0 +1,44 @@
1
+ /*
2
+ * Copyright (C) 2018 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+
19
+ import {createStore, applyMiddleware} from 'redux'
20
+ import {thunk} from 'redux-thunk'
21
+ import {batch, batching} from 'redux-batch-middleware'
22
+
23
+ // creates a reducer that just alerts a spy on each action and leaves state
24
+ // alone. the associated spy is hung off the returned reducer
25
+ export function spiedReducer() {
26
+ const spy = jest.fn()
27
+ const reducer = (state = {}, action) => {
28
+ if (!action.type.includes('@@redux/INIT')) {
29
+ spy(action)
30
+ }
31
+ return state
32
+ }
33
+ reducer.spy = spy
34
+ return reducer
35
+ }
36
+
37
+ // creates a store with the given state and with a spiedReducer; the spy from
38
+ // the reducer is also hung off the returned store
39
+ export function spiedStore(state) {
40
+ const reducer = spiedReducer()
41
+ const store = createStore(batching(reducer), state, applyMiddleware(thunk, batch))
42
+ store.spy = reducer.spy
43
+ return store
44
+ }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2024 - present Instructure, Inc.
2
+ * Copyright (C) 2020 - present Instructure, Inc.
3
3
  *
4
4
  * This file is part of Canvas.
5
5
  *
@@ -15,6 +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
- module.exports = {
19
- StudioPlayer: () => null
20
- };
18
+
19
+ import {allFilesLoading} from '../../../src/sidebar/reducers/all_files'
20
+ import * as actions from '../../../src/sidebar/actions/all_files'
21
+
22
+ describe('all_files reducer', () => {
23
+ it('sets isLoading', () => {
24
+ const state = {isLoading: false}
25
+ const newState = allFilesLoading(state, actions.allFilesLoading(true))
26
+ expect(newState.isLoading).toEqual(true)
27
+ })
28
+ })
package/babel.config.js CHANGED
@@ -37,7 +37,6 @@ module.exports = {
37
37
  },
38
38
 
39
39
  presets: [
40
- '@babel/preset-typescript',
41
40
  [
42
41
  '@babel/preset-env',
43
42
  {
@@ -63,6 +62,9 @@ module.exports = {
63
62
  extractDefaultTranslations: false,
64
63
  },
65
64
  ],
65
+ ['@babel/preset-typescript', {
66
+ allowDeclareFields: true
67
+ }],
66
68
  ],
67
69
 
68
70
  plugins: [
@@ -15,16 +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
- import K5Uploader from '@instructure/k5uploader';
18
+
19
+ import { K5Uploader } from '@instructure/k5uploader';
19
20
  import { fileEmbed } from '../common/mimeClass';
20
- /* eslint no-console: 0 */
21
+ import mediaTranslations from '../rce/plugins/instructure_record/mediaTranslations';
21
22
 
23
+ /* eslint no-console: 0 */
22
24
  export default class Bridge {
23
25
  constructor() {
24
26
  this.insertLink = link => {
25
27
  if (this.focusedEditor) {
26
- var _this$controller;
27
-
28
28
  const {
29
29
  selection
30
30
  } = this.focusedEditor.props.tinymce.get(this.focusedEditor.props.textareaId);
@@ -32,31 +32,25 @@ export default class Bridge {
32
32
  node: selection.getNode(),
33
33
  range: selection.getRng()
34
34
  };
35
-
36
35
  if (!link.text || link.text.trim().length === 0) {
37
36
  link.text = link.title || link.href;
38
37
  }
39
-
40
38
  this.focusedEditor.insertLink(link);
41
- (_this$controller = this.controller(this.focusedEditor.id)) === null || _this$controller === void 0 ? void 0 : _this$controller.hideTray();
39
+ this.controller(this.focusedEditor.id)?.hideTray();
42
40
  } else {
43
41
  console.warn('clicked sidebar link without a focused editor');
44
42
  }
45
43
  };
46
-
47
44
  this.insertFileLink = link => {
48
45
  const embedData = fileEmbed(link);
49
-
50
46
  if (embedData.type === 'image') {
51
47
  return this.insertImage(link);
52
48
  } else if (embedData.type === 'video' || embedData.type === 'audio') {
53
49
  link.embedded_iframe_url = link.embedded_iframe_url || link.href;
54
50
  return this.embedMedia(link);
55
51
  }
56
-
57
52
  return this.insertLink(link);
58
53
  };
59
-
60
54
  this.embedImage = image => {
61
55
  if (this.existingContentToLink() && !this.existingContentToLinkIsImg()) {
62
56
  this.insertLink({
@@ -70,41 +64,30 @@ export default class Bridge {
70
64
  this.insertImage(image);
71
65
  }
72
66
  };
73
-
74
67
  this.embedMedia = media => {
75
68
  const embedData = fileEmbed(media);
76
-
77
69
  if (embedData.type === 'video') {
78
70
  this.insertVideo(media);
79
71
  } else {
80
72
  this.insertAudio(media);
81
73
  }
82
74
  };
83
-
84
75
  this.insertEmbedCode = embedCode => {
85
76
  this.focusedEditor.insertEmbedCode(embedCode);
86
77
  };
87
-
88
78
  this.insertVideo = video => {
89
79
  if (this.focusedEditor) {
90
- var _this$controller2;
91
-
92
80
  this.focusedEditor.insertVideo(video);
93
- (_this$controller2 = this.controller(this.focusedEditor.id)) === null || _this$controller2 === void 0 ? void 0 : _this$controller2.hideTray();
81
+ this.controller(this.focusedEditor.id)?.hideTray();
94
82
  }
95
83
  };
96
-
97
84
  this.insertAudio = audio => {
98
85
  if (this.focusedEditor) {
99
- var _this$controller3;
100
-
101
86
  this.focusedEditor.insertAudio(audio);
102
- (_this$controller3 = this.controller(this.focusedEditor.id)) === null || _this$controller3 === void 0 ? void 0 : _this$controller3.hideTray();
87
+ this.controller(this.focusedEditor.id)?.hideTray();
103
88
  }
104
89
  };
105
-
106
90
  this.focusedEditor = null; // the RCEWrapper, not tinymce
107
-
108
91
  this.resolveEditorRendered = null;
109
92
  this._editorRendered = new Promise(resolve => {
110
93
  this.resolveEditorRendered = resolve;
@@ -115,146 +98,111 @@ export default class Bridge {
115
98
  this._uploadMediaTranslations = null;
116
99
  this._canvasOrigin = '';
117
100
  }
118
-
119
101
  get editorRendered() {
120
102
  return this._editorRendered;
121
103
  }
122
-
123
104
  controller(editorId) {
124
105
  return this._controller[editorId];
125
106
  }
126
-
127
107
  activeEditor() {
128
108
  return this.focusedEditor;
129
109
  }
130
-
131
110
  focusEditor(editor) {
132
111
  if (this.focusedEditor !== editor) {
133
112
  this.hideTrays();
134
113
  }
135
-
136
114
  this.focusedEditor = editor;
137
115
  }
138
-
139
116
  blurEditor(editor) {
140
117
  if (this.focusedEditor === editor) {
141
118
  this.hideTrays();
142
119
  this.focusedEditor = null;
143
120
  }
144
121
  }
145
-
146
- focusActiveEditor() {
147
- var _this$focusedEditor, _this$focusedEditor$m, _this$focusedEditor$m2;
148
-
149
- let skipFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
150
- (_this$focusedEditor = this.focusedEditor) === null || _this$focusedEditor === void 0 ? void 0 : (_this$focusedEditor$m = _this$focusedEditor.mceInstance) === null || _this$focusedEditor$m === void 0 ? void 0 : (_this$focusedEditor$m2 = _this$focusedEditor$m.call(_this$focusedEditor)) === null || _this$focusedEditor$m2 === void 0 ? void 0 : _this$focusedEditor$m2.focus(skipFocus);
122
+ focusActiveEditor(skipFocus = false) {
123
+ this.focusedEditor?.mceInstance?.()?.focus(skipFocus);
151
124
  }
152
-
153
125
  get mediaServerSession() {
154
126
  return this._mediaServerSession;
155
127
  }
156
-
157
128
  get mediaServerUploader() {
158
129
  return this._mediaServerUploader;
159
130
  }
160
-
161
131
  setMediaServerSession(session) {
162
132
  this._mediaServerSession = session;
163
-
164
133
  if (this._mediaServerUploader) {
165
134
  this._mediaServerUploader.destroy();
166
-
167
135
  this._mediaServerUploader = null;
168
136
  }
169
-
170
137
  this._mediaServerUploader = new K5Uploader(session);
171
138
  }
172
-
173
139
  get canvasOrigin() {
174
140
  return this._canvasOrigin;
175
141
  }
176
-
177
142
  set canvasOrigin(origin) {
178
143
  this._canvasOrigin = origin;
179
- } // we have to defer importing mediaTranslations until they are asked for
144
+ }
145
+
146
+ // we have to defer importing mediaTranslations until they are asked for
180
147
  // or they get imported before the locale has been setup and all the strings
181
148
  // are in English
182
-
183
-
184
149
  get uploadMediaTranslations() {
185
150
  if (!this._uploadMediaTranslations) {
186
- const module = require('../rce/plugins/instructure_record/mediaTranslations');
187
-
188
- this._uploadMediaTranslations = module.default;
151
+ this._uploadMediaTranslations = mediaTranslations;
189
152
  }
190
-
191
153
  return this._uploadMediaTranslations;
192
154
  }
193
-
194
155
  detachEditor(editor) {
195
156
  if (editor === this.focusedEditor) {
196
157
  this.focusedEditor = null;
197
158
  }
198
159
  }
199
-
200
160
  getEditor() {
201
161
  return this.focusedEditor;
202
162
  }
203
-
204
163
  renderEditor(editor) {
205
164
  this.resolveEditorRendered();
206
-
207
165
  if (this.focusedEditor === null) {
208
166
  this.focusEditor(editor);
209
167
  }
210
168
  }
211
-
212
169
  attachController(controller, editorId) {
213
170
  this._controller[editorId] = controller;
214
171
  }
215
-
216
172
  detachController(editorId) {
217
173
  delete this._controller[editorId];
218
174
  }
219
-
220
175
  showTrayForPlugin(plugin, editorId) {
221
- var _this$_controller$edi;
222
-
223
- (_this$_controller$edi = this._controller[editorId]) === null || _this$_controller$edi === void 0 ? void 0 : _this$_controller$edi.showTrayForPlugin(plugin);
176
+ this._controller[editorId]?.showTrayForPlugin(plugin);
224
177
  }
225
-
226
178
  hideTrays() {
227
179
  Object.keys(this._controller).forEach(eid => {
228
180
  this._controller[eid].hideTray(true);
229
181
  });
230
182
  }
231
-
232
183
  existingContentToLink() {
233
184
  if (this.focusedEditor) {
234
185
  return this.focusedEditor.existingContentToLink();
235
186
  }
236
-
237
187
  return false;
238
188
  }
239
-
240
189
  existingContentToLinkIsImg() {
241
190
  if (this.focusedEditor) {
242
191
  return this.focusedEditor.existingContentToLinkIsImg();
243
192
  }
244
-
245
193
  return false;
246
194
  }
247
195
 
196
+ // insertFileLink is called from the FileBrowser when All files is chosen
197
+ // vs the above insertLink which is called from the other CanvasContentTray panels.
198
+
248
199
  insertImage(image) {
249
200
  if (this.focusedEditor) {
250
- var _this$controller4;
251
-
252
201
  const result = this.focusedEditor.insertImage(image);
253
- (_this$controller4 = this.controller(this.focusedEditor.id)) === null || _this$controller4 === void 0 ? void 0 : _this$controller4.hideTray();
202
+ this.controller(this.focusedEditor.id)?.hideTray();
254
203
  return result;
255
204
  }
256
205
  }
257
-
258
206
  insertImagePlaceholder(fileMetaProps) {
259
207
  if (this.focusedEditor) {
260
208
  // don't insert a placeholder if the user has selected content, because in some cases the selected
@@ -264,13 +212,11 @@ export default class Bridge {
264
212
  }
265
213
  }
266
214
  }
267
-
268
215
  removePlaceholders(name) {
269
216
  if (this.focusedEditor) {
270
217
  this.focusedEditor.removePlaceholders(name);
271
218
  }
272
219
  }
273
-
274
220
  showError(err) {
275
221
  if (this.focusedEditor) {
276
222
  this.focusedEditor.addAlert({
@@ -279,5 +225,4 @@ export default class Bridge {
279
225
  });
280
226
  }
281
227
  }
282
-
283
228
  }
@@ -17,5 +17,6 @@
17
17
  */
18
18
 
19
19
  /* eslint no-console: 0 */
20
+
20
21
  import Bridge from './Bridge';
21
22
  export default new Bridge();