@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,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, { useEffect, createRef } from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import formatMessage from '../../../../format-message';
@@ -25,27 +26,23 @@ import { useMouseWheel } from './useMouseWheel';
25
26
  import { useKeyMouseTouchEvents } from './useKeyMouseEvents';
26
27
  import checkerboardStyle from '../CheckerboardStyling';
27
28
  import { View } from '@instructure/ui-view';
29
+
28
30
  /**
29
31
  * Remove the node contents and append the svg element.
30
32
  */
31
-
32
33
  function replaceSvg(svg, node) {
33
34
  if (!node) return;
34
-
35
35
  while (node.firstChild) {
36
36
  node.removeChild(node.lastChild);
37
37
  }
38
-
39
38
  node.appendChild(svg);
40
39
  }
41
-
42
- function getTransformValue(_ref) {
43
- let {
44
- translateX,
45
- translateY,
46
- rotation,
47
- scaleRatio
48
- } = _ref;
40
+ function getTransformValue({
41
+ translateX,
42
+ translateY,
43
+ rotation,
44
+ scaleRatio
45
+ }) {
49
46
  const values = [];
50
47
  if (translateX !== 0) values.push(`translateX(${translateX}px)`);
51
48
  if (translateY !== 0) values.push(`translateY(${translateY}px)`);
@@ -53,13 +50,11 @@ function getTransformValue(_ref) {
53
50
  if (scaleRatio > 1) values.push(`scale(${scaleRatio})`);
54
51
  return values.join(' ');
55
52
  }
56
-
57
- export const Preview = _ref2 => {
58
- let {
59
- image,
60
- settings,
61
- dispatch
62
- } = _ref2;
53
+ export const Preview = ({
54
+ image,
55
+ settings,
56
+ dispatch
57
+ }) => {
63
58
  const previewRef = /*#__PURE__*/createRef();
64
59
  const shapeRef = /*#__PURE__*/createRef();
65
60
  const imgRef = /*#__PURE__*/createRef();
@@ -73,8 +68,8 @@ export const Preview = _ref2 => {
73
68
  const [tempScaleRatio, onWheelCallback] = useMouseWheel(scaleRatio, dispatch);
74
69
  const [tempTranslateX, tempTranslateY, onMouseDownCallback, onTouchStartCallback] = useKeyMouseTouchEvents(translateX, translateY, dispatch, imgRef);
75
70
  useEffect(() => {
76
- imgRef.current.ondragstart = () => false; // eslint-disable-next-line react-hooks/exhaustive-deps
77
-
71
+ imgRef.current.ondragstart = () => false;
72
+ // eslint-disable-next-line react-hooks/exhaustive-deps
78
73
  }, []);
79
74
  useEffect(() => {
80
75
  const svg = buildSvg(shape);
@@ -86,17 +81,16 @@ export const Preview = _ref2 => {
86
81
  rotation,
87
82
  scaleRatio: tempScaleRatio
88
83
  });
89
-
90
84
  function isSafariVersion15OrLesser() {
91
85
  const match = /Version\/(\d+).+Safari/.exec(navigator.userAgent);
92
86
  return match ? parseInt(match[1], 10) < 16 : false;
93
- } // Clip is not supported in Safari until v16.
87
+ }
88
+
89
+ // Clip is not supported in Safari until v16.
94
90
  // It's needed here to prevent a strange screenreader
95
91
  // behavior that makes the cropper look bad. 'hidden'
96
92
  // suffices when clip is not available, although it's not perfect
97
93
  // TODO: remove when Safari versions >= 16 are more commonplace
98
-
99
-
100
94
  const overflow = isSafariVersion15OrLesser() ? 'hidden' : 'clip';
101
95
  return /*#__PURE__*/React.createElement("div", {
102
96
  style: {
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  export const PREVIEW_BACKGROUND_COLOR = '#394B58';
19
20
  export const PREVIEW_WIDTH = 942;
20
21
  export const PREVIEW_HEIGHT = 350;
@@ -15,21 +15,21 @@
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 PropTypes from 'prop-types';
20
21
  import { NumberInput } from '@instructure/ui-number-input';
21
22
  import { useDebouncedNumericValue } from './useDebouncedNumericValue';
22
23
  import formatMessage from '../../../../../format-message';
23
24
  import { ScreenReaderContent } from '@instructure/ui-a11y-content';
24
- export const CustomNumberInput = _ref => {
25
- let {
26
- value,
27
- parseValueCallback,
28
- processValueCallback,
29
- formatValueCallback,
30
- placeholder,
31
- onChange
32
- } = _ref;
25
+ export const CustomNumberInput = ({
26
+ value,
27
+ parseValueCallback,
28
+ processValueCallback,
29
+ formatValueCallback,
30
+ placeholder,
31
+ onChange
32
+ }) => {
33
33
  const [inputValue, digestCurrentValue, digestNewValue, hasError] = useDebouncedNumericValue({
34
34
  value,
35
35
  parseValueCallback,
@@ -37,20 +37,16 @@ export const CustomNumberInput = _ref => {
37
37
  formatValueCallback,
38
38
  onChange
39
39
  });
40
-
41
40
  const handleChange = (event, newValue) => digestNewValue(newValue.trim());
42
-
43
41
  const handleBlur = () => digestCurrentValue();
44
-
45
42
  const handleIncrement = () => onChange(processValueCallback(value + 1));
46
-
47
43
  const handleDecrement = () => onChange(processValueCallback(value - 1));
48
-
49
44
  const messages = hasError ? [{
50
45
  text: formatMessage('Invalid entry.'),
51
46
  type: 'error'
52
47
  }] : [];
53
48
  return /*#__PURE__*/React.createElement(NumberInput, {
49
+ allowStringValue: true,
54
50
  value: inputValue,
55
51
  onChange: handleChange,
56
52
  onBlur: handleBlur,
@@ -15,16 +15,16 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import { Flex } from '@instructure/ui-flex';
21
22
  import { Button } from '@instructure/ui-buttons';
22
23
  import { IconResetLine } from '@instructure/ui-icons';
23
24
  import formatMessage from '../../../../../format-message';
24
- export const ResetControls = _ref => {
25
- let {
26
- onReset
27
- } = _ref;
25
+ export const ResetControls = ({
26
+ onReset
27
+ }) => {
28
28
  return /*#__PURE__*/React.createElement(Flex.Item, null, /*#__PURE__*/React.createElement(Button, {
29
29
  renderIcon: IconResetLine,
30
30
  onClick: onReset
@@ -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 PropTypes from 'prop-types';
20
21
  import { IconButton } from '@instructure/ui-buttons';
@@ -25,36 +26,25 @@ import { CustomNumberInput } from './CustomNumberInput';
25
26
  import { calculateRotation, getNearestRectAngle } from './utils';
26
27
  import { BUTTON_ROTATION_DEGREES } from '../constants';
27
28
  import formatMessage from '../../../../../format-message';
28
-
29
29
  const parseRotationText = value => {
30
30
  // Matches a positive/negative integer/decimal followed by "º" symbol
31
31
  const matches = value.match(/([-|+]?\d+(?:\.\d+)?)º?/);
32
-
33
32
  if (!matches) {
34
33
  return null;
35
34
  }
36
-
37
35
  const result = parseInt(matches[1], 10);
38
-
39
36
  if (Number.isNaN(result)) {
40
37
  return null;
41
38
  }
42
-
43
39
  return result;
44
40
  };
45
-
46
41
  const formatRotationText = value => `${value}º`;
47
-
48
- export const RotationControls = _ref => {
49
- let {
50
- rotation,
51
- onChange
52
- } = _ref;
53
-
42
+ export const RotationControls = ({
43
+ rotation,
44
+ onChange
45
+ }) => {
54
46
  const rotateLeftCallback = () => onChange(calculateRotation(getNearestRectAngle(rotation, true) - BUTTON_ROTATION_DEGREES));
55
-
56
47
  const rotateRightCallback = () => onChange(calculateRotation(getNearestRectAngle(rotation, false) + BUTTON_ROTATION_DEGREES));
57
-
58
48
  return /*#__PURE__*/React.createElement(Flex.Item, {
59
49
  margin: "0 medium 0 0",
60
50
  title: formatMessage('Rotation'),
@@ -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 PropTypes from 'prop-types';
20
21
  import { Flex } from '@instructure/ui-flex';
@@ -48,22 +49,18 @@ const SHAPE_OPTIONS = [{
48
49
  id: Shape.Star,
49
50
  label: formatMessage('Star')
50
51
  }];
51
- export const ShapeControls = _ref => {
52
- let {
53
- shape,
54
- onChange
55
- } = _ref;
52
+ export const ShapeControls = ({
53
+ shape,
54
+ onChange
55
+ }) => {
56
56
  return /*#__PURE__*/React.createElement(Flex.Item, {
57
57
  margin: "0 medium 0 0"
58
58
  }, /*#__PURE__*/React.createElement(SimpleSelect, {
59
59
  isInline: true,
60
60
  value: shape,
61
- onChange: (event, _ref2) => {
62
- let {
63
- id
64
- } = _ref2;
65
- return onChange(id);
66
- },
61
+ onChange: (event, {
62
+ id
63
+ }) => onChange(id),
67
64
  renderLabel: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Select crop shape')),
68
65
  "data-testid": "shape-select-dropdown"
69
66
  }, SHAPE_OPTIONS.map(option => /*#__PURE__*/React.createElement(SimpleSelect.Option, {
@@ -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 { IconButton } from '@instructure/ui-buttons';
20
21
  import { IconZoomInLine, IconZoomOutLine } from '@instructure/ui-icons';
@@ -28,33 +29,24 @@ import PropTypes from 'prop-types';
28
29
  import { CustomNumberInput } from './CustomNumberInput';
29
30
  import { showFlashAlert } from '../../../../../common/FlashAlert';
30
31
  import { debounce } from '@instructure/debounce';
31
-
32
32
  const parseZoomText = value => {
33
33
  // Matches a positive/negative integer/decimal followed by %" symbol
34
34
  const matches = value.match(/([-|+]?\d+(?:\.\d+)?)%?/);
35
-
36
35
  if (!matches) {
37
36
  return null;
38
37
  }
39
-
40
38
  const result = parseInt(matches[1], 10);
41
-
42
39
  if (Number.isNaN(result)) {
43
40
  return null;
44
41
  }
45
-
46
42
  return result;
47
43
  };
48
-
49
44
  const formatZoomText = value => `${value}%`;
50
-
51
45
  const debouncedAlert = debounce(showFlashAlert, 1000);
52
- export const ZoomControls = _ref => {
53
- let {
54
- scaleRatio,
55
- onChange
56
- } = _ref;
57
-
46
+ export const ZoomControls = ({
47
+ scaleRatio,
48
+ onChange
49
+ }) => {
58
50
  const onZoomChange = value => {
59
51
  const message = {
60
52
  message: `${round(value * 100)}% Zoom`,
@@ -64,17 +56,14 @@ export const ZoomControls = _ref => {
64
56
  debouncedAlert(message);
65
57
  onChange(value);
66
58
  };
67
-
68
59
  const zoomOutCallback = () => {
69
60
  const newScaleRatio = calculateScaleRatio(scaleRatio - BUTTON_SCALE_STEP);
70
61
  onZoomChange(newScaleRatio);
71
62
  };
72
-
73
63
  const zoomInCallback = () => {
74
64
  const newScaleRatio = calculateScaleRatio(scaleRatio + BUTTON_SCALE_STEP);
75
65
  onZoomChange(newScaleRatio);
76
66
  };
77
-
78
67
  return /*#__PURE__*/React.createElement(Flex.Item, {
79
68
  title: formatMessage('Zoom'),
80
69
  role: "toolbar",
@@ -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 { Flex } from '@instructure/ui-flex';
20
21
  import { actions } from '../reducers/imageCropper';
@@ -22,11 +23,10 @@ import { ZoomControls } from './ZoomControls';
22
23
  import { RotationControls } from './RotationControls';
23
24
  import { ShapeControls } from './ShapeControls';
24
25
  import { ResetControls } from './ResetControls';
25
- export const Controls = _ref => {
26
- let {
27
- settings,
28
- dispatch
29
- } = _ref;
26
+ export const Controls = ({
27
+ settings,
28
+ dispatch
29
+ }) => {
30
30
  return /*#__PURE__*/React.createElement(Flex, {
31
31
  id: "imageCropperControls",
32
32
  direction: "row",
@@ -15,39 +15,33 @@
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 { useEffect, useRef, useState } from 'react';
19
20
  import { debounce } from '@instructure/debounce';
20
21
  const CHANGE_EVENT_DELAY = 1000;
21
-
22
- const digestValue = _ref => {
23
- let {
24
- parseValueCallback,
25
- processValueCallback,
26
- formatValueCallback,
27
- value
28
- } = _ref;
22
+ const digestValue = ({
23
+ parseValueCallback,
24
+ processValueCallback,
25
+ formatValueCallback,
26
+ value
27
+ }) => {
29
28
  const parsedNewValue = parseValueCallback(value);
30
-
31
29
  if (parsedNewValue === null) {
32
30
  return [null, null];
33
31
  }
34
-
35
32
  const processedNewValue = processValueCallback(parsedNewValue);
36
33
  const formattedNewTempValue = formatValueCallback(processedNewValue);
37
34
  return [formattedNewTempValue, processedNewValue];
38
35
  };
39
-
40
- export function useDebouncedNumericValue(_ref2) {
41
- let {
42
- value,
43
- parseValueCallback,
44
- processValueCallback,
45
- formatValueCallback,
46
- onChange
47
- } = _ref2;
36
+ export function useDebouncedNumericValue({
37
+ value,
38
+ parseValueCallback,
39
+ processValueCallback,
40
+ formatValueCallback,
41
+ onChange
42
+ }) {
48
43
  const [inputValue, setInputValue] = useState(formatValueCallback(value));
49
44
  const [hasError, setHasError] = useState(false);
50
-
51
45
  const updateStateAfterDigest = newValue => {
52
46
  const [formattedValue, processedValue] = digestValue({
53
47
  parseValueCallback,
@@ -55,40 +49,31 @@ export function useDebouncedNumericValue(_ref2) {
55
49
  formatValueCallback,
56
50
  value: newValue
57
51
  });
58
-
59
52
  if (formattedValue === null || processedValue === null) {
60
53
  setHasError(true);
61
54
  return;
62
55
  }
63
-
64
56
  setHasError(false);
65
-
66
57
  if (newValue !== formattedValue) {
67
58
  setInputValue(formattedValue);
68
59
  }
69
-
70
60
  if (processedValue !== value) {
71
61
  onChange(processedValue);
72
62
  }
73
63
  };
74
-
75
64
  const debouncedUpdateStateAfterDigest = useRef(debounce(updateStateAfterDigest, CHANGE_EVENT_DELAY));
76
65
  useEffect(() => {
77
66
  const newTempValue = formatValueCallback(value);
78
-
79
67
  if (newTempValue !== inputValue) {
80
68
  setInputValue(newTempValue);
81
69
  setHasError(false);
82
- } // eslint-disable-next-line react-hooks/exhaustive-deps
83
-
70
+ }
71
+ // eslint-disable-next-line react-hooks/exhaustive-deps
84
72
  }, [value]);
85
-
86
73
  const digestCurrentValue = () => updateStateAfterDigest(inputValue);
87
-
88
74
  const digestNewValue = rawValue => {
89
75
  setInputValue(rawValue);
90
76
  debouncedUpdateStateAfterDigest.current(rawValue);
91
77
  };
92
-
93
78
  return [inputValue, digestCurrentValue, digestNewValue, hasError];
94
79
  }
@@ -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 { BUTTON_ROTATION_DEGREES, MAX_SCALE_RATIO, MIN_SCALE_RATIO } from '../constants';
19
20
  import round from '../../round';
20
21
  export const calculateScaleRatio = scaleRatio => {
@@ -29,11 +30,9 @@ export const calculateScalePercentage = scalePercentage => {
29
30
  };
30
31
  export const calculateRotation = rotationAngle => {
31
32
  const simplifiedRotationAngle = round(rotationAngle % 360);
32
-
33
33
  if (Math.abs(rotationAngle) >= 360) {
34
34
  return simplifiedRotationAngle;
35
35
  }
36
-
37
36
  return rotationAngle;
38
37
  };
39
38
  export const getNearestRectAngle = (rotationAngle, shouldRotateToLeft) => {
@@ -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 round from '../round';
19
20
  import { buildShapeMask } from './svg/shape';
20
21
  import { createSvgElement } from './svg/utils';
@@ -49,27 +50,22 @@ export async function createCroppedImageSvg(cropperSettings, image) {
49
50
  rootElement.appendChild(mainGroup);
50
51
  return rootElement;
51
52
  }
52
-
53
53
  const fetchImageMetadata = src => {
54
54
  return new Promise(resolve => {
55
55
  const img = new Image();
56
-
57
56
  img.onload = function () {
58
57
  resolve({
59
58
  imageWidth: this.naturalWidth,
60
59
  imageHeight: this.naturalHeight
61
60
  });
62
61
  };
63
-
64
62
  img.src = src;
65
63
  });
66
64
  };
67
-
68
- const createDefsElement = _ref => {
69
- let {
70
- shape,
71
- squareDimension
72
- } = _ref;
65
+ const createDefsElement = ({
66
+ shape,
67
+ squareDimension
68
+ }) => {
73
69
  const defs = createSvgElement('defs');
74
70
  const shapeMask = buildShapeMask({
75
71
  shape,
@@ -82,19 +78,16 @@ const createDefsElement = _ref => {
82
78
  defs.appendChild(clipPath);
83
79
  return defs;
84
80
  };
85
-
86
81
  const convertTranslationUnits = (translationPixels, imageHeight) => {
87
82
  return imageHeight * translationPixels / PREVIEW_HEIGHT;
88
83
  };
89
-
90
- const createMainSvgGroup = _ref2 => {
91
- let {
92
- imageWidth,
93
- imageHeight,
94
- squareDimension,
95
- image,
96
- settings
97
- } = _ref2;
84
+ const createMainSvgGroup = ({
85
+ imageWidth,
86
+ imageHeight,
87
+ squareDimension,
88
+ image,
89
+ settings
90
+ }) => {
98
91
  const mainGroup = createSvgElement('g', {
99
92
  'clip-path': `url(#${CLIP_PATH_ID})`
100
93
  });
@@ -113,15 +106,13 @@ const createMainSvgGroup = _ref2 => {
113
106
  mainGroup.appendChild(imageElement);
114
107
  return mainGroup;
115
108
  };
116
-
117
- export const setTransformAttribute = _ref3 => {
118
- let {
119
- imageElement,
120
- imageWidth,
121
- imageHeight,
122
- squareDimension,
123
- settings
124
- } = _ref3;
109
+ export const setTransformAttribute = ({
110
+ imageElement,
111
+ imageWidth,
112
+ imageHeight,
113
+ squareDimension,
114
+ settings
115
+ }) => {
125
116
  const {
126
117
  rotation = 0,
127
118
  scaleRatio = 1.0,
@@ -135,15 +126,12 @@ export const setTransformAttribute = _ref3 => {
135
126
  const x = round(-horizontalCenter + convertedTranslateX + squareDimension / 2, 2);
136
127
  const y = round(-verticalCenter + convertedTranslateY + squareDimension / 2, 2);
137
128
  let value = `translate(${x}, ${y})`;
138
-
139
129
  if (rotation !== 0) {
140
130
  // Rotates image using its center as pivot
141
131
  value += ` rotate(${rotation}, ${horizontalCenter}, ${verticalCenter})`;
142
132
  }
143
-
144
133
  if (scaleRatio !== 1.0) {
145
134
  value += ` scale(${scaleRatio})`;
146
135
  }
147
-
148
136
  imageElement.setAttribute('transform', value);
149
137
  };
@@ -15,4 +15,5 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  export { ImageCropperModal } from './Modal';
@@ -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 PropTypes from 'prop-types';
19
20
  export const ImageCropperSettingsPropTypes = PropTypes.shape({
20
21
  shape: PropTypes.string,
@@ -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 { DEFAULT_CROPPER_SETTINGS } from '../constants';
19
20
  export const defaultState = DEFAULT_CROPPER_SETTINGS;
20
21
  export const actions = {
@@ -29,43 +30,43 @@ export const actions = {
29
30
  export const cropperSettingsReducer = (state, action) => {
30
31
  switch (action.type) {
31
32
  case actions.SET_SHAPE:
32
- return { ...state,
33
+ return {
34
+ ...state,
33
35
  shape: action.payload
34
36
  };
35
-
36
37
  case actions.SET_ROTATION:
37
- return { ...state,
38
+ return {
39
+ ...state,
38
40
  rotation: action.payload
39
41
  };
40
-
41
42
  case actions.SET_SCALE_RATIO:
42
- return { ...state,
43
+ return {
44
+ ...state,
43
45
  scaleRatio: action.payload
44
46
  };
45
-
46
47
  case actions.SET_TRANSLATE_X:
47
- return { ...state,
48
+ return {
49
+ ...state,
48
50
  translateX: action.payload
49
51
  };
50
-
51
52
  case actions.SET_TRANSLATE_Y:
52
- return { ...state,
53
+ return {
54
+ ...state,
53
55
  translateY: action.payload
54
56
  };
55
-
56
57
  case actions.UPDATE_SETTINGS:
57
- return { ...state,
58
+ return {
59
+ ...state,
58
60
  ...action.payload
59
61
  };
60
-
61
62
  case actions.RESET_SETTINGS:
62
- return { ...state,
63
+ return {
64
+ ...state,
63
65
  rotation: defaultState.rotation,
64
66
  scaleRatio: defaultState.scaleRatio,
65
67
  translateX: defaultState.translateX,
66
68
  translateY: defaultState.translateY
67
69
  };
68
-
69
70
  default:
70
71
  throw Error('Unknown action for image cropper reducer');
71
72
  }
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  export const Shape = {
19
20
  Square: 'square',
20
21
  Circle: 'circle',