@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,45 +15,44 @@
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, { useState, useCallback, useEffect } from 'react';
19
20
  import { debounce } from '@instructure/debounce';
20
21
  export default function useDebouncedValue(currentValue, onChange, processValueCallback) {
21
- const [immediateValue, setImmediateValue] = useState(currentValue); // Only invokes onChange on the trailing edge of the timeout
22
+ const [immediateValue, setImmediateValue] = useState(currentValue);
22
23
 
24
+ // Only invokes onChange on the trailing edge of the timeout
23
25
  const debouncedOnChangeCallback = useCallback(debounce(val => onChange(val), 500, {
24
26
  trailing: true
25
27
  }), []);
26
28
  useEffect(() => {
27
29
  let newValue = currentValue;
28
-
29
30
  if (processValueCallback) {
30
31
  newValue = processValueCallback(immediateValue, newValue);
31
- } // If so we need to make sure to re-set the immediate value
32
- // once a truthy value is given
33
-
32
+ }
34
33
 
34
+ // If so we need to make sure to re-set the immediate value
35
+ // once a truthy value is given
35
36
  if (newValue !== immediateValue) {
36
37
  setImmediateValue(newValue);
37
- } // eslint-disable-next-line react-hooks/exhaustive-deps
38
-
38
+ }
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39
40
  }, [currentValue]);
40
41
  useEffect(() => {
41
42
  // Debounce the call to set reducer's state
42
- debouncedOnChangeCallback(immediateValue); // eslint-disable-next-line react-hooks/exhaustive-deps
43
+ debouncedOnChangeCallback(immediateValue);
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
43
45
  }, [immediateValue]);
44
-
45
46
  const handleValueChange = event => {
46
47
  let {
47
48
  value
48
49
  } = event.target;
49
-
50
50
  if (processValueCallback) {
51
51
  value = processValueCallback(value);
52
- } // Immediately set local state for low-latency feedback
53
-
52
+ }
54
53
 
54
+ // Immediately set local state for low-latency feedback
55
55
  setImmediateValue(value);
56
56
  };
57
-
58
57
  return [immediateValue, handleValueChange];
59
58
  }
@@ -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 formatMessage from '../../../format-message';
19
20
  import { scaleForHeight, scaleForWidth } from '../shared/DimensionUtils';
20
21
  import RCEGlobals from '../../RCEGlobals';
@@ -35,7 +36,6 @@ const sizeByMaximumDimension = {
35
36
  400: LARGE,
36
37
  640: EXTRA_LARGE
37
38
  };
