@instructure/canvas-rce 5.14.0 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/__tests__/sidebar/reducers/all_files.test.js +28 -0
  17. package/babel.config.js +3 -1
  18. package/build.sh +7 -7
  19. package/es/bridge/Bridge.js +8 -56
  20. package/es/bridge/index.js +1 -0
  21. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  22. package/es/canvasFileBrowser/en-US.js +3 -6
  23. package/es/common/FlashAlert.js +7 -28
  24. package/es/common/browser.js +4 -2
  25. package/es/common/fileUrl.js +104 -59
  26. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  27. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  28. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  29. package/es/common/incremental-loading/index.js +1 -0
  30. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  31. package/es/common/indicate.js +15 -8
  32. package/es/common/mimeClass.js +3 -4
  33. package/es/common/natcompare.js +1 -4
  34. package/es/defaultTinymceConfig.js +5 -3
  35. package/es/elementDenylist.js +1 -0
  36. package/es/enhance-user-content/doc_previews.js +17 -28
  37. package/es/enhance-user-content/enhance_user_content.js +28 -60
  38. package/es/enhance-user-content/external_links.js +5 -8
  39. package/es/enhance-user-content/index.js +1 -0
  40. package/es/enhance-user-content/instructure_helper.js +25 -38
  41. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  42. package/es/enhance-user-content/mathml.js +35 -82
  43. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  44. package/es/format-message.js +3 -4
  45. package/es/getThemeVars.js +8 -6
  46. package/es/getTranslations.js +1 -78
  47. package/es/index.js +3 -1
  48. package/es/rce/AlertMessageArea.js +1 -1
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +1 -0
  51. package/es/rce/RCE.js +12 -11
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +27 -10
  54. package/es/rce/RCEWrapper.js +167 -386
  55. package/es/rce/RCEWrapperProps.js +8 -3
  56. package/es/rce/RceHtmlEditor.js +5 -8
  57. package/es/rce/ResizeHandle.js +3 -8
  58. package/es/rce/RestoreAutoSaveModal.js +1 -2
  59. package/es/rce/ShowOnFocusButton/index.js +0 -6
  60. package/es/rce/StatusBar.js +8 -37
  61. package/es/rce/alertHandler.js +1 -4
  62. package/es/rce/contentInsertion.js +35 -57
  63. package/es/rce/contentInsertionUtils.js +6 -8
  64. package/es/rce/contentRendering.js +7 -12
  65. package/es/rce/customEvents.js +1 -0
  66. package/es/rce/editorLanguage.js +22 -10
  67. package/es/rce/indicatorRegion.js +6 -5
  68. package/es/rce/normalizeLocale.js +5 -3
  69. package/es/rce/normalizeProps.js +3 -1
  70. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  71. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  74. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  75. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  76. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  77. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  83. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  84. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  85. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  86. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  95. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  96. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  97. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  98. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  99. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  100. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  101. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  102. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  103. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  127. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  128. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  129. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  130. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  131. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  132. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  134. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  135. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  136. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  137. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  138. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  139. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  140. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  141. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  144. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  147. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  148. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  149. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  150. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  153. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  154. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  155. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  156. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  159. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  164. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  165. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  166. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  167. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  168. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  169. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  170. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  171. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  172. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  173. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  174. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  175. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  176. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  184. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  185. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  186. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  187. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  188. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  198. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  199. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  201. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  202. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  204. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  205. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  206. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  207. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  208. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  210. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  211. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  212. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  213. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  214. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  215. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  216. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  217. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  218. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  219. package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
  220. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  221. package/es/rce/plugins/shared/ColorInput.js +5 -14
  222. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  223. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  224. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  225. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  226. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  227. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  228. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  229. package/es/rce/plugins/shared/EventUtils.js +1 -3
  230. package/es/rce/plugins/shared/Filter.js +8 -38
  231. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  232. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  233. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  234. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  235. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  236. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  237. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  239. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  240. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  241. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  242. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  244. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  245. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  247. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  248. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  250. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  251. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  252. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  253. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  254. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  255. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  256. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  257. package/es/rce/plugins/shared/Previewable.js +1 -0
  258. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  259. package/es/rce/plugins/shared/StoreContext.js +1 -2
  260. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  261. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  262. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  263. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  264. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  265. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  266. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  267. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  268. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  269. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  270. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  271. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  272. package/es/rce/plugins/shared/Upload/index.js +1 -0
  273. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  274. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  275. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  276. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  277. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  278. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  279. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  280. package/es/rce/plugins/shared/dateUtils.js +1 -1
  281. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  282. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  283. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  284. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  285. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  286. package/es/rce/plugins/shared/fileShape.js +4 -9
  287. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  288. package/es/rce/plugins/shared/fileUtils.js +1 -2
  289. package/es/rce/plugins/shared/linkUtils.js +1 -16
  290. package/es/rce/plugins/shared/round.js +1 -0
  291. package/es/rce/plugins/shared/trayUtils.js +4 -3
  292. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  293. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  294. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  295. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  296. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  297. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  299. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  300. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  321. package/es/rce/root.js +9 -8
  322. package/es/rce/sanitizePlugins.js +1 -3
  323. package/es/rce/style.js +1 -4
  324. package/es/rce/tinyRCE.js +13 -9
  325. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  326. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  327. package/es/rce/transformContent.js +8 -10
  328. package/es/rce/types.js +1 -0
  329. package/es/rce/userOS.js +1 -1
  330. package/es/rce/wrapInitCb.js +50 -43
  331. package/es/rcs/api.js +61 -116
  332. package/es/rcs/buildError.js +5 -17
  333. package/es/rcs/fake.js +4 -13
  334. package/es/sidebar/actions/all_files.js +2 -0
  335. package/es/sidebar/actions/data.js +4 -7
  336. package/es/sidebar/actions/documents.js +9 -6
  337. package/es/sidebar/actions/files.js +3 -6
  338. package/es/sidebar/actions/filter.js +1 -0
  339. package/es/sidebar/actions/flickr.js +1 -1
  340. package/es/sidebar/actions/images.js +12 -11
  341. package/es/sidebar/actions/links.js +1 -0
  342. package/es/sidebar/actions/media.js +12 -10
  343. package/es/sidebar/actions/session.js +1 -3
  344. package/es/sidebar/actions/ui.js +1 -0
  345. package/es/sidebar/actions/upload.js +14 -39
  346. package/es/sidebar/containers/Sidebar.js +1 -2
  347. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  348. package/es/sidebar/dragHtml.js +5 -3
  349. package/es/sidebar/reducers/all_files.js +4 -3
  350. package/es/sidebar/reducers/collection.js +12 -13
  351. package/es/sidebar/reducers/collections.js +5 -5
  352. package/es/sidebar/reducers/documents.js +6 -13
  353. package/es/sidebar/reducers/files.js +3 -3
  354. package/es/sidebar/reducers/filter.js +1 -8
  355. package/es/sidebar/reducers/flickr.js +9 -9
  356. package/es/sidebar/reducers/folder.js +15 -15
  357. package/es/sidebar/reducers/folders.js +3 -3
  358. package/es/sidebar/reducers/images.js +3 -13
  359. package/es/sidebar/reducers/index.js +3 -1
  360. package/es/sidebar/reducers/media.js +6 -13
  361. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  362. package/es/sidebar/reducers/noop.js +1 -0
  363. package/es/sidebar/reducers/rootFolderId.js +1 -2
  364. package/es/sidebar/reducers/session.js +3 -3
  365. package/es/sidebar/reducers/ui.js +3 -16
  366. package/es/sidebar/reducers/upload.js +8 -40
  367. package/es/sidebar/store/configureStore.js +1 -0
  368. package/es/sidebar/store/initialState.js +13 -24
  369. package/es/translations/locales/ab.js +1 -0
  370. package/es/translations/locales/ar.js +67 -9
  371. package/es/translations/locales/ca.js +67 -9
  372. package/es/translations/locales/cs.js +1 -0
  373. package/es/translations/locales/cs_CZ.js +1 -0
  374. package/es/translations/locales/cy.js +67 -9
  375. package/es/translations/locales/da-x-k12.js +67 -9
  376. package/es/translations/locales/da.js +67 -9
  377. package/es/translations/locales/da_DK.js +1 -0
  378. package/es/translations/locales/de.js +67 -9
  379. package/es/translations/locales/el.js +4 -0
  380. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  381. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  382. package/es/translations/locales/en.js +72 -8
  383. package/es/translations/locales/en_AU.js +67 -9
  384. package/es/translations/locales/en_CA.js +67 -9
  385. package/es/translations/locales/en_CY.js +67 -9
  386. package/es/translations/locales/en_GB.js +67 -9
  387. package/es/translations/locales/en_NZ.js +1 -0
  388. package/es/translations/locales/en_SE.js +1 -0
  389. package/es/translations/locales/en_US.js +1 -0
  390. package/es/translations/locales/es.js +67 -9
  391. package/es/translations/locales/es_ES.js +67 -9
  392. package/es/translations/locales/es_GT.js +1 -0
  393. package/es/translations/locales/fa_IR.js +7 -0
  394. package/es/translations/locales/fi.js +67 -9
  395. package/es/translations/locales/fr.js +67 -9
  396. package/es/translations/locales/fr_CA.js +68 -10
  397. package/es/translations/locales/ga.js +5 -13
  398. package/es/translations/locales/he.js +7 -0
  399. package/es/translations/locales/hi.js +67 -9
  400. package/es/translations/locales/ht.js +67 -9
  401. package/es/translations/locales/hu.js +7 -6
  402. package/es/translations/locales/hu_HU.js +1 -0
  403. package/es/translations/locales/hy.js +1 -0
  404. package/es/translations/locales/id.js +67 -9
  405. package/es/translations/locales/id_ID.js +1 -0
  406. package/es/translations/locales/is.js +67 -9
  407. package/es/translations/locales/it.js +67 -9
  408. package/es/translations/locales/ja.js +67 -9
  409. package/es/translations/locales/ko.js +1 -0
  410. package/es/translations/locales/ko_KR.js +1 -0
  411. package/es/translations/locales/lt.js +1 -0
  412. package/es/translations/locales/lt_LT.js +1 -0
  413. package/es/translations/locales/mi.js +67 -9
  414. package/es/translations/locales/mn_MN.js +1 -0
  415. package/es/translations/locales/ms.js +67 -9
  416. package/es/translations/locales/nb-x-k12.js +67 -9
  417. package/es/translations/locales/nb.js +67 -9
  418. package/es/translations/locales/nl.js +67 -9
  419. package/es/translations/locales/nl_NL.js +1 -0
  420. package/es/translations/locales/nn.js +7 -6
  421. package/es/translations/locales/pl.js +67 -9
  422. package/es/translations/locales/pt.js +67 -9
  423. package/es/translations/locales/pt_BR.js +67 -9
  424. package/es/translations/locales/ro.js +1 -0
  425. package/es/translations/locales/ru.js +67 -9
  426. package/es/translations/locales/se.js +1 -0
  427. package/es/translations/locales/sl.js +67 -9
  428. package/es/translations/locales/sv-x-k12.js +67 -9
  429. package/es/translations/locales/sv.js +67 -9
  430. package/es/translations/locales/sv_SE.js +1 -0
  431. package/es/translations/locales/tg.js +1 -0
  432. package/es/translations/locales/th.js +67 -9
  433. package/es/translations/locales/th_TH.js +1 -0
  434. package/es/translations/locales/tl_PH.js +1 -0
  435. package/es/translations/locales/tr.js +7 -0
  436. package/es/translations/locales/uk_UA.js +7 -0
  437. package/es/translations/locales/vi.js +67 -9
  438. package/es/translations/locales/vi_VN.js +1 -0
  439. package/es/translations/locales/zh-Hans.js +67 -9
  440. package/es/translations/locales/zh-Hant.js +67 -9
  441. package/es/translations/locales/zh.js +67 -9
  442. package/es/translations/locales/zh_HK.js +67 -9
  443. package/es/translations/locales/zh_TW.Big5.js +1 -0
  444. package/es/translations/locales/zh_TW.js +1 -0
  445. package/es/translations/tinymce/ar_SA.js +1 -0
  446. package/es/translations/tinymce/fi.js +1 -0
  447. package/es/translations/tinymce/ga.js +1 -0
  448. package/es/translations/tinymce/id.js +1 -0
  449. package/es/translations/tinymce/ru.js +1 -0
  450. package/es/translations/tinymce/ru_RU.js +1 -0
  451. package/es/translations/tinymce/sl.js +1 -0
  452. package/es/translations/tinymce/sr.js +1 -0
  453. package/es/translations/tinymce/th.js +1 -0
  454. package/es/translations/tinymce/uk_UA.js +1 -0
  455. package/es/translations/tinymce/vi_VN.js +1 -0
  456. package/es/util/TypedDict.js +4 -2
  457. package/es/util/encrypted-storage.js +3 -13
  458. package/es/util/file-url-util.js +1 -6
  459. package/es/util/fullscreenHelpers.js +4 -1
  460. package/es/util/instui-icon-helper.js +4 -3
  461. package/es/util/loadingPlaceholder.js +38 -39
  462. package/es/util/simpleCache.js +0 -3
  463. package/es/util/string-util.js +1 -1
  464. package/es/util/textarea-editing-util.js +3 -7
  465. package/es/util/tinymce-plugin-util.js +0 -5
  466. package/es/util/url-util.js +16 -25
  467. package/eslint.config.js +239 -0
  468. package/jest.config.js +1 -1
  469. package/package.json +77 -82
  470. package/scripts/build-canvas +2 -1
  471. package/scripts/build.js +4 -4
  472. package/scripts/publish_to_npm.sh +1 -1
  473. package/testcafe/RCEWrapper.test.js +0 -1
  474. package/testcafe/StatusBar.test.js +0 -1
  475. package/testcafe/axe.test.js +3 -4
  476. package/testcafe/enhanceUserContent.test.js +0 -1
  477. package/tsconfig.json +20 -15
  478. package/.eslintrc +0 -45
  479. package/.prettierignore +0 -6
  480. package/es/common/components/FileTree/File.js +0 -64
  481. package/es/common/components/FileTree/Folder.js +0 -110
  482. package/es/common/components/FileTree/index.js +0 -84
  483. package/es/common/components/FileTree/styles.js +0 -72
  484. package/es/common/components/Loading.js +0 -83
@@ -15,10 +15,10 @@
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
22
  const digestValue = _ref => {
23
23
  let {
24
24
  parseValueCallback,
@@ -27,16 +27,13 @@ const digestValue = _ref => {
27
27
  value
28
28
  } = _ref;
29
29
  const parsedNewValue = parseValueCallback(value);
30
-
31
30
  if (parsedNewValue === null) {
32
31
  return [null, null];
33
32
  }
34
-
35
33
  const processedNewValue = processValueCallback(parsedNewValue);
36
34
  const formattedNewTempValue = formatValueCallback(processedNewValue);
37
35
  return [formattedNewTempValue, processedNewValue];
38
36
  };
39
-
40
37
  export function useDebouncedNumericValue(_ref2) {
41
38
  let {
42
39
  value,
@@ -47,7 +44,6 @@ export function useDebouncedNumericValue(_ref2) {
47
44
  } = _ref2;
48
45
  const [inputValue, setInputValue] = useState(formatValueCallback(value));
49
46
  const [hasError, setHasError] = useState(false);
50
-
51
47
  const updateStateAfterDigest = newValue => {
52
48
  const [formattedValue, processedValue] = digestValue({
53
49
  parseValueCallback,
@@ -55,40 +51,31 @@ export function useDebouncedNumericValue(_ref2) {
55
51
  formatValueCallback,
56
52
  value: newValue
57
53
  });
58
-
59
54
  if (formattedValue === null || processedValue === null) {
60
55
  setHasError(true);
61
56
  return;
62
57
  }
63
-
64
58
  setHasError(false);
65
-
66
59
  if (newValue !== formattedValue) {
67
60
  setInputValue(formattedValue);
68
61
  }
69
-
70
62
  if (processedValue !== value) {
71
63
  onChange(processedValue);
72
64
  }
73
65
  };
74
-
75
66
  const debouncedUpdateStateAfterDigest = useRef(debounce(updateStateAfterDigest, CHANGE_EVENT_DELAY));
76
67
  useEffect(() => {
77
68
  const newTempValue = formatValueCallback(value);
78
-
79
69
  if (newTempValue !== inputValue) {
80
70
  setInputValue(newTempValue);
81
71
  setHasError(false);
82
- } // eslint-disable-next-line react-hooks/exhaustive-deps
83
-
72
+ }
73
+ // eslint-disable-next-line react-hooks/exhaustive-deps
84
74
  }, [value]);
85
-
86
75
  const digestCurrentValue = () => updateStateAfterDigest(inputValue);
87
-
88
76
  const digestNewValue = rawValue => {
89
77
  setInputValue(rawValue);
90
78
  debouncedUpdateStateAfterDigest.current(rawValue);
91
79
  };
92
-
93
80
  return [inputValue, digestCurrentValue, digestNewValue, hasError];
94
81
  }
@@ -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,22 +50,18 @@ 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
65
  const createDefsElement = _ref => {
69
66
  let {
70
67
  shape,
@@ -82,11 +79,9 @@ const createDefsElement = _ref => {
82
79
  defs.appendChild(clipPath);
83
80
  return defs;
84
81
  };
85
-
86
82
  const convertTranslationUnits = (translationPixels, imageHeight) => {
87
83
  return imageHeight * translationPixels / PREVIEW_HEIGHT;
88
84
  };
89
-
90
85
  const createMainSvgGroup = _ref2 => {
91
86
  let {
92
87
  imageWidth,
@@ -113,7 +108,6 @@ const createMainSvgGroup = _ref2 => {
113
108
  mainGroup.appendChild(imageElement);
114
109
  return mainGroup;
115
110
  };
116
-
117
111
  export const setTransformAttribute = _ref3 => {
118
112
  let {
119
113
  imageElement,
@@ -135,15 +129,12 @@ export const setTransformAttribute = _ref3 => {
135
129
  const x = round(-horizontalCenter + convertedTranslateX + squareDimension / 2, 2);
136
130
  const y = round(-verticalCenter + convertedTranslateY + squareDimension / 2, 2);
137
131
  let value = `translate(${x}, ${y})`;
138
-
139
132
  if (rotation !== 0) {
140
133
  // Rotates image using its center as pivot
141
134
  value += ` rotate(${rotation}, ${horizontalCenter}, ${verticalCenter})`;
142
135
  }
143
-
144
136
  if (scaleRatio !== 1.0) {
145
137
  value += ` scale(${scaleRatio})`;
146
138
  }
147
-
148
139
  imageElement.setAttribute('transform', value);
149
140
  };
@@ -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',
@@ -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 { createSvgElement } from './utils';
19
20
  import { PREVIEW_HEIGHT, SHAPE_CONTAINER_LENGTH, GLUE_WIDTH, PREVIEW_WIDTH, PREVIEW_BACKGROUND_COLOR } from '../constants';
20
21
  import { buildShapeMask } from './shape';
@@ -57,7 +58,6 @@ export function buildSvg(shape) {
57
58
  mainContainer.appendChild(bgElement);
58
59
  return mainContainer;
59
60
  }
60
-
61
61
  function createSvgContainer() {
62
62
  return createSvgElement('svg', {
63
63
  xmlns: 'http://www.w3.org/2000/svg',
@@ -65,7 +65,6 @@ function createSvgContainer() {
65
65
  height: PREVIEW_HEIGHT
66
66
  });
67
67
  }
68
-
69
68
  function createMask(settings) {
70
69
  const maskElement = createSvgElement('mask', {
71
70
  id: 'imageCropperMask'
@@ -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 { SHAPE_CONTAINER_LENGTH } from '../constants';
20
21
  import { createSvgElement } from './utils';
@@ -25,37 +26,27 @@ export function buildShapeMask(_ref) {
25
26
  size
26
27
  } = _ref;
27
28
  const dimensionSize = size || SHAPE_CONTAINER_LENGTH;
28
-
29
29
  switch (shape) {
30
30
  case Shape.Square:
31
31
  return buildSquare(dimensionSize);
32
-
33
32
  case Shape.Circle:
34
33
  return buildCircle(dimensionSize);
35
-
36
34
  case Shape.Triangle:
37
35
  return buildTriangle(dimensionSize);
38
-
39
36
  case Shape.Diamond:
40
37
  return buildDiamond(dimensionSize);
41
-
42
38
  case Shape.Pentagon:
43
39
  return buildPentagon(dimensionSize);
44
-
45
40
  case Shape.Hexagon:
46
41
  return buildHexagon(dimensionSize);
47
-
48
42
  case Shape.Octagon:
49
43
  return buildOctagon(dimensionSize);
50
-
51
44
  case Shape.Star:
52
45
  return buildStar(dimensionSize);
53
-
54
46
  default:
55
47
  throw new Error(`Invalid shape: ${shape}`);
56
48
  }
57
49
  }
58
-
59
50
  function buildSquare(dimensionSize) {
60
51
  return createSvgElement('rect', {
61
52
  x: 0,
@@ -65,7 +56,6 @@ function buildSquare(dimensionSize) {
65
56
  fill: 'black'
66
57
  });
67
58
  }
68
-
69
59
  function buildCircle(dimensionSize) {
70
60
  return createSvgElement('circle', {
71
61
  cx: dimensionSize / 2,
@@ -74,19 +64,16 @@ function buildCircle(dimensionSize) {
74
64
  fill: 'black'
75
65
  });
76
66
  }
77
-
78
67
  function buildTriangle(dimensionSize) {
79
68
  return createSvgElement('path', {
80
69
  d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize}H0L${dimensionSize / 2} 0Z`
81
70
  });
82
71
  }
83
-
84
72
  function buildDiamond(dimensionSize) {
85
73
  return createSvgElement('path', {
86
74
  d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize / 2} ${dimensionSize}L0 ${dimensionSize / 2}L${dimensionSize / 2} 0Z`
87
75
  });
88
76
  }
89
-
90
77
  function buildPentagon(dimensionSize) {
91
78
  const half = round(dimensionSize / 2, 2);
92
79
  const alpha = round(0.3906 * dimensionSize, 2);
@@ -95,14 +82,12 @@ function buildPentagon(dimensionSize) {
95
82
  d: `M${half} 0L${dimensionSize} ${alpha}L${half + beta} ${dimensionSize}H${half - beta}L0 ${alpha}L${half} 0L${half} 0Z`
96
83
  });
97
84
  }
98
-
99
85
  function buildHexagon(dimensionSize) {
100
86
  const leg = round(0.2895 * dimensionSize, 2);
101
87
  return createSvgElement('path', {
102
88
  d: `M${dimensionSize - leg} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize - leg} ${dimensionSize}H${leg}L0 ${dimensionSize / 2}L${leg} 0H${dimensionSize - leg}Z`
103
89
  });
104
90
  }
105
-
106
91
  function buildOctagon(dimensionSize) {
107
92
  const leg = round(0.2895 * dimensionSize, 2);
108
93
  const side = round(dimensionSize - 2 * leg, 2);
@@ -110,7 +95,6 @@ function buildOctagon(dimensionSize) {
110
95
  d: `M0 ${leg}L${leg} 0H${leg + side}L${dimensionSize} ${leg}V${leg + side}L${leg + side} ${dimensionSize}H${leg}L0 ${leg + side}V${leg}Z`
111
96
  });
112
97
  }
113
-
114
98
  function buildStar(dimensionSize) {
115
99
  const half = round(dimensionSize / 2, 2);
116
100
  const alpha = round(0.1143 * dimensionSize, 2);
@@ -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 function createSvgElement(tag) {
19
20
  let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20
21
  const element = document.createElementNS('http://www.w3.org/2000/svg', tag);
@@ -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 { useEffect, useState, useRef, useCallback } from 'react';
19
20
  import { debounce } from '@instructure/debounce';
20
21
  import { KEY_EVENT_DELAY, KEY_EVENT_ACCELERATION } from './constants';
@@ -22,25 +23,20 @@ import { actions } from './reducers/imageCropper';
22
23
  const EVENT_EXCEPTION_ELEMENT_IDS = ['imageCropperHeader', 'imageCropperFooter', 'imageCropperControls'];
23
24
  const TOUCH_EVENTS = ['ontouchmove', 'ontouchend', 'ontouchcancel'];
24
25
  const MOUSE_EVENTS = ['onmousemove', 'onmouseup', 'onmouseout'];
25
-
26
26
  function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch) {
27
27
  // Refs that manage the keydown acceleration
28
28
  const direction = useRef(0);
29
29
  const initialTime = useRef(null);
30
-
31
30
  const onKeyDown = event => {
32
31
  // 37 = Left, 38 = Up, 39 = Right, 40 = Down
33
32
  const {
34
33
  keyCode
35
34
  } = event;
36
-
37
35
  if (![37, 38, 39, 40].includes(keyCode)) {
38
36
  return;
39
37
  }
40
-
41
38
  event.preventDefault();
42
39
  let elapsedTime;
43
-
44
40
  if (keyCode !== direction.current) {
45
41
  elapsedTime = 0;
46
42
  initialTime.current = new Date();
@@ -55,22 +51,18 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
55
51
  const currentTime = new Date();
56
52
  elapsedTime = (currentTime - initialTime.current) / 1000;
57
53
  }
58
-
59
54
  const translationDiff = Math.floor(KEY_EVENT_ACCELERATION * elapsedTime ** 2) || 1;
60
-
61
55
  if ([37, 39].includes(keyCode)) {
62
56
  const sign = keyCode === 37 ? -1 : 1;
63
57
  const newTranslateX = tempTranslateXRef.current + sign * translationDiff;
64
58
  setTempTranslateX(newTranslateX);
65
59
  }
66
-
67
60
  if ([38, 40].includes(keyCode)) {
68
61
  const sign = keyCode === 38 ? -1 : 1;
69
62
  const newTranslateY = tempTranslateYRef.current + sign * translationDiff;
70
63
  setTempTranslateY(newTranslateY);
71
64
  }
72
65
  };
73
-
74
66
  const stopMovement = useCallback(debounce(() => {
75
67
  direction.current = 0;
76
68
  initialTime.current = null;
@@ -83,41 +75,36 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
83
75
  // If the active element is in the modal header, footer or controls.
84
76
  if (EVENT_EXCEPTION_ELEMENT_IDS.some(id => {
85
77
  var _document$getElementB;
86
-
87
78
  return (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.contains(document.activeElement);
88
79
  })) {
89
80
  return;
90
81
  }
91
-
92
82
  onKeyDown(event);
93
- }; // Adds the event listener when component did mount
94
-
95
-
83
+ };
84
+ // Adds the event listener when component did mount
96
85
  document.addEventListener('keydown', onKeyDownWrapper);
97
86
  return () => {
98
87
  // Removes the event listener when component will unmount
99
88
  document.removeEventListener('keydown', onKeyDownWrapper);
100
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
89
+ };
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
101
91
  }, []);
102
92
  useEffect(() => {
103
93
  if (isMoving && direction.current !== 0) {
104
94
  stopMovement();
105
- } // eslint-disable-next-line react-hooks/exhaustive-deps
106
-
95
+ }
96
+ // eslint-disable-next-line react-hooks/exhaustive-deps
107
97
  }, [tempTranslateX, tempTranslateY]);
108
98
  }
109
-
110
99
  function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving) {
111
100
  const initialPageX = useRef(0);
112
101
  const initialPageY = useRef(0);
113
102
  const isDragging = useRef(false);
114
103
  const imgElement = useRef(null);
115
-
116
104
  const onStopMove = isMouseEvent => () => {
117
105
  isDragging.current = false;
118
106
  initialPageX.current = 0;
119
107
  initialPageY.current = 0;
120
-
121
108
  if (imgElement.current) {
122
109
  const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
123
110
  imgElement.current[move] = null;
@@ -125,15 +112,12 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
125
112
  imgElement.current[cancel] = null;
126
113
  imgElement.current = null;
127
114
  }
128
-
129
115
  setIsMoving(false);
130
116
  };
131
-
132
117
  const onMove = isMouseEvent => e => {
133
118
  if (!isDragging.current) {
134
119
  return onStopMove();
135
120
  }
136
-
137
121
  const {
138
122
  clientX,
139
123
  clientY
@@ -141,7 +125,6 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
141
125
  setTempTranslateX(tempTranslateX + clientX - initialPageX.current);
142
126
  setTempTranslateY(tempTranslateY + clientY - initialPageY.current);
143
127
  };
144
-
145
128
  const onStartMove = (e, isMouseEvent) => {
146
129
  isDragging.current = true;
147
130
  const {
@@ -155,79 +138,69 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
155
138
  initialPageY.current = clientY;
156
139
  const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
157
140
  target[move] = onMove(isMouseEvent);
158
- target[end] = onStopMove(isMouseEvent); // Should stop the movement when touch/mouse leaves the preview
159
-
141
+ target[end] = onStopMove(isMouseEvent);
142
+ // Should stop the movement when touch/mouse leaves the preview
160
143
  target[cancel] = onStopMove(isMouseEvent);
161
144
  imgElement.current = target;
162
145
  setIsMoving(true);
163
146
  };
164
-
165
147
  return [e => onStartMove(e, true), e => onStartMove(e, false)];
166
148
  }
167
-
168
149
  export function useKeyMouseTouchEvents(translateX, translateY, dispatch) {
169
150
  const [tempTranslateX, _setTempTranslateX] = useState(translateX);
170
151
  const [tempTranslateY, _setTempTranslateY] = useState(translateY);
171
- const [isMoving, setIsMoving] = useState(false); // These are used to get the current values when the callback is called from outside.
152
+ const [isMoving, setIsMoving] = useState(false);
172
153
 
154
+ // These are used to get the current values when the callback is called from outside.
173
155
  const tempTranslateXRef = useRef(tempTranslateX);
174
156
  const tempTranslateYRef = useRef(tempTranslateY);
175
-
176
157
  const setTempTranslateX = data => {
177
158
  setIsMoving(true);
178
159
  tempTranslateXRef.current = data;
179
-
180
160
  _setTempTranslateX(data);
181
161
  };
182
-
183
162
  const setTempTranslateY = data => {
184
163
  setIsMoving(true);
185
164
  tempTranslateYRef.current = data;
186
-
187
165
  _setTempTranslateY(data);
188
166
  };
189
-
190
167
  useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch);
191
- const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving); // Updates the reducer state when user stops moving.
168
+ const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving);
192
169
 
170
+ // Updates the reducer state when user stops moving.
193
171
  useEffect(() => {
194
172
  if (isMoving) {
195
173
  return;
196
174
  }
197
-
198
175
  if (tempTranslateX !== translateX) {
199
176
  dispatch({
200
177
  type: actions.SET_TRANSLATE_X,
201
178
  payload: tempTranslateX
202
179
  });
203
180
  }
204
-
205
181
  if (tempTranslateY !== translateY) {
206
182
  dispatch({
207
183
  type: actions.SET_TRANSLATE_Y,
208
184
  payload: tempTranslateY
209
185
  });
210
- } // eslint-disable-next-line react-hooks/exhaustive-deps
211
-
212
- }, [isMoving]); // Updates the component state when props changed.
186
+ }
187
+ // eslint-disable-next-line react-hooks/exhaustive-deps
188
+ }, [isMoving]);
213
189
 
190
+ // Updates the component state when props changed.
214
191
  useEffect(() => {
215
192
  if (isMoving) {
216
193
  return;
217
194
  }
218
-
219
195
  if (translateX !== tempTranslateX) {
220
196
  tempTranslateXRef.current = translateX;
221
-
222
197
  _setTempTranslateX(translateX);
223
198
  }
224
-
225
199
  if (translateY !== tempTranslateY) {
226
200
  tempTranslateYRef.current = translateY;
227
-
228
201
  _setTempTranslateY(translateY);
229
- } // eslint-disable-next-line react-hooks/exhaustive-deps
230
-
202
+ }
203
+ // eslint-disable-next-line react-hooks/exhaustive-deps
231
204
  }, [translateX, translateY]);
232
205
  return [tempTranslateX, tempTranslateY, onMouseDown, onTouchStart];
233
206
  }
@@ -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 { useEffect, useState } from 'react';
19
20
  import { debounce } from '@instructure/debounce';
20
21
  import { calculateScaleRatio } from './controls/utils';
@@ -23,35 +24,32 @@ import { actions } from './reducers/imageCropper';
23
24
  export function useMouseWheel(scaleRatio, dispatch) {
24
25
  const [tempScaleRatio, setTempScaleRatio] = useState(scaleRatio);
25
26
  const [isScaling, setIsScaling] = useState(false);
26
-
27
27
  const onWheelCallback = event => {
28
28
  // Couldn't prevent modal body scroll when zoom, when using {passive:false}
29
29
  // the zoom event listener makes zoom look like a bouncing effect.
30
30
  // https://chromestatus.com/feature/6662647093133312
31
31
  // event.preventDefault()
32
- const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
33
32
 
33
+ const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
34
34
  if (newScaleRatio !== tempScaleRatio) {
35
35
  setIsScaling(true);
36
36
  setTempScaleRatio(newScaleRatio);
37
37
  }
38
38
  };
39
-
40
39
  const setScalingRatio = () => {
41
40
  setIsScaling(false);
42
41
  };
43
-
44
42
  useEffect(() => {
45
43
  if (!isScaling) {
46
44
  setTempScaleRatio(scaleRatio);
47
- } // eslint-disable-next-line react-hooks/exhaustive-deps
48
-
45
+ }
46
+ // eslint-disable-next-line react-hooks/exhaustive-deps
49
47
  }, [scaleRatio]);
50
48
  useEffect(() => {
51
49
  if (isScaling) {
52
50
  debounce(setScalingRatio, WHEEL_EVENT_DELAY)();
53
- } // eslint-disable-next-line react-hooks/exhaustive-deps
54
-
51
+ }
52
+ // eslint-disable-next-line react-hooks/exhaustive-deps
55
53
  }, [tempScaleRatio]);
56
54
  useEffect(() => {
57
55
  if (!isScaling) {
@@ -59,8 +57,8 @@ export function useMouseWheel(scaleRatio, dispatch) {
59
57
  type: actions.SET_SCALE_RATIO,
60
58
  payload: tempScaleRatio
61
59
  });
62
- } // eslint-disable-next-line react-hooks/exhaustive-deps
63
-
60
+ }
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps
64
62
  }, [isScaling]);
65
63
  return [tempScaleRatio, onWheelCallback];
66
64
  }
@@ -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 { SimpleSelect } from '@instructure/ui-simple-select';
@@ -28,7 +29,6 @@ import { Tooltip } from '@instructure/ui-tooltip';
28
29
  import { CUSTOM, MIN_HEIGHT, MIN_WIDTH, MIN_PERCENTAGE, imageSizes, labelForImageSize } from '../instructure_image/ImageEmbedOptions';
29
30
  import formatMessage from '../../../format-message';
30
31
  import DimensionsInput from './DimensionsInput';
31
-
32
32
  const ImageOptionsForm = _ref => {
33
33
  let {
34
34
  imageSize,
@@ -137,5 +137,4 @@ const ImageOptionsForm = _ref => {
137
137
  minPercentage: MIN_PERCENTAGE
138
138
  })))));
139
139
  };
140
-
141
140
  export default ImageOptionsForm;