@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
@@ -15,18 +15,17 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React, { createContext, useContext, useState } from 'react';
19
20
  import { connect, Provider as ReduxProvider } from 'react-redux';
20
21
  import bridge from '../../../bridge';
21
22
  import sidebarHandlers from '../../../sidebar/containers/sidebarHandlers';
22
23
  import { propsFromState } from '../../../sidebar/containers/Sidebar';
23
24
  import configureStore from '../../../sidebar/store/configureStore';
24
-
25
- function Consumer(_ref) {
26
- let {
27
- children,
28
- ...props
29
- } = _ref;
25
+ function Consumer({
26
+ children,
27
+ ...props
28
+ }) {
30
29
  return children({
31
30
  onLinkClick: bridge.insertLink,
32
31
  onImageEmbed: bridge.embedImage,
@@ -35,14 +34,12 @@ function Consumer(_ref) {
35
34
  ...props
36
35
  });
37
36
  }
38
-
39
37
  export const StoreConsumer = connect(propsFromState, sidebarHandlers)(Consumer);
40
38
  const StoreContext = /*#__PURE__*/createContext();
41
- export function StoreProvider(_ref2) {
42
- let {
43
- children,
44
- ...storeProps
45
- } = _ref2;
39
+ export function StoreProvider({
40
+ children,
41
+ ...storeProps
42
+ }) {
46
43
  const [store] = useState(() => configureStore(storeProps));
47
44
  return /*#__PURE__*/React.createElement(ReduxProvider, {
48
45
  store: store
@@ -15,7 +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 PropTypes, { bool, shape } from 'prop-types';
20
+
21
+ /**
22
+ * Interface for content item's 'custom' field, specifically for what is expected to come from Studio
23
+ *
24
+ * Used to determine whether or not Studio embedded media should be resizable, and whether or not we
25
+ * present controls for the user to modify the embedded media.
26
+ */
27
+
19
28
  export const parsedStudioOptionsPropType = shape({
20
29
  resizable: bool.isRequired,
21
30
  convertibleToLink: bool.isRequired
@@ -25,7 +34,6 @@ export function isStudioContentItemCustomJson(input) {
25
34
  }
26
35
  export function studioAttributesFrom(customJson) {
27
36
  var _customJson$resizable, _customJson$enableMed;
28
-
29
37
  return {
30
38
  'data-studio-resizable': (_customJson$resizable = customJson.resizable) !== null && _customJson$resizable !== void 0 ? _customJson$resizable : false,
31
39
  'data-studio-tray-enabled': (_customJson$enableMed = customJson.enableMediaOptions) !== null && _customJson$enableMed !== void 0 ? _customJson$enableMed : false,
@@ -37,34 +45,29 @@ export function displayStyleFrom(studioAttributes) {
37
45
  return studioAttributes['data-studio-resizable'] || studioAttributes['data-studio-tray-enabled'] ? 'inline-block' : '';
38
46
  }
39
47
  export function isStudioEmbeddedMedia(element) {
40
- var _tinymceIframeShim$fi;
41
-
42
48
  // Borrowing this structure from isMediaElement in ContentSelection.js
43
- const tinymceIframeShim = (element === null || element === void 0 ? void 0 : element.tagName) === 'IFRAME' ? element === null || element === void 0 ? void 0 : element.parentElement : element;
44
-
45
- if ((tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : (_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
49
+ const tinymceIframeShim = element?.tagName === 'IFRAME' ? element?.parentElement : element;
50
+ if (tinymceIframeShim?.firstElementChild?.tagName !== 'IFRAME') {
46
51
  return false;
47
52
  }
48
-
49
53
  return tinymceIframeShim.getAttribute('data-mce-p-data-studio-tray-enabled') === 'true';
50
54
  }
51
55
  export function parseStudioOptions(element) {
52
- const tinymceIframeShim = (element === null || element === void 0 ? void 0 : element.tagName) === 'IFRAME' ? element === null || element === void 0 ? void 0 : element.parentElement : element;
56
+ const tinymceIframeShim = element?.tagName === 'IFRAME' ? element?.parentElement : element;
53
57
  return {
54
- resizable: (tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : tinymceIframeShim.getAttribute('data-mce-p-data-studio-resizable')) === 'true',
55
- convertibleToLink: (tinymceIframeShim === null || tinymceIframeShim === void 0 ? void 0 : tinymceIframeShim.getAttribute('data-mce-p-data-studio-convertible-to-link')) === 'true'
58
+ resizable: tinymceIframeShim?.getAttribute('data-mce-p-data-studio-resizable') === 'true',
59
+ convertibleToLink: tinymceIframeShim?.getAttribute('data-mce-p-data-studio-convertible-to-link') === 'true'
56
60
  };
57
61
  }
62
+
58
63
  /**
59
64
  * Tinymce adds an overlay when you click on an iframe inside the editor. It will by default
60
65
  * add resize handles to the corners of the overlay. The code that adds these handles won't
61
66
  * if the overlay has `data-mce-resize='false'` on it. Here, we force that behavior when the
62
67
  * underlying iframe has a `data-studio-resizable='false'`
63
68
  */
64
-
65
69
  export function handleBeforeObjectSelected(e) {
66
70
  const targetElement = e.target;
67
-
68
71
  if (targetElement.getAttribute('data-mce-p-data-studio-resizable') === 'false') {
69
72
  targetElement.setAttribute('data-mce-resize', 'false');
70
73
  }
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import { View } from '@instructure/ui-view';
20
21
  import { Text } from '@instructure/ui-text';
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2024 - present Instructure, Inc.
5
4
  *
@@ -17,6 +16,7 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import React, { useState } from 'react';
21
21
  import { Flex } from '@instructure/ui-flex';
22
22
  import ErrorBoundary from '../ErrorBoundary';
@@ -25,27 +25,27 @@ import PanelFilter from './PanelFilter';
25
25
  import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel } from '../canvasContentUtils';
26
26
  import { useStoreProps } from '../StoreContext';
27
27
  // TODO: Component is only validated for images, need to validate for other content types
28
- export default function CanvasContentPanel(_ref) {
29
- let {
30
- trayProps,
31
- canvasOrigin,
32
- plugin,
33
- setFileUrl
34
- } = _ref;
28
+ export default function CanvasContentPanel({
29
+ trayProps,
30
+ canvasOrigin,
31
+ plugin,
32
+ setFileUrl
33
+ }) {
35
34
  const [filterSettings, setFilterSettings] = useFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
36
35
  const [link, setLink] = useState(null);
37
- const [hasLoaded, setHasLoaded] = useState(false); // storeProps has functions that collide with what we want to do in a block editor setting
36
+ const [hasLoaded, setHasLoaded] = useState(false);
38
37
 
38
+ // storeProps has functions that collide with what we want to do in a block editor setting
39
39
  const baseStoreProps = useStoreProps();
40
40
  const {
41
41
  onImageEmbed: _,
42
+ onMediaEmbed: _m,
42
43
  ...storeProps
43
44
  } = baseStoreProps;
44
-
45
45
  function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
46
- const newFilterSettings = { ...newFilter
46
+ const newFilterSettings = {
47
+ ...newFilter
47
48
  };
48
-
49
49
  if (newFilterSettings.sortValue) {
50
50
  newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
51
51
  onChangeSortBy({
@@ -53,50 +53,43 @@ export default function CanvasContentPanel(_ref) {
53
53
  dir: newFilterSettings.sortDir
54
54
  });
55
55
  }
56
-
57
56
  if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
58
57
  onChangeSearchString(newFilterSettings.searchString);
59
58
  }
60
-
61
59
  setFilterSettings(newFilterSettings);
62
-
63
60
  if (newFilterSettings.contentType) {
64
61
  let contextType, contextId;
65
-
66
62
  switch (newFilterSettings.contentType) {
67
63
  case 'user_files':
68
64
  contextType = 'user';
69
65
  contextId = trayProps.containingContext.userId;
70
66
  break;
71
-
72
67
  case 'group_files':
73
68
  contextType = 'group';
74
69
  contextId = trayProps.containingContext.contextId;
75
70
  break;
76
-
77
71
  case 'course_files':
78
72
  contextType = trayProps.contextType;
79
73
  contextId = trayProps.containingContext.contextId;
80
74
  break;
81
-
82
75
  case 'links':
83
76
  contextType = trayProps.containingContext.contextType;
84
77
  contextId = trayProps.containingContext.contextId;
85
78
  }
86
-
87
79
  onChangeContext({
88
80
  contextType,
89
81
  contextId
90
- }); // context is only changed on load
91
-
82
+ });
83
+ // context is only changed on load
92
84
  setHasLoaded(true);
93
85
  }
94
86
  }
95
-
96
87
  const handleImageClick = image => {
97
88
  setFileUrl(image.href);
98
89
  };
99
-
90
+ const handleMediaClick = media => {
91
+ setFileUrl(`/media_attachments_iframe/${media.id}`);
92
+ };
100
93
  return /*#__PURE__*/React.createElement(Flex, {
101
94
  as: "div",
102
95
  direction: "column",
@@ -134,7 +127,8 @@ export default function CanvasContentPanel(_ref) {
134
127
  editing: false,
135
128
  onEditClick: setLink,
136
129
  selectedLink: link,
137
- onImageEmbed: handleImageClick
130
+ onImageEmbed: handleImageClick,
131
+ onMediaEmbed: handleMediaClick
138
132
  }, storeProps)))))));
139
133
  }
140
134
  CanvasContentPanel.propTypes = {
@@ -15,13 +15,12 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import * as SvgProcessor from './SvgCategoryProcessor';
19
20
  export async function process(file) {
20
- var _file$type;
21
-
22
21
  // Determine which processor to use based on file type.
23
22
  // If no matching processor is found for the given file type, return undefined
24
- if (file !== null && file !== void 0 && (_file$type = file.type) !== null && _file$type !== void 0 && _file$type.includes(SvgProcessor.typeTest)) {
23
+ if (file?.type?.includes(SvgProcessor.typeTest)) {
25
24
  return await SvgProcessor.process(file);
26
25
  }
27
26
  }
@@ -15,10 +15,12 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  // NOTE: if you're looking in here for the ComputerPanel that's used for
19
20
  // the RCE's Media > Upload/Record Media function, it's not this one
20
21
  // (though this panel can handle video with the right "accept" prop).
21
22
  // See @instructure/canvas-media/src/ComputerPanel.js
23
+
22
24
  import React, { useCallback, useEffect, useRef, useState } from 'react';
23
25
  import { arrayOf, func, number, object, oneOfType, shape, string } from 'prop-types';
24
26
  import { StyleSheet, css } from 'aphrodite';
@@ -38,34 +40,26 @@ import { MediaPlayer } from '@instructure/ui-media-player';
38
40
  import { RocketSVG, useComputerPanelFocus, isAudio, isPreviewable, sizeMediaPlayer } from '@instructure/canvas-media';
39
41
  import formatMessage from '../../../../format-message';
40
42
  import { getIconFromType, isAudioOrVideo, isImage, isText, isIWork, getIWorkType } from '../fileTypeUtils';
41
-
42
43
  function isPreviewableAudioOrVideo(type) {
43
44
  return isPreviewable(type) && isAudioOrVideo(type);
44
45
  }
45
-
46
46
  function readFile(theFile) {
47
47
  const p = new Promise((resolve, reject) => {
48
48
  const reader = new FileReader();
49
-
50
49
  reader.onload = () => {
51
50
  let result = reader.result;
52
-
53
51
  if (isText(theFile.type) && result.length > 1000) {
54
52
  result = `${result.substr(0, 1000)}...`;
55
53
  }
56
-
57
54
  resolve(result);
58
55
  };
59
-
60
56
  reader.onerror = () => {
61
57
  reject(new Error(formatMessage('An error occured reading the file')));
62
58
  };
63
-
64
59
  if (theFile.size === 0) {
65
60
  // canvas will reject uploading an empty file
66
61
  reject(new Error(formatMessage('You may not upload an empty file.')));
67
62
  }
68
-
69
63
  if (isImage(theFile.type)) {
70
64
  reader.readAsDataURL(theFile);
71
65
  } else if (isText(theFile.type)) {
@@ -78,57 +72,50 @@ function readFile(theFile) {
78
72
  }];
79
73
  resolve(sources);
80
74
  } else {
81
- let type = theFile.type; // Native JS File API returns empty string if it can't determine the type
82
-
75
+ let type = theFile.type;
76
+ // Native JS File API returns empty string if it can't determine the type
83
77
  if (type === '' && isIWork(theFile.name)) {
84
78
  type = getIWorkType(theFile.name);
85
79
  }
86
-
87
80
  const icon = getIconFromType(type);
88
81
  resolve(icon);
89
82
  }
90
83
  });
91
84
  return p;
92
85
  }
93
-
94
- export default function ComputerPanel(_ref) {
95
- let {
96
- theFile,
97
- setFile,
98
- setError,
99
- accept,
100
- label,
101
- bounds
102
- } = _ref;
86
+ export default function ComputerPanel({
87
+ theFile,
88
+ setFile,
89
+ setError,
90
+ accept,
91
+ label,
92
+ bounds
93
+ }) {
103
94
  const [messages, setMessages] = useState([]);
104
95
  const [preview, setPreview] = useState({
105
96
  preview: null,
106
97
  isLoading: false
107
- }); // the trashcan is 38px tall and the 1.5rem margin-bottom
98
+ });
99
+ // the trashcan is 38px tall and the 1.5rem margin-bottom
108
100
  // the 350 is to guarantee the video doesn't oveflow into the copyright UI,
109
101
  // which should probably be rendered here and not up in the modal because
110
102
  // dealing with Tabs and size is nearly impossible
111
-
112
103
  const height = Math.min(350, 0.8 * (bounds.height - 38 - px('1.5rem')));
113
104
  const width = 0.8 * bounds.width;
114
105
  useEffect(() => {
115
106
  return () => {
116
- if (Array.isArray(preview === null || preview === void 0 ? void 0 : preview.preview)) {
117
- var _URL, _URL$revokeObjectURL;
118
-
119
- (_URL = URL) === null || _URL === void 0 ? void 0 : (_URL$revokeObjectURL = _URL.revokeObjectURL) === null || _URL$revokeObjectURL === void 0 ? void 0 : _URL$revokeObjectURL.call(_URL, preview.preview[0].src);
107
+ if (Array.isArray(preview?.preview)) {
108
+ URL?.revokeObjectURL?.(preview.preview[0].src);
120
109
  }
121
110
  };
122
111
  }, [preview]);
123
112
  useEffect(() => {
124
113
  if (!theFile || preview.isLoading || preview.preview || preview.error) return;
125
-
126
114
  async function getPreview() {
127
115
  setPreview({
128
116
  preview: null,
129
117
  isLoading: true
130
118
  });
131
-
132
119
  try {
133
120
  const previewer = await readFile(theFile);
134
121
  setPreview({
@@ -136,7 +123,6 @@ export default function ComputerPanel(_ref) {
136
123
  isLoading: false
137
124
  });
138
125
  setError(null);
139
-
140
126
  if (isImage(theFile.type)) {
141
127
  // we need the preview to know the image size to show the placeholder
142
128
  theFile.preview = previewer;
@@ -151,7 +137,6 @@ export default function ComputerPanel(_ref) {
151
137
  });
152
138
  }
153
139
  }
154
-
155
140
  getPreview();
156
141
  });
157
142
  const handleLoadedMetadata = useCallback(event => {
@@ -162,16 +147,15 @@ export default function ComputerPanel(_ref) {
162
147
  });
163
148
  player.style.width = sz.width;
164
149
  player.style.height = sz.height;
165
- player.style.margin = '0 auto'; // from this sub-package, I don't have a URL to use as the
150
+ player.style.margin = '0 auto';
151
+ // from this sub-package, I don't have a URL to use as the
166
152
  // audio player's poster image. We can give it a background image though
167
-
168
153
  player.classList.add(isAudio(theFile.type) ? 'audio-player' : 'video-player');
169
154
  }, [theFile, width, height]);
170
155
  const previewPanelRef = useRef(null);
171
156
  const clearButtonRef = useRef(null);
172
157
  const panelRef = useRef(null);
173
158
  useComputerPanelFocus(theFile, panelRef, clearButtonRef);
174
-
175
159
  function renderPreview() {
176
160
  if (preview.isLoading) {
177
161
  return /*#__PURE__*/React.createElement("div", {
@@ -231,7 +215,6 @@ export default function ComputerPanel(_ref) {
231
215
  }
232
216
  }
233
217
  }
234
-
235
218
  if (theFile) {
236
219
  const filename = theFile.name;
237
220
  return /*#__PURE__*/React.createElement("div", {
@@ -269,19 +252,15 @@ export default function ComputerPanel(_ref) {
269
252
  margin: "0 auto"
270
253
  }, renderPreview()));
271
254
  }
272
-
273
255
  return /*#__PURE__*/React.createElement("div", {
274
256
  ref: panelRef
275
257
  }, /*#__PURE__*/React.createElement(FileDrop, {
276
258
  "data-testid": "filedrop",
277
259
  accept: accept,
278
- onDropAccepted: _ref2 => {
279
- let [file] = _ref2;
280
-
260
+ onDropAccepted: ([file]) => {
281
261
  if (messages.length) {
282
262
  setMessages([]);
283
263
  }
284
-
285
264
  setFile(file);
286
265
  },
287
266
  onDropRejected: () => {
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2024 - present Instructure, Inc.
5
4
  *
@@ -17,6 +16,7 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import { ScreenReaderContent } from '@instructure/ui-a11y-content';
21
21
  import { IconButton } from '@instructure/ui-buttons';
22
22
  import { Flex } from '@instructure/ui-flex';
@@ -25,22 +25,20 @@ import { SimpleSelect } from '@instructure/ui-simple-select';
25
25
  import { TextInput } from '@instructure/ui-text-input';
26
26
  import formatMessage from 'format-message';
27
27
  import React, { useEffect, useState } from 'react';
28
-
29
28
  function shouldSearch(searchString) {
30
29
  return searchString.length === 0 || searchString.length >= 3;
31
30
  }
32
-
33
- export default function PanelFilter(_ref) {
34
- let {
35
- mountNode,
36
- onChange,
37
- sortValue,
38
- searchString,
39
- contentType
40
- } = _ref;
31
+ export default function PanelFilter({
32
+ mountNode,
33
+ onChange,
34
+ sortValue,
35
+ searchString,
36
+ contentType
37
+ }) {
41
38
  const [pendingSearchString, setPendingSearchString] = useState(searchString);
42
- const [searchInputTimer, setSearchInputTimer] = useState(0); // only run on mounting to trigger change to correct contextType
39
+ const [searchInputTimer, setSearchInputTimer] = useState(0);
43
40
 
41
+ // only run on mounting to trigger change to correct contextType
44
42
  useEffect(() => {
45
43
  onChange({
46
44
  contentType
@@ -53,28 +51,22 @@ export default function PanelFilter(_ref) {
53
51
  window.clearTimeout(searchInputTimer);
54
52
  setSearchInputTimer(0);
55
53
  }
56
-
57
54
  onChange({
58
55
  searchString: value
59
56
  });
60
57
  }
61
58
  }
62
-
63
59
  function handleChangeSearch(value) {
64
60
  setPendingSearchString(value);
65
-
66
61
  if (searchInputTimer) {
67
62
  window.clearTimeout(searchInputTimer);
68
63
  }
69
-
70
64
  const tid = window.setTimeout(() => doSearch(value), 250);
71
65
  setSearchInputTimer(tid);
72
66
  }
73
-
74
67
  function handleClear() {
75
68
  handleChangeSearch('');
76
69
  }
77
-
78
70
  function renderClearButton() {
79
71
  if (pendingSearchString) {
80
72
  return /*#__PURE__*/React.createElement(IconButton, {
@@ -85,10 +77,8 @@ export default function PanelFilter(_ref) {
85
77
  size: "small"
86
78
  }, /*#__PURE__*/React.createElement(IconXLine, null));
87
79
  }
88
-
89
80
  return undefined;
90
81
  }
91
-
92
82
  return /*#__PURE__*/React.createElement(Flex, {
93
83
  margin: "none xx-large none none",
94
84
  gap: "small",
@@ -15,21 +15,22 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import { ICON_MAKER_ICONS, TYPE, SVG_TYPE } from '../../instructure_icon_maker/svg/constants';
19
20
  export const typeTest = SVG_TYPE;
20
21
  const sliceSize = 400; // bytes
21
-
22
22
  const iconMakerType = TYPE;
23
23
  export async function process(file) {
24
24
  try {
25
25
  // The first slice of 400 bytes is sufficient to grab
26
26
  // the "type" metadata for icon maker SVGs
27
27
  const slice = await file.slice(0, sliceSize).text();
28
-
29
28
  if (slice.includes(iconMakerType)) {
30
29
  return {
31
30
  category: ICON_MAKER_ICONS
32
31
  };
33
32
  }
34
- } catch {}
33
+ } catch {
34
+ // intentionally empty
35
+ }
35
36
  }