@instructure/canvas-rce 5.14.1 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +8 -56
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +7 -28
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +104 -59
  25. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +15 -8
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +17 -28
  36. package/es/enhance-user-content/enhance_user_content.js +28 -60
  37. package/es/enhance-user-content/external_links.js +5 -8
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +12 -34
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +35 -82
  42. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  43. package/es/format-message.js +3 -4
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.js +3 -1
  47. package/es/rce/AlertMessageArea.js +1 -1
  48. package/es/rce/DraggingBlocker.js +4 -2
  49. package/es/rce/KeyboardShortcutModal.js +1 -0
  50. package/es/rce/RCE.js +12 -11
  51. package/es/rce/RCEGlobals.js +12 -10
  52. package/es/rce/RCEVariants.js +27 -10
  53. package/es/rce/RCEWrapper.js +167 -386
  54. package/es/rce/RCEWrapperProps.js +8 -3
  55. package/es/rce/RceHtmlEditor.js +5 -8
  56. package/es/rce/ResizeHandle.js +3 -8
  57. package/es/rce/RestoreAutoSaveModal.js +1 -2
  58. package/es/rce/ShowOnFocusButton/index.js +0 -6
  59. package/es/rce/StatusBar.js +8 -37
  60. package/es/rce/alertHandler.js +1 -4
  61. package/es/rce/contentInsertion.js +35 -57
  62. package/es/rce/contentInsertionUtils.js +6 -8
  63. package/es/rce/contentRendering.js +7 -12
  64. package/es/rce/customEvents.js +1 -0
  65. package/es/rce/editorLanguage.js +22 -10
  66. package/es/rce/indicatorRegion.js +6 -5
  67. package/es/rce/normalizeLocale.js +5 -3
  68. package/es/rce/normalizeProps.js +3 -1
  69. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  70. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  71. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  73. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  74. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  75. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  76. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  82. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  83. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  84. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  85. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  86. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  92. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  94. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  95. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  96. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  97. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  98. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  99. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  100. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  101. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  102. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  103. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  126. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  127. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  128. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  129. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  130. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  131. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  132. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  134. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  135. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  136. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  137. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  138. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  139. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  140. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  141. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  143. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  144. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  146. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  147. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  148. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  149. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  150. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  152. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  153. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  154. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  155. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  158. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  159. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  163. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  164. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  165. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  166. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  167. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  168. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  169. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  170. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  171. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  172. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  173. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  174. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  175. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  176. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  181. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  183. package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
  184. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  185. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  186. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  187. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  188. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  197. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  199. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  201. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  202. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  204. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  205. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  206. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  207. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  208. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  210. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  211. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  212. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  213. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  214. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  215. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  216. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  217. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  218. package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
  219. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  220. package/es/rce/plugins/shared/ColorInput.js +5 -14
  221. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  222. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  223. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  224. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  225. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  226. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  227. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  228. package/es/rce/plugins/shared/EventUtils.js +1 -3
  229. package/es/rce/plugins/shared/Filter.js +8 -38
  230. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  231. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  232. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  233. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  234. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  235. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  236. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  237. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  238. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  239. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  240. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  241. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  242. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  243. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  244. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  245. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  247. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  249. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  250. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  252. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  253. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  254. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  255. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  256. package/es/rce/plugins/shared/Previewable.js +1 -0
  257. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  258. package/es/rce/plugins/shared/StoreContext.js +1 -2
  259. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  260. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  261. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  262. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  263. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  264. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  265. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  266. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  267. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  268. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  269. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  270. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  271. package/es/rce/plugins/shared/Upload/index.js +1 -0
  272. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  273. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  274. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  276. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  277. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  278. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  279. package/es/rce/plugins/shared/dateUtils.js +1 -1
  280. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  281. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  282. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  283. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  284. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  285. package/es/rce/plugins/shared/fileShape.js +4 -9
  286. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  287. package/es/rce/plugins/shared/fileUtils.js +1 -2
  288. package/es/rce/plugins/shared/linkUtils.js +1 -16
  289. package/es/rce/plugins/shared/round.js +1 -0
  290. package/es/rce/plugins/shared/trayUtils.js +4 -3
  291. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  292. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  293. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  294. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  295. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  296. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  297. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  299. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  300. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  314. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  320. package/es/rce/root.js +9 -8
  321. package/es/rce/sanitizePlugins.js +1 -3
  322. package/es/rce/style.js +1 -4
  323. package/es/rce/tinyRCE.js +13 -9
  324. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  325. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  326. package/es/rce/transformContent.js +8 -10
  327. package/es/rce/types.js +1 -0
  328. package/es/rce/userOS.js +1 -1
  329. package/es/rce/wrapInitCb.js +50 -43
  330. package/es/rcs/api.js +61 -116
  331. package/es/rcs/buildError.js +5 -17
  332. package/es/rcs/fake.js +4 -13
  333. package/es/sidebar/actions/all_files.js +2 -0
  334. package/es/sidebar/actions/data.js +4 -7
  335. package/es/sidebar/actions/documents.js +9 -6
  336. package/es/sidebar/actions/files.js +3 -6
  337. package/es/sidebar/actions/filter.js +1 -0
  338. package/es/sidebar/actions/flickr.js +1 -1
  339. package/es/sidebar/actions/images.js +12 -11
  340. package/es/sidebar/actions/links.js +1 -0
  341. package/es/sidebar/actions/media.js +12 -10
  342. package/es/sidebar/actions/session.js +1 -3
  343. package/es/sidebar/actions/ui.js +1 -0
  344. package/es/sidebar/actions/upload.js +14 -39
  345. package/es/sidebar/containers/Sidebar.js +1 -2
  346. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  347. package/es/sidebar/dragHtml.js +5 -3
  348. package/es/sidebar/reducers/all_files.js +4 -3
  349. package/es/sidebar/reducers/collection.js +12 -13
  350. package/es/sidebar/reducers/collections.js +5 -5
  351. package/es/sidebar/reducers/documents.js +6 -13
  352. package/es/sidebar/reducers/files.js +3 -3
  353. package/es/sidebar/reducers/filter.js +1 -8
  354. package/es/sidebar/reducers/flickr.js +9 -9
  355. package/es/sidebar/reducers/folder.js +15 -15
  356. package/es/sidebar/reducers/folders.js +3 -3
  357. package/es/sidebar/reducers/images.js +3 -13
  358. package/es/sidebar/reducers/index.js +3 -1
  359. package/es/sidebar/reducers/media.js +6 -13
  360. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  361. package/es/sidebar/reducers/noop.js +1 -0
  362. package/es/sidebar/reducers/rootFolderId.js +1 -2
  363. package/es/sidebar/reducers/session.js +3 -3
  364. package/es/sidebar/reducers/ui.js +3 -16
  365. package/es/sidebar/reducers/upload.js +8 -40
  366. package/es/sidebar/store/configureStore.js +1 -0
  367. package/es/sidebar/store/initialState.js +13 -24
  368. package/es/translations/locales/ab.js +1 -0
  369. package/es/translations/locales/ar.js +67 -9
  370. package/es/translations/locales/ca.js +67 -9
  371. package/es/translations/locales/cs.js +1 -0
  372. package/es/translations/locales/cs_CZ.js +1 -0
  373. package/es/translations/locales/cy.js +67 -9
  374. package/es/translations/locales/da-x-k12.js +67 -9
  375. package/es/translations/locales/da.js +67 -9
  376. package/es/translations/locales/da_DK.js +1 -0
  377. package/es/translations/locales/de.js +67 -9
  378. package/es/translations/locales/el.js +4 -0
  379. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  380. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  381. package/es/translations/locales/en.js +72 -8
  382. package/es/translations/locales/en_AU.js +67 -9
  383. package/es/translations/locales/en_CA.js +67 -9
  384. package/es/translations/locales/en_CY.js +67 -9
  385. package/es/translations/locales/en_GB.js +67 -9
  386. package/es/translations/locales/en_NZ.js +1 -0
  387. package/es/translations/locales/en_SE.js +1 -0
  388. package/es/translations/locales/en_US.js +1 -0
  389. package/es/translations/locales/es.js +67 -9
  390. package/es/translations/locales/es_ES.js +67 -9
  391. package/es/translations/locales/es_GT.js +1 -0
  392. package/es/translations/locales/fa_IR.js +7 -0
  393. package/es/translations/locales/fi.js +67 -9
  394. package/es/translations/locales/fr.js +67 -9
  395. package/es/translations/locales/fr_CA.js +68 -10
  396. package/es/translations/locales/ga.js +5 -13
  397. package/es/translations/locales/he.js +7 -0
  398. package/es/translations/locales/hi.js +67 -9
  399. package/es/translations/locales/ht.js +67 -9
  400. package/es/translations/locales/hu.js +7 -6
  401. package/es/translations/locales/hu_HU.js +1 -0
  402. package/es/translations/locales/hy.js +1 -0
  403. package/es/translations/locales/id.js +67 -9
  404. package/es/translations/locales/id_ID.js +1 -0
  405. package/es/translations/locales/is.js +67 -9
  406. package/es/translations/locales/it.js +67 -9
  407. package/es/translations/locales/ja.js +67 -9
  408. package/es/translations/locales/ko.js +1 -0
  409. package/es/translations/locales/ko_KR.js +1 -0
  410. package/es/translations/locales/lt.js +1 -0
  411. package/es/translations/locales/lt_LT.js +1 -0
  412. package/es/translations/locales/mi.js +67 -9
  413. package/es/translations/locales/mn_MN.js +1 -0
  414. package/es/translations/locales/ms.js +67 -9
  415. package/es/translations/locales/nb-x-k12.js +67 -9
  416. package/es/translations/locales/nb.js +67 -9
  417. package/es/translations/locales/nl.js +67 -9
  418. package/es/translations/locales/nl_NL.js +1 -0
  419. package/es/translations/locales/nn.js +7 -6
  420. package/es/translations/locales/pl.js +67 -9
  421. package/es/translations/locales/pt.js +67 -9
  422. package/es/translations/locales/pt_BR.js +67 -9
  423. package/es/translations/locales/ro.js +1 -0
  424. package/es/translations/locales/ru.js +67 -9
  425. package/es/translations/locales/se.js +1 -0
  426. package/es/translations/locales/sl.js +67 -9
  427. package/es/translations/locales/sv-x-k12.js +67 -9
  428. package/es/translations/locales/sv.js +67 -9
  429. package/es/translations/locales/sv_SE.js +1 -0
  430. package/es/translations/locales/tg.js +1 -0
  431. package/es/translations/locales/th.js +67 -9
  432. package/es/translations/locales/th_TH.js +1 -0
  433. package/es/translations/locales/tl_PH.js +1 -0
  434. package/es/translations/locales/tr.js +7 -0
  435. package/es/translations/locales/uk_UA.js +7 -0
  436. package/es/translations/locales/vi.js +67 -9
  437. package/es/translations/locales/vi_VN.js +1 -0
  438. package/es/translations/locales/zh-Hans.js +67 -9
  439. package/es/translations/locales/zh-Hant.js +67 -9
  440. package/es/translations/locales/zh.js +67 -9
  441. package/es/translations/locales/zh_HK.js +67 -9
  442. package/es/translations/locales/zh_TW.Big5.js +1 -0
  443. package/es/translations/locales/zh_TW.js +1 -0
  444. package/es/translations/tinymce/ar_SA.js +1 -0
  445. package/es/translations/tinymce/fi.js +1 -0
  446. package/es/translations/tinymce/ga.js +1 -0
  447. package/es/translations/tinymce/id.js +1 -0
  448. package/es/translations/tinymce/ru.js +1 -0
  449. package/es/translations/tinymce/ru_RU.js +1 -0
  450. package/es/translations/tinymce/sl.js +1 -0
  451. package/es/translations/tinymce/sr.js +1 -0
  452. package/es/translations/tinymce/th.js +1 -0
  453. package/es/translations/tinymce/uk_UA.js +1 -0
  454. package/es/translations/tinymce/vi_VN.js +1 -0
  455. package/es/util/TypedDict.js +4 -2
  456. package/es/util/encrypted-storage.js +3 -13
  457. package/es/util/file-url-util.js +1 -6
  458. package/es/util/fullscreenHelpers.js +4 -1
  459. package/es/util/instui-icon-helper.js +4 -3
  460. package/es/util/loadingPlaceholder.js +38 -39
  461. package/es/util/simpleCache.js +0 -3
  462. package/es/util/string-util.js +1 -1
  463. package/es/util/textarea-editing-util.js +3 -7
  464. package/es/util/tinymce-plugin-util.js +0 -5
  465. package/es/util/url-util.js +16 -25
  466. package/eslint.config.js +239 -0
  467. package/jest.config.js +1 -1
  468. package/package.json +76 -81
  469. package/scripts/build-canvas +2 -1
  470. package/scripts/build.js +4 -4
  471. package/testcafe/RCEWrapper.test.js +0 -1
  472. package/testcafe/StatusBar.test.js +0 -1
  473. package/testcafe/axe.test.js +3 -4
  474. package/testcafe/enhanceUserContent.test.js +0 -1
  475. package/tsconfig.json +20 -15
  476. package/.eslintrc +0 -45
  477. package/.prettierignore +0 -6
  478. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  479. package/es/rce/__mocks__/styleMock.js +0 -18
  480. package/es/rce/__mocks__/tinymceReact.js +0 -55
  481. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -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) 2019 - present Instructure, Inc.