38
-
39
39
  function parsedOrNull($element, attribute) {
40
40
  // when the image is first inserted into the rce, it's size
41
41
  // is constrained by a style attribute with max-width, max-height.
@@ -44,23 +44,19 @@ function parsedOrNull($element, attribute) {
44
44
  const value = $element.hasAttribute(attribute) ? $element.getAttribute(attribute) : $element[attribute];
45
45
  return value ? Math.round(Number.parseInt(value, 10)) : null;
46
46
  }
47
-
48
47
  function imageSizeFromKnownOptions(imageOptions) {
49
48
  const intendedWidth = imageOptions.appliedWidth || imageOptions.naturalWidth;
50
49
  const intendedHeight = imageOptions.appliedHeight || imageOptions.naturalHeight;
51
50
  const largestDimension = Math.max(intendedWidth, intendedHeight);
52
51
  return sizeByMaximumDimension[largestDimension] || CUSTOM;
53
52
  }
54
-
55
53
  function getPercentageUnitsFromAttributes($element) {
56
54
  const getAttribute = attribute => $element.hasAttribute(attribute) ? $element.getAttribute(attribute) : $element[attribute];
57
-
58
55
  const widthValue = getAttribute('width');
59
56
  const heightValue = getAttribute('height');
60
57
  const value = [widthValue, heightValue].find(v => /\d+(?:\.\d+)?%/.test(v));
61
58
  return value ? Math.round(Number.parseInt(value, 10)) : null;
62
59
  }
63
-
64
60
  export function fromImageEmbed($element) {
65
61
  const altText = $element.getAttribute('alt');
66
62
  const percentageUnits = getPercentageUnitsFromAttributes($element);
@@ -86,13 +82,10 @@ export function fromVideoEmbed($element) {
86
82
  let naturalWidth, naturalHeight;
87
83
  const $videoIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
88
84
  const $tinymceIframeShim = $videoIframe.parentElement;
89
-
90
85
  if ($videoIframe.tagName === 'IFRAME') {
91
86
  $videoDoc = $videoIframe.contentDocument;
92
-
93
87
  if ($videoDoc) {
94
88
  $videoElem = $videoDoc.querySelector('video');
95
-
96
89
  if ($videoElem && ($videoElem.loadedmetadata || $videoElem.readyState >= 1)) {
97
90
  naturalWidth = $videoElem.videoWidth;
98
91
  naturalHeight = $videoElem.videoHeight;
@@ -101,10 +94,10 @@ export function fromVideoEmbed($element) {
101
94
  naturalHeight = $videoIframe.clientHeight;
102
95
  naturalWidth = $videoIframe.clientWidth;
103
96
  }
104
- } // because tinymce doesn't put the title attribute on the iframe,
105
- // but maintains it on the span it adds around it.
106
-
97
+ }
107
98
 
99
+ // because tinymce doesn't put the title attribute on the iframe,
100
+ // but maintains it on the span it adds around it.
108
101
  const title = ($videoIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
109
102
  const rect = $element.getBoundingClientRect();
110
103
  const videoOptions = {
@@ -115,29 +108,22 @@ export function fromVideoEmbed($element) {
115
108
  naturalWidth,
116
109
  source: $videoElem && $videoElem.querySelector('source')
117
110
  };
118
-
119
111
  try {
120
- var _$videoDoc$querySelec;
121
-
122
- const trackjson = (_$videoDoc$querySelec = $videoDoc.querySelector('[data-tracks]')) === null || _$videoDoc$querySelec === void 0 ? void 0 : _$videoDoc$querySelec.getAttribute('data-tracks');
123
-
112
+ const trackjson = $videoDoc.querySelector('[data-tracks]')?.getAttribute('data-tracks');
124
113
  if (trackjson) {
125
114
  videoOptions.tracks = JSON.parse(trackjson);
126
115
  }
127
- } catch (_ignore) {// bad json?
116
+ } catch (_ignore) {
117
+ // bad json?
128
118
  }
129
-
130
119
  videoOptions.videoSize = imageSizeFromKnownOptions(videoOptions);
131
-
132
120
  if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
133
121
  const source = $videoIframe.getAttribute('src');
134
- const matches = source === null || source === void 0 ? void 0 : source.match(/\/media_attachments_iframe\/(\d+)/);
135
-
122
+ const matches = source?.match(/\/media_attachments_iframe\/(\d+)/);
136
123
  if (matches) {
137
124
  videoOptions.attachmentId = matches[1];
138
125
  }
139
126
  }
140
-
141
127
  return videoOptions;
142
128
  }
143
129
  export function scaleImageForHeight(naturalWidth, naturalHeight, targetHeight) {
@@ -161,11 +147,7 @@ export function scaleToSize(imageSize, naturalWidth, naturalHeight) {
161
147
  height: naturalHeight
162
148
  };
163
149
  }
164
-
165
- const [dimension] = Object.entries(sizeByMaximumDimension).find(_ref => {
166
- let [, size] = _ref;
167
- return size === imageSize;
168
- });
150
+ const [dimension] = Object.entries(sizeByMaximumDimension).find(([, size]) => size === imageSize);
169
151
  const scaleFactor = dimension / Math.max(naturalWidth, naturalHeight);
170
152
  return {
171
153
  height: Math.round(naturalHeight * scaleFactor),
@@ -178,22 +160,18 @@ export function labelForImageSize(imageSize) {
178
160
  {
179
161
  return formatMessage('Small');
180
162
  }
181
-
182
163
  case MEDIUM:
183
164
  {
184
165
  return formatMessage('Medium');
185
166
  }
186
-
187
167
  case LARGE:
188
168
  {
189
169
  return formatMessage('Large');
190
170
  }
191
-
192
171
  case EXTRA_LARGE:
193
172
  {
194
173
  return formatMessage('Extra Large');
195
174
  }
196
-
197
175
  default:
198
176
  {
199
177
  return formatMessage('Custom');
@@ -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 { func, instanceOf, number, oneOfType, shape, string, bool } from 'prop-types';
20
21
  import { Img } from '@instructure/ui-img';
@@ -25,39 +26,32 @@ import { View } from '@instructure/ui-view';
25
26
  import dragHtml from '../../../../sidebar/dragHtml';
26
27
  import formatMessage from '../../../../format-message';
27
28
  import { renderImage } from '../../../contentRendering';
28
- export default function Image(_ref) {
29
- let {
30
- focusRef,
31
- image,
32
- onClick,
33
- isIconMaker,
34
- canvasOrigin
35
- } = _ref;
29
+ export default function Image({
30
+ focusRef,
31
+ image,
32
+ onClick,
33
+ isIconMaker,
34
+ canvasOrigin
35
+ }) {
36
36
  const imgTitle = formatMessage('Click to embed {imageName}', {
37
37
  imageName: image.display_name
38
38
  });
39
-
40
39
  function handleDragStart(event) {
41
40
  dragHtml(event, renderImage(image, canvasOrigin));
42
41
  }
43
-
44
42
  function handleDragEnd() {
45
43
  document.body.click();
46
44
  }
47
-
48
45
  function handleImageClick(event) {
49
46
  event.preventDefault();
50
47
  onClick(image);
51
48
  }
52
-
53
49
  let elementRef = null;
54
-
55
50
  if (focusRef) {
56
51
  elementRef = ref => {
57
52
  focusRef.current = ref;
58
53
  };
59
54
  }
60
-
61
55
  return /*#__PURE__*/React.createElement(Link, {
62
56
  draggable: false,
63
57
  elementRef: elementRef,
@@ -15,18 +15,18 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import { arrayOf, func, instanceOf, shape, bool, string } from 'prop-types';
20
21
  import { Flex } from '@instructure/ui-flex';
21
22
  import Image from './Image';
22
- export default function ImageList(_ref) {
23
- let {
24
- images,
25
- lastItemRef,
26
- onImageClick,
27
- isIconMaker,
28
- canvasOrigin
29
- } = _ref;
23
+ export default function ImageList({
24
+ images,
25
+ lastItemRef,
26
+ onImageClick,
27
+ isIconMaker,
28
+ canvasOrigin
29
+ }) {
30
30
  return /*#__PURE__*/React.createElement(Flex, {
31
31
  justifyItems: "start",
32
32
  height: "100%",
@@ -35,11 +35,9 @@ export default function ImageList(_ref) {
35
35
  wrap: "wrap"
36
36
  }, images.map((image, index) => {
37
37
  let focusRef = null;
38
-
39
38
  if (index === images.length - 1) {
40
39
  focusRef = lastItemRef;
41
40
  }
42
-
43
41
  return /*#__PURE__*/React.createElement(Flex.Item, {
44
42
  as: "div",
45
43
  key: 'image-' + image.id,
@@ -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 ReactDOM from 'react-dom';
20
21
  import bridge from '../../../../bridge';
@@ -30,63 +31,50 @@ export default class TrayController {
30
31
  this._renderId = 0;
31
32
  this._isIconMaker = false;
32
33
  }
33
-
34
34
  get $container() {
35
35
  let $container = document.getElementById(CONTAINER_ID);
36
-
37
36
  if ($container == null) {
38
37
  $container = document.createElement('div');
39
38
  $container.id = CONTAINER_ID;
40
39
  document.body.appendChild($container);
41
40
  }
42
-
43
41
  return $container;
44
42
  }
45
-
46
43
  get isOpen() {
47
44
  return this._isOpen;
48
- } // Tray may be called to edit an Icon Maker icon alt text
49
-
45
+ }
50
46
 
51
- showTrayForEditor(editor) {
52
- let isIconMaker = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
47
+ // Tray may be called to edit an Icon Maker icon alt text
48
+ showTrayForEditor(editor, isIconMaker = false) {
53
49
  this._editor = editor;
54
50
  this.$img = editor.selection.getNode();
55
51
  this._shouldOpen = true;
56
52
  this._isIconMaker = isIconMaker;
57
-
58
53
  if (bridge.focusedEditor) {
59
54
  // Dismiss any content trays that may already be open
60
55
  bridge.hideTrays();
61
56
  }
62
-
63
57
  this._renderTray();
64
58
  }
65
-
66
59
  hideTrayForEditor(editor) {
67
60
  if (this._editor === editor) {
68
61
  this._dismissTray();
69
62
  }
70
63
  }
71
-
72
64
  _applyImageOptions(imageOptions) {
73
65
  const editor = this._editor;
74
66
  const {
75
67
  $img
76
68
  } = this;
77
-
78
69
  if (this._isIconMaker) {
79
70
  this._applyIconAltTextChanges($img, editor, imageOptions);
80
-
81
71
  this._dismissTray();
82
-
83
72
  editor.focus();
84
73
  return;
85
74
  }
86
-
87
75
  if (imageOptions.displayAs === 'embed') {
88
- updateImage(editor, $img, imageOptions); // tell tinymce so the context toolbar resets
89
-
76
+ updateImage(editor, $img, imageOptions);
77
+ // tell tinymce so the context toolbar resets
90
78
  editor.fire('ObjectResized', {
91
79
  target: $img,
92
80
  width: imageOptions.appliedWidth,
@@ -100,38 +88,30 @@ export default class TrayController {
100
88
  });
101
89
  editor.selection.setContent(link);
102
90
  }
103
-
104
91
  this._dismissTray();
105
-
106
92
  editor.focus();
107
93
  }
108
-
109
94
  _applyIconAltTextChanges($img, editor, imageOptions) {
110
95
  // Workaround: When passing empty string to editor.dom.setAttribs it removes the attribute
111
96
  $img.setAttribute('alt', imageOptions.altText);
112
97
  editor.dom.setAttribs($img, {
113
98
  role: imageOptions.isDecorativeImage ? 'presentation' : null
114
- }); // tell tinymce so the context toolbar resets
99
+ });
115
100
 
101
+ // tell tinymce so the context toolbar resets
116
102
  editor.fire('ObjectResized', {
117
103
  target: $img,
118
104
  width: imageOptions.appliedWidth,
119
105
  height: imageOptions.appliedHeight
120
106
  });
121
107
  }
122
-
123
108
  _dismissTray() {
124
109
  this._shouldOpen = false;
125
-
126
110
  this._renderTray();
127
-
128
111
  this.$img = null;
129
112
  this._editor = null;
130
113
  }
131
-
132
114
  _renderTray() {
133
- var _this$_editor, _this$_editor$selecti;
134
-
135
115
  if (this._shouldOpen) {
136
116
  /*
137
117
  * When the tray is being opened again, it should be rendered fresh
@@ -140,9 +120,8 @@ export default class TrayController {
140
120
  */
141
121
  this._renderId++;
142
122
  }
143
-
144
123
  const io = asImageEmbed(this.$img);
145
- io.isLinked = ((_this$_editor = this._editor) === null || _this$_editor === void 0 ? void 0 : (_this$_editor$selecti = _this$_editor.selection) === null || _this$_editor$selecti === void 0 ? void 0 : _this$_editor$selecti.getSel().anchorNode.tagName) === 'A';
124
+ io.isLinked = this._editor?.selection?.getSel().anchorNode.tagName === 'A';
146
125
  const element = /*#__PURE__*/React.createElement(ImageOptionsTray, {
147
126
  key: this._renderId,
148
127
  imageOptions: io,
@@ -162,5 +141,4 @@ export default class TrayController {
162
141
  });
163
142
  ReactDOM.render(element, this.$container);
164
143
  }
165
-
166
144
  }
@@ -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, { useState, useEffect } from 'react';
19
20
  import { bool, func, number, shape, string } from 'prop-types';
20
21
  import { Button, CloseButton } from '@instructure/ui-buttons';
@@ -28,7 +29,7 @@ import ImageOptionsForm from '../../shared/ImageOptionsForm';
28
29
  import { getTrayHeight, isExternalUrl } from '../../shared/trayUtils';
29
30
  import validateURL from '../../instructure_links/validateURL';
30
31
  import UrlPanel from '../../shared/Upload/UrlPanel';
31
- import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
32
+ import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
32
33
  export default function ImageOptionsTray(props) {
33
34
  const {
34
35
  imageOptions,
@@ -59,26 +60,20 @@ export default function ImageOptionsTray(props) {
59
60
  minWidth: MIN_WIDTH,
60
61
  minPercentage: MIN_PERCENTAGE
61
62
  });
62
-
63
63
  function handleUrlChange(newUrl) {
64
64
  setUrl(newUrl);
65
65
  }
66
-
67
66
  function handleAltTextChange(event) {
68
67
  setAltText(event.target.value);
69
68
  }
70
-
71
69
  function handleIsDecorativeChange(event) {
72
70
  setIsDecorativeImage(event.target.checked);
73
71
  }
74
-
75
72
  function handleDisplayAsChange(event) {
76
73
  setDisplayAs(event.target.value);
77
74
  }
78
-
79
75
  function handleImageSizeChange(event, selectedOption) {
80
76
  setImageSize(selectedOption.value);
81
-
82
77
  if (selectedOption.value === CUSTOM) {
83
78
  setImageHeight(currentHeight);
84
79
  setImageWidth(currentWidth);
@@ -91,13 +86,11 @@ export default function ImageOptionsTray(props) {
91
86
  setImageWidth(width);
92
87
  }
93
88
  }
94
-
95
89
  function handleSave(event) {
96
90
  event.preventDefault();
97
91
  const savedAltText = isDecorativeImage ? '' : altText;
98
92
  let appliedHeight = imageHeight;
99
93
  let appliedWidth = imageWidth;
100
-
101
94
  if (imageSize === CUSTOM) {
102
95
  if (dimensionsState.usePercentageUnits) {
103
96
  appliedHeight = `${dimensionsState.percentage}%`;
@@ -107,7 +100,6 @@ export default function ImageOptionsTray(props) {
107
100
  appliedWidth = dimensionsState.width;
108
101
  }
109
102
  }
110
-
111
103
  onSave({
112
104
  url,
113
105
  altText: savedAltText,
@@ -117,26 +109,22 @@ export default function ImageOptionsTray(props) {
117
109
  isDecorativeImage
118
110
  });
119
111
  }
120
-
121
112
  useEffect(() => {
122
113
  if (isIconMaker) {
123
114
  setShowUrlField(false);
124
115
  return;
125
116
  }
126
-
127
117
  let isValidURL;
128
-
129
118
  try {
130
119
  isValidURL = validateURL(url);
131
120
  } catch (error) {
132
121
  isValidURL = false;
133
122
  } finally {
134
123
  setShowUrlField(isValidURL ? isExternalUrl(url) : true);
135
- } // eslint-disable-next-line react-hooks/exhaustive-deps
136
-
124
+ }
125
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
126
  }, [url]);
138
127
  const messagesForSize = [];
139
-
140
128
  if (imageSize !== CUSTOM) {
141
129
  messagesForSize.push({
142
130
  text: formatMessage('{width} x {height}px', {
@@ -146,16 +134,15 @@ export default function ImageOptionsTray(props) {
146
134
  type: 'hint'
147
135
  });
148
136
  }
149
-
150
137
  const disableForIcons = isIconMaker && !isDecorativeImage && altText === '';
151
- const disableForImages = url === '' || displayAs === 'embed' && (!isDecorativeImage && altText === '' || imageSize === CUSTOM && !(dimensionsState !== null && dimensionsState !== void 0 && dimensionsState.isValid));
138
+ const disableForImages = url === '' || displayAs === 'embed' && (!isDecorativeImage && altText === '' || imageSize === CUSTOM && !dimensionsState?.isValid);
152
139
  const saveDisabled = isIconMaker ? disableForIcons : disableForImages;
153
140
  const trayLabel = isIconMaker ? formatMessage('Icon Options Tray') : formatMessage('Image Options Tray');
154
141
  const trayHeading = isIconMaker ? formatMessage('Icon Options') : formatMessage('Image Options');
155
142
  return /*#__PURE__*/React.createElement(Tray, {
156
143
  "data-mce-component": true,
157
144
  label: trayLabel,
158
- mountNode: instuiPopupMountNode,
145
+ mountNode: instuiPopupMountNodeFn,
159
146
  onDismiss: onRequestClose,
160
147
  onEntered: onEntered,
161
148
  onExited: onExited,
@@ -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, { useRef } from 'react';
19
20
  import { bool, func, oneOf, shape, string } from 'prop-types';
20
21
  import { contentTrayDocumentShape } from '../../shared/fileShape';
@@ -24,15 +25,12 @@ import { Text } from '@instructure/ui-text';
24
25
  import { LoadMoreButton, LoadingIndicator, LoadingStatus, useIncrementalLoading } from '../../../../common/incremental-loading';
25
26
  import ImageList from '../ImageList';
26
27
  import formatMessage from '../../../../format-message';
27
-
28
28
  function hasFiles(images) {
29
29
  return images.files.length > 0;
30
30
  }
31
-
32
31
  function isEmpty(images) {
33
32
  return !hasFiles(images) && !images.hasMore && !images.isLoading;
34
33
  }
35
-
36
34
  export default function Images(props) {
37
35
  const {
38
36
  fetchInitialImages,
@@ -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 doFileUpload from '../shared/Upload/doFileUpload';
19
20
  export default function (ed, document) {
20
21
  return doFileUpload(ed, document, {