@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 } from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import { View } from '@instructure/ui-view';
@@ -27,12 +28,11 @@ import { isAnUnsupportedGifPngImage, MAX_GIF_PNG_SIZE_BYTES } from './utils';
27
28
  import { actions as svgActions } from '../../../reducers/svgSettings';
28
29
  import formatMessage from '../../../../../../format-message';
29
30
  import { PREVIEW_WIDTH, PREVIEW_HEIGHT } from '../../../../shared/ImageCropper/constants';
30
-
31
31
  const dispatchImage = async (dispatch, onChange, dataUrl, dataBlob) => {
32
32
  let image = dataUrl;
33
-
34
33
  if (isAnUnsupportedGifPngImage(dataBlob)) {
35
- dispatch({ ...actions.CLEAR_IMAGE
34
+ dispatch({
35
+ ...actions.CLEAR_IMAGE
36
36
  });
37
37
  return onChange({
38
38
  type: svgActions.SET_ERROR,
@@ -41,18 +41,18 @@ const dispatchImage = async (dispatch, onChange, dataUrl, dataBlob) => {
41
41
  })
42
42
  });
43
43
  }
44
-
45
- dispatch({ ...actions.SET_IMAGE,
44
+ dispatch({
45
+ ...actions.SET_IMAGE,
46
46
  payload: ''
47
47
  });
48
- dispatch({ ...actions.SET_CROPPER_OPEN,
48
+ dispatch({
49
+ ...actions.SET_CROPPER_OPEN,
49
50
  payload: true
50
51
  });
51
52
  onChange({
52
53
  type: svgActions.SET_EMBED_IMAGE,
53
54
  payload: ''
54
55
  });
55
-
56
56
  if (canCompressImage() && shouldCompressImage(dataBlob)) {
57
57
  try {
58
58
  // If compression fails, use the original one
@@ -63,16 +63,15 @@ const dispatchImage = async (dispatch, onChange, dataUrl, dataBlob) => {
63
63
  previewHeight: PREVIEW_HEIGHT
64
64
  });
65
65
  } catch (e) {
66
- // eslint-disable-next-line no-console
67
66
  console.error(e);
68
67
  }
69
-
70
- dispatch({ ...actions.SET_COMPRESSION_STATUS,
68
+ dispatch({
69
+ ...actions.SET_COMPRESSION_STATUS,
71
70
  payload: true
72
71
  });
73
72
  }
74
-
75
- dispatch({ ...actions.SET_IMAGE,
73
+ dispatch({
74
+ ...actions.SET_IMAGE,
76
75
  payload: image
77
76
  });
78
77
  onChange({
@@ -80,15 +79,13 @@ const dispatchImage = async (dispatch, onChange, dataUrl, dataBlob) => {
80
79
  payload: image
81
80
  });
82
81
  };
83
-
84
- const Course = _ref => {
85
- let {
86
- dispatch,
87
- onChange,
88
- onLoading,
89
- onLoaded,
90
- canvasOrigin
91
- } = _ref;
82
+ const Course = ({
83
+ dispatch,
84
+ onChange,
85
+ onLoading,
86
+ onLoaded,
87
+ canvasOrigin
88
+ }) => {
92
89
  const storeProps = useStoreProps();
93
90
  const {
94
91
  files,
@@ -102,26 +99,30 @@ const Course = _ref => {
102
99
  dataLoading,
103
100
  dataBlob
104
101
  } = useDataUrl();
105
- const category = 'uncategorized'; // Handle image selection
102
+ const category = 'uncategorized';
106
103
 
104
+ // Handle image selection
107
105
  useEffect(() => {
108
106
  // Don't clear the current image on re-render
109
107
  if (!dataUrl || !dataBlob) return;
110
- dispatchImage(dispatch, onChange, dataUrl, dataBlob); // eslint-disable-next-line react-hooks/exhaustive-deps
111
- }, [dataUrl, dataBlob]); // Handle loading states
108
+ dispatchImage(dispatch, onChange, dataUrl, dataBlob);
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ }, [dataUrl, dataBlob]);
112
111
 
112
+ // Handle loading states
113
113
  useEffect(() => {
114
114
  dispatch(dataLoading ? actions.START_LOADING : actions.STOP_LOADING);
115
-
116
115
  if (dataUrl) {
117
- dispatch({ ...actions.SET_IMAGE_COLLECTION_OPEN,
116
+ dispatch({
117
+ ...actions.SET_IMAGE_COLLECTION_OPEN,
118
118
  payload: false
119
119
  });
120
- } // eslint-disable-next-line react-hooks/exhaustive-deps
121
-
120
+ }
121
+ // eslint-disable-next-line react-hooks/exhaustive-deps
122
122
  }, [dataLoading]);
123
123
  useEffect(() => {
124
- if (isLoading) onLoading && onLoading();else onLoaded && onLoaded(); // eslint-disable-next-line react-hooks/exhaustive-deps
124
+ if (isLoading) onLoading && onLoading();else onLoaded && onLoaded();
125
+ // eslint-disable-next-line react-hooks/exhaustive-deps
125
126
  }, [isLoading]);
126
127
  return /*#__PURE__*/React.createElement(View, null, /*#__PURE__*/React.createElement(ImageList, {
127
128
  fetchInitialImages: () => storeProps.fetchInitialImages({
@@ -145,14 +146,14 @@ const Course = _ref => {
145
146
  },
146
147
  onImageEmbed: file => {
147
148
  setUrl(file.download_url);
148
- dispatch({ ...actions.SET_IMAGE_NAME,
149
+ dispatch({
150
+ ...actions.SET_IMAGE_NAME,
149
151
  payload: file.filename
150
152
  });
151
153
  },
152
154
  canvasOrigin: canvasOrigin
153
155
  }));
154
156
  };
155
-
156
157
  Course.propTypes = {
157
158
  dispatch: PropTypes.func,
158
159
  onChange: PropTypes.func,
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React, { useState, useCallback, useEffect } from 'react';
19
20
  import formatMessage from '../../../../../../format-message';
20
21
  import { actions, modes } from '../../../reducers/imageSection';
@@ -35,15 +36,12 @@ import { createCroppedImageSvg } from '../../../../shared/ImageCropper/imageCrop
35
36
  import { convertFileToBase64 } from '../../../../shared/fileUtils';
36
37
  import { ImageSettingsPropTypes } from './propTypes';
37
38
  import _ from 'lodash';
38
-
39
39
  const getCompressionMessage = () => formatMessage('Your image has been compressed for Icon Maker. Images less than {size} KB will not be compressed.', {
40
40
  size: MAX_IMAGE_SIZE_BYTES / 1024
41
41
  });
42
-
43
- function renderImagePreview(_ref, embedImage) {
44
- let {
45
- loading
46
- } = _ref;
42
+ function renderImagePreview({
43
+ loading
44
+ }, embedImage) {
47
45
  return /*#__PURE__*/React.createElement(PreviewIcon, {
48
46
  variant: "large",
49
47
  testId: "selected-image-preview",
@@ -52,22 +50,18 @@ function renderImagePreview(_ref, embedImage) {
52
50
  checkered: true
53
51
  });
54
52
  }
55
-
56
- function renderImageName(_ref2) {
57
- let {
58
- imageName
59
- } = _ref2;
53
+ function renderImageName({
54
+ imageName
55
+ }) {
60
56
  return /*#__PURE__*/React.createElement(View, {
61
57
  maxWidth: "200px",
62
58
  as: "div"
63
59
  }, /*#__PURE__*/React.createElement(TruncateText, null, /*#__PURE__*/React.createElement(Text, null, imageName || formatMessage('None Selected'))));
64
60
  }
65
-
66
- function renderImageActionButtons(_ref3, dispatch, trayDispatch, setFocus, ref) {
67
- let {
68
- mode,
69
- collectionOpen
70
- } = _ref3;
61
+ function renderImageActionButtons({
62
+ mode,
63
+ collectionOpen
64
+ }, dispatch, trayDispatch, setFocus, ref) {
71
65
  const showCropButton = [modes.uploadImages.type, modes.courseImages.type].includes(mode) && !collectionOpen;
72
66
  return /*#__PURE__*/React.createElement(React.Fragment, null, showCropButton && /*#__PURE__*/React.createElement(IconButton, {
73
67
  margin: "0 small 0 0",
@@ -91,30 +85,26 @@ function renderImageActionButtons(_ref3, dispatch, trayDispatch, setFocus, ref)
91
85
  "data-testid": "clear-image"
92
86
  }, /*#__PURE__*/React.createElement(IconTrashLine, null)));
93
87
  }
94
-
95
- export const ImageOptions = _ref4 => {
96
- let {
97
- state,
98
- settings,
99
- dispatch,
100
- mountNode,
101
- trayDispatch
102
- } = _ref4;
88
+ export const ImageOptions = ({
89
+ state,
90
+ settings,
91
+ dispatch,
92
+ mountNode,
93
+ trayDispatch
94
+ }) => {
103
95
  const [isImageActionFocused, setIsImageActionFocused] = useState(false);
104
96
  const imageActionRef = useCallback(el => {
105
97
  if (el && isImageActionFocused) el.focus();
106
- }, [isImageActionFocused]); // After submitting cropper modal a new embedded image should be generated
98
+ }, [isImageActionFocused]);
107
99
 
100
+ // After submitting cropper modal a new embedded image should be generated
108
101
  useEffect(() => {
109
- var _settings$imageSettin;
110
-
111
- if (state.cropperSettings && settings.imageSettings && !_.isEqual(state.cropperSettings, (_settings$imageSettin = settings.imageSettings) === null || _settings$imageSettin === void 0 ? void 0 : _settings$imageSettin.cropperSettings)) {
102
+ if (state.cropperSettings && settings.imageSettings && !_.isEqual(state.cropperSettings, settings.imageSettings?.cropperSettings)) {
112
103
  if (state.cropperSettings.shape !== settings.shape) {
113
104
  trayDispatch({
114
105
  shape: state.cropperSettings.shape
115
106
  });
116
107
  }
117
-
118
108
  createCroppedImageSvg(state.cropperSettings, settings.imageSettings.image).then(generatedSvg => convertFileToBase64(new Blob([generatedSvg.outerHTML], {
119
109
  type: 'image/svg+xml'
120
110
  }))).then(base64Image => {
@@ -122,10 +112,9 @@ export const ImageOptions = _ref4 => {
122
112
  type: trayActions.SET_EMBED_IMAGE,
123
113
  payload: base64Image
124
114
  });
125
- }) // eslint-disable-next-line no-console
126
- .catch(error => console.error(error));
127
- } // eslint-disable-next-line react-hooks/exhaustive-deps
128
-
115
+ }).catch(error => console.error(error));
116
+ }
117
+ // eslint-disable-next-line react-hooks/exhaustive-deps
129
118
  }, [state.cropperSettings]);
130
119
  const {
131
120
  image
@@ -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, { useReducer, useEffect, useRef, Suspense } from 'react';
19
20
  import _ from 'lodash';
20
21
  import PropTypes from 'prop-types';
@@ -33,19 +34,15 @@ import { transformForShape } from '../../../svg/image';
33
34
  import SingleColorSVG from './SingleColor/svg';
34
35
  import { createCroppedImageSvg } from '../../../../shared/ImageCropper/imageCropUtils';
35
36
  const IMAGE_SECTION_ID = 'icon-maker-tray-image-section';
36
-
37
37
  const getImageSection = () => document.querySelector(`#${IMAGE_SECTION_ID}`);
38
-
39
38
  const scrollToBottom = () => {
40
39
  const section = getImageSection();
41
-
42
- if (section !== null && section !== void 0 && section.scrollIntoView) {
40
+ if (section?.scrollIntoView) {
43
41
  section.scrollIntoView({
44
42
  behavior: 'smooth'
45
43
  });
46
44
  }
47
45
  };
48
-
49
46
  const filterSectionStateMetadata = state => {
50
47
  const {
51
48
  mode,
@@ -64,23 +61,22 @@ const filterSectionStateMetadata = state => {
64
61
  cropperSettings
65
62
  };
66
63
  };
67
-
68
- export const ImageSection = _ref => {
69
- let {
70
- settings,
71
- onChange,
72
- editor,
73
- canvasOrigin
74
- } = _ref;
64
+ export const ImageSection = ({
65
+ settings,
66
+ onChange,
67
+ editor,
68
+ canvasOrigin
69
+ }) => {
75
70
  const [state, dispatch] = useReducer(reducer, initialState);
76
71
  const Upload = /*#__PURE__*/React.lazy(() => import('./Upload'));
77
72
  const SingleColor = /*#__PURE__*/React.lazy(() => import('./SingleColor'));
78
- const MultiColor = /*#__PURE__*/React.lazy(() => import('./MultiColor')); // This object maps image selection modes to the
73
+ const MultiColor = /*#__PURE__*/React.lazy(() => import('./MultiColor'));
74
+
75
+ // This object maps image selection modes to the
79
76
  // component that handles that selection.
80
77
  //
81
78
  // The selected component is dynamically rendered
82
79
  // in this component's returned JSX
83
-
84
80
  const allowedModes = {
85
81
  [modes.courseImages.type]: Course,
86
82
  [modes.uploadImages.type]: Upload,
@@ -90,9 +86,10 @@ export const ImageSection = _ref => {
90
86
  const metadata = filterSectionStateMetadata(state);
91
87
  const isMetadataLoaded = useRef(false);
92
88
  useEffect(() => {
93
- const transform = transformForShape(settings.shape, settings.size); // Set Q1 crop defaults
94
- // TODO: Set these properties based on cropper
89
+ const transform = transformForShape(settings.shape, settings.size);
95
90
 
91
+ // Set Q1 crop defaults
92
+ // TODO: Set these properties based on cropper
96
93
  onChange({
97
94
  type: svgActions.SET_X,
98
95
  payload: transform.x
@@ -120,16 +117,18 @@ export const ImageSection = _ref => {
120
117
  }, [onChange, settings.shape, settings.size]);
121
118
  useEffect(() => {
122
119
  if (state.icon && state.icon in SingleColorSVG) {
123
- dispatch({ ...actions.START_LOADING
124
- }); // eslint-disable-next-line promise/catch-or-return
125
-
120
+ dispatch({
121
+ ...actions.START_LOADING
122
+ });
126
123
  convertFileToBase64(new Blob([SingleColorSVG[state.icon].source(state.iconFillColor)], {
127
124
  type: 'image/svg+xml'
128
125
  })).then(base64Image => {
129
- dispatch({ ...actions.SET_IMAGE,
126
+ dispatch({
127
+ ...actions.SET_IMAGE,
130
128
  payload: base64Image
131
129
  });
132
- dispatch({ ...actions.STOP_LOADING
130
+ dispatch({
131
+ ...actions.STOP_LOADING
133
132
  });
134
133
  onChange({
135
134
  type: svgActions.SET_EMBED_IMAGE,
@@ -137,11 +136,13 @@ export const ImageSection = _ref => {
137
136
  });
138
137
  });
139
138
  }
140
- }, [onChange, state.icon, state.iconFillColor]); // After a new shape is selected in shape section a new embedded image should be generated
139
+ }, [onChange, state.icon, state.iconFillColor]);
141
140
 
141
+ // After a new shape is selected in shape section a new embedded image should be generated
142
142
  useEffect(() => {
143
143
  if (state.cropperSettings && settings.shape !== state.cropperSettings.shape) {
144
- const newCropperSettings = { ...state.cropperSettings,
144
+ const newCropperSettings = {
145
+ ...state.cropperSettings,
145
146
  shape: settings.shape
146
147
  };
147
148
  dispatch({
@@ -155,10 +156,9 @@ export const ImageSection = _ref => {
155
156
  type: svgActions.SET_EMBED_IMAGE,
156
157
  payload: base64Image
157
158
  });
158
- }) // eslint-disable-next-line no-console
159
- .catch(error => console.error(error));
160
- } // eslint-disable-next-line react-hooks/exhaustive-deps
161
-
159
+ }).catch(error => console.error(error));
160
+ }
161
+ // eslint-disable-next-line react-hooks/exhaustive-deps
162
162
  }, [settings.shape]);
163
163
  useEffect(() => {
164
164
  if (settings.imageSettings && !isMetadataLoaded.current && !_.isEqual(settings.imageSettings, metadata)) {
@@ -167,8 +167,8 @@ export const ImageSection = _ref => {
167
167
  type: actions.UPDATE_SETTINGS.type,
168
168
  payload: settings.imageSettings
169
169
  });
170
- } // eslint-disable-next-line react-hooks/exhaustive-deps
171
-
170
+ }
171
+ // eslint-disable-next-line react-hooks/exhaustive-deps
172
172
  }, [settings.imageSettings]);
173
173
  useEffect(() => {
174
174
  if (!_.isEqual(metadata, settings.imageSettings)) {
@@ -176,8 +176,8 @@ export const ImageSection = _ref => {
176
176
  type: svgActions.SET_IMAGE_SETTINGS,
177
177
  payload: metadata
178
178
  });
179
- } // eslint-disable-next-line react-hooks/exhaustive-deps
180
-
179
+ }
180
+ // eslint-disable-next-line react-hooks/exhaustive-deps
181
181
  }, Object.values(metadata));
182
182
  const modeIsAllowed = !!allowedModes[state.mode];
183
183
  const ImageSelector = allowedModes[state.mode];
@@ -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, { forwardRef } from 'react';
19
20
  import formatMessage from '../../../../../../format-message';
20
21
  import { modes, actions } from '../../../reducers/imageSection';
@@ -23,14 +24,12 @@ import { Button } from '@instructure/ui-buttons';
23
24
  import { IconArrowOpenDownLine } from '@instructure/ui-icons';
24
25
  import { View } from '@instructure/ui-view';
25
26
  import { Menu } from '@instructure/ui-menu';
26
- const ModeSelect = /*#__PURE__*/forwardRef((_ref, ref) => {
27
- let {
28
- dispatch,
29
- mountNode,
30
- onFocus,
31
- onBlur
32
- } = _ref;
33
-
27
+ const ModeSelect = /*#__PURE__*/forwardRef(({
28
+ dispatch,
29
+ mountNode,
30
+ onFocus,
31
+ onBlur
32
+ }, ref) => {
34
33
  const menuFor = mode => /*#__PURE__*/React.createElement(Menu.Item, {
35
34
  key: mode.type,
36
35
  value: mode.type,
@@ -39,18 +38,19 @@ const ModeSelect = /*#__PURE__*/forwardRef((_ref, ref) => {
39
38
  dispatch({
40
39
  type: mode.type
41
40
  });
42
- dispatch({ ...actions.SET_IMAGE_COLLECTION_OPEN,
41
+ dispatch({
42
+ ...actions.SET_IMAGE_COLLECTION_OPEN,
43
43
  payload: true
44
44
  });
45
45
  }
46
46
  }, mode.label);
47
-
48
47
  return /*#__PURE__*/React.createElement(Menu, {
49
48
  mountNode: mountNode,
50
49
  placement: "top",
51
50
  ref: ref,
52
51
  onFocus: onFocus,
53
- onBlur: onBlur // maps to data-position-content
52
+ onBlur: onBlur
53
+ // maps to data-position-content
54
54
  ,
55
55
  id: ICON_MAKER_ADD_IMAGE_MENU_ID,
56
56
  trigger: /*#__PURE__*/React.createElement(Button, {
@@ -15,36 +15,39 @@
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 SVGList, { TYPE } from '../SVGList';
21
22
  import { actions } from '../../../../reducers/imageSection';
22
23
  import { convertFileToBase64 } from '../../../../../shared/fileUtils';
23
24
  import { actions as svgActions } from '../../../../reducers/svgSettings';
24
-
25
- const MultiColor = _ref => {
26
- let {
27
- dispatch,
28
- onChange,
29
- onLoaded
30
- } = _ref;
31
-
25
+ const MultiColor = ({
26
+ dispatch,
27
+ onChange,
28
+ onLoaded
29
+ }) => {
32
30
  const onSelect = (id, svg) => {
33
- dispatch({ ...actions.START_LOADING
31
+ dispatch({
32
+ ...actions.START_LOADING
34
33
  });
35
- dispatch({ ...actions.SET_IMAGE_NAME,
34
+ dispatch({
35
+ ...actions.SET_IMAGE_NAME,
36
36
  payload: svg.label
37
37
  });
38
38
  convertFileToBase64(new Blob([svg.source()], {
39
39
  type: 'image/svg+xml'
40
40
  })).then(base64Image => {
41
- dispatch({ ...actions.SET_IMAGE,
41
+ dispatch({
42
+ ...actions.SET_IMAGE,
42
43
  payload: base64Image
43
44
  });
44
- dispatch({ ...actions.SET_IMAGE_COLLECTION_OPEN,
45
+ dispatch({
46
+ ...actions.SET_IMAGE_COLLECTION_OPEN,
45
47
  payload: false
46
48
  });
47
- dispatch({ ...actions.STOP_LOADING
49
+ dispatch({
50
+ ...actions.STOP_LOADING
48
51
  });
49
52
  onChange({
50
53
  type: svgActions.SET_EMBED_IMAGE,
@@ -52,14 +55,12 @@ const MultiColor = _ref => {
52
55
  });
53
56
  });
54
57
  };
55
-
56
58
  return /*#__PURE__*/React.createElement(SVGList, {
57
59
  type: TYPE.Multicolor,
58
60
  onSelect: onSelect,
59
61
  onMount: onLoaded
60
62
  });
61
63
  };
62
-
63
64
  MultiColor.propTypes = {
64
65
  dispatch: PropTypes.func,
65
66
  onChange: PropTypes.func,
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import formatMessage from '../../../../../../../format-message';
19
20
  export default {
20
21
  art: {
@@ -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 } from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import { Link } from '@instructure/ui-link';
@@ -30,18 +31,18 @@ export const TYPE = {
30
31
  export function svgSourceFor(type) {
31
32
  return type === TYPE.Multicolor ? MultiColorSVG : SingleColorSVG;
32
33
  }
34
+ const SVGList = ({
35
+ type,
36
+ onSelect,
37
+ fillColor,
38
+ onMount
39
+ }) => {
40
+ const svgSourceList = svgSourceFor(type);
33
41
 
34
- const SVGList = _ref => {
35
- let {
36
- type,
37
- onSelect,
38
- fillColor,
39
- onMount
40
- } = _ref;
41
- const svgSourceList = svgSourceFor(type); // Only execute this once
42
-
42
+ // Only execute this once
43
43
  useEffect(() => {
44
- if (onMount) onMount(); // eslint-disable-next-line react-hooks/exhaustive-deps
44
+ if (onMount) onMount();
45
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
46
  }, []);
46
47
  return /*#__PURE__*/React.createElement(Flex, {
47
48
  justifyItems: "start",
@@ -72,7 +73,6 @@ const SVGList = _ref => {
72
73
  fillColor: fillColor
73
74
  }))))));
74
75
  };
75
-
76
76
  SVGList.propTypes = {
77
77
  fillColor: PropTypes.string,
78
78
  type: PropTypes.oneOf(Object.values(TYPE)).isRequired,
@@ -15,30 +15,26 @@
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 { SVGIcon } from '@instructure/ui-svg-images';
21
-
22
- const SVGThumbnail = _ref => {
23
- var _source$name, _source$name2;
24
-
25
- let {
26
- name,
27
- source,
28
- size,
29
- fillColor
30
- } = _ref;
22
+ const SVGThumbnail = ({
23
+ name,
24
+ source,
25
+ size,
26
+ fillColor
27
+ }) => {
31
28
  return /*#__PURE__*/React.createElement("div", {
32
29
  style: {
33
30
  fontSize: size
34
31
  }
35
32
  }, /*#__PURE__*/React.createElement(SVGIcon, {
36
- src: (_source$name = source[name]) === null || _source$name === void 0 ? void 0 : _source$name.source(fillColor),
37
- title: (_source$name2 = source[name]) === null || _source$name2 === void 0 ? void 0 : _source$name2.label,
33
+ src: source[name]?.source(fillColor),
34
+ title: source[name]?.label,
38
35
  "data-testid": `icon-${name}`
39
36
  }));
40
37
  };
41
-
42
38
  SVGThumbnail.propTypes = {
43
39
  size: PropTypes.string,
44
40
  fillColor: PropTypes.string,
@@ -15,33 +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 React from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import SVGList, { TYPE } from '../SVGList';
21
22
  import { actions } from '../../../../reducers/imageSection';
22
-
23
- const SingleColor = _ref => {
24
- let {
25
- data,
26
- dispatch,
27
- onLoaded
28
- } = _ref;
23
+ const SingleColor = ({
24
+ data,
25
+ dispatch,
26
+ onLoaded
27
+ }) => {
29
28
  const {
30
29
  iconFillColor
31
30
  } = data;
32
-
33
31
  const onSelect = (id, svg) => {
34
- dispatch({ ...actions.SET_IMAGE_NAME,
32
+ dispatch({
33
+ ...actions.SET_IMAGE_NAME,
35
34
  payload: svg.label
36
35
  });
37
- dispatch({ ...actions.SET_ICON,
36
+ dispatch({
37
+ ...actions.SET_ICON,
38
38
  payload: id
39
39
  });
40
- dispatch({ ...actions.SET_IMAGE_COLLECTION_OPEN,
40
+ dispatch({
41
+ ...actions.SET_IMAGE_COLLECTION_OPEN,
41
42
  payload: false
42
43
  });
43
44
  };
44
-
45
45
  return /*#__PURE__*/React.createElement(SVGList, {
46
46
  type: TYPE.Singlecolor,
47
47
  onSelect: onSelect,
@@ -49,7 +49,6 @@ const SingleColor = _ref => {
49
49
  onMount: onLoaded
50
50
  });
51
51
  };
52
-
53
52
  SingleColor.propTypes = {
54
53
  dispatch: PropTypes.func,
55
54
  data: PropTypes.shape({