2
+ * Copyright (C) 2020 - present Instructure, Inc.
3
3
  *
4
4
  * This file is part of Canvas.
5
5
  *
@@ -15,10 +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
- const screenfull = {
19
- on() {},
20
18
 
21
- off() {}
19
+ import {allFilesLoading} from '../../../src/sidebar/reducers/all_files'
20
+ import * as actions from '../../../src/sidebar/actions/all_files'
22
21
 
23
- };
24
- export default screenfull;
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
+
18
19
  import K5Uploader from '@instructure/k5uploader';
19
20
  import { fileEmbed } from '../common/mimeClass';
20
- /* eslint no-console: 0 */
21
21
 
22
+ /* eslint no-console: 0 */
22
23
  export default class Bridge {
23
24
  constructor() {
24
25
  this.insertLink = link => {
25
26
  if (this.focusedEditor) {
26
27
  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
39
  (_this$controller = this.controller(this.focusedEditor.id)) === null || _this$controller === void 0 ? void 0 : _this$controller.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,32 @@ 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
80
  var _this$controller2;
91
-
92
81
  this.focusedEditor.insertVideo(video);
93
82
  (_this$controller2 = this.controller(this.focusedEditor.id)) === null || _this$controller2 === void 0 ? void 0 : _this$controller2.hideTray();
94
83
  }
95
84
  };
96
-
97
85
  this.insertAudio = audio => {
98
86
  if (this.focusedEditor) {
99
87
  var _this$controller3;
100
-
101
88
  this.focusedEditor.insertAudio(audio);
102
89
  (_this$controller3 = this.controller(this.focusedEditor.id)) === null || _this$controller3 === void 0 ? void 0 : _this$controller3.hideTray();
103
90
  }
104
91
  };
105
-
106
92
  this.focusedEditor = null; // the RCEWrapper, not tinymce
107
-
108
93
  this.resolveEditorRendered = null;
109
94
  this._editorRendered = new Promise(resolve => {
110
95
  this.resolveEditorRendered = resolve;
@@ -115,146 +100,116 @@ export default class Bridge {
115
100
  this._uploadMediaTranslations = null;
116
101
  this._canvasOrigin = '';
117
102
  }
118
-
119
103
  get editorRendered() {
120
104
  return this._editorRendered;
121
105
  }
122
-
123
106
  controller(editorId) {
124
107
  return this._controller[editorId];
125
108
  }
126
-
127
109
  activeEditor() {
128
110
  return this.focusedEditor;
129
111
  }
130
-
131
112
  focusEditor(editor) {
132
113
  if (this.focusedEditor !== editor) {
133
114
  this.hideTrays();
134
115
  }
135
-
136
116
  this.focusedEditor = editor;
137
117
  }
138
-
139
118
  blurEditor(editor) {
140
119
  if (this.focusedEditor === editor) {
141
120
  this.hideTrays();
142
121
  this.focusedEditor = null;
143
122
  }
144
123
  }
145
-
146
124
  focusActiveEditor() {
147
125
  var _this$focusedEditor, _this$focusedEditor$m, _this$focusedEditor$m2;
148
-
149
126
  let skipFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
150
127
  (_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);
151
128
  }
152
-
153
129
  get mediaServerSession() {
154
130
  return this._mediaServerSession;
155
131
  }
156
-
157
132
  get mediaServerUploader() {
158
133
  return this._mediaServerUploader;
159
134
  }
160
-
161
135
  setMediaServerSession(session) {
162
136
  this._mediaServerSession = session;
163
-
164
137
  if (this._mediaServerUploader) {
165
138
  this._mediaServerUploader.destroy();
166
-
167
139
  this._mediaServerUploader = null;
168
140
  }
169
-
170
141
  this._mediaServerUploader = new K5Uploader(session);
171
142
  }
172
-
173
143
  get canvasOrigin() {
174
144
  return this._canvasOrigin;
175
145
  }
176
-
177
146
  set canvasOrigin(origin) {
178
147
  this._canvasOrigin = origin;
179
- } // we have to defer importing mediaTranslations until they are asked for
148
+ }
149
+
150
+ // we have to defer importing mediaTranslations until they are asked for
180
151
  // or they get imported before the locale has been setup and all the strings
181
152
  // are in English
182
-
183
-
184
153
  get uploadMediaTranslations() {
185
154
  if (!this._uploadMediaTranslations) {
186
155
  const module = require('../rce/plugins/instructure_record/mediaTranslations');
187
-
188
156
  this._uploadMediaTranslations = module.default;
189
157
  }
190
-
191
158
  return this._uploadMediaTranslations;
192
159
  }
193
-
194
160
  detachEditor(editor) {
195
161
  if (editor === this.focusedEditor) {
196
162
  this.focusedEditor = null;
197
163
  }
198
164
  }
199
-
200
165
  getEditor() {
201
166
  return this.focusedEditor;
202
167
  }
203
-
204
168
  renderEditor(editor) {
205
169
  this.resolveEditorRendered();
206
-
207
170
  if (this.focusedEditor === null) {
208
171
  this.focusEditor(editor);
209
172
  }
210
173
  }
211
-
212
174
  attachController(controller, editorId) {
213
175
  this._controller[editorId] = controller;
214
176
  }
215
-
216
177
  detachController(editorId) {
217
178
  delete this._controller[editorId];
218
179
  }
219
-
220
180
  showTrayForPlugin(plugin, editorId) {
221
181
  var _this$_controller$edi;
222
-
223
182
  (_this$_controller$edi = this._controller[editorId]) === null || _this$_controller$edi === void 0 ? void 0 : _this$_controller$edi.showTrayForPlugin(plugin);
224
183
  }
225
-
226
184
  hideTrays() {
227
185
  Object.keys(this._controller).forEach(eid => {
228
186
  this._controller[eid].hideTray(true);
229
187
  });
230
188
  }
231
-
232
189
  existingContentToLink() {
233
190
  if (this.focusedEditor) {
234
191
  return this.focusedEditor.existingContentToLink();
235
192
  }
236
-
237
193
  return false;
238
194
  }
239
-
240
195
  existingContentToLinkIsImg() {
241
196
  if (this.focusedEditor) {
242
197
  return this.focusedEditor.existingContentToLinkIsImg();
243
198
  }
244
-
245
199
  return false;
246
200
  }
247
201
 
202
+ // insertFileLink is called from the FileBrowser when All files is chosen
203
+ // vs the above insertLink which is called from the other CanvasContentTray panels.
204
+
248
205
  insertImage(image) {
249
206
  if (this.focusedEditor) {
250
207
  var _this$controller4;
251
-
252
208
  const result = this.focusedEditor.insertImage(image);
253
209
  (_this$controller4 = this.controller(this.focusedEditor.id)) === null || _this$controller4 === void 0 ? void 0 : _this$controller4.hideTray();
254
210
  return result;
255
211
  }
256
212
  }
257
-
258
213
  insertImagePlaceholder(fileMetaProps) {
259
214
  if (this.focusedEditor) {
260
215
  // don't insert a placeholder if the user has selected content, because in some cases the selected
@@ -264,13 +219,11 @@ export default class Bridge {
264
219
  }
265
220
  }
266
221
  }
267
-
268
222
  removePlaceholders(name) {
269
223
  if (this.focusedEditor) {
270
224
  this.focusedEditor.removePlaceholders(name);
271
225
  }
272
226
  }
273
-
274
227
  showError(err) {
275
228
  if (this.focusedEditor) {
276
229
  this.focusedEditor.addAlert({
@@ -279,5 +232,4 @@ export default class Bridge {
279
232
  });
280
233
  }
281
234
  }
282
-
283
235
  }
@@ -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();