@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, useState } from 'react';
19
20
  import { View } from '@instructure/ui-view';
20
21
  import { Flex } from '@instructure/ui-flex';
@@ -83,56 +84,50 @@ const NAMED_COLORS = [{
83
84
  color: '#FFFFFF',
84
85
  name: formatMessage('White')
85
86
  }, null];
86
- export const ColorInput = _ref => {
87
- var _NAMED_COLORS$find;
88
-
89
- let {
90
- color,
91
- label,
92
- name,
93
- onChange,
94
- popoverMountNode,
95
- width = '11rem',
96
- readonly = false,
97
- requireColor = false
98
- } = _ref;
87
+ export const ColorInput = ({
88
+ color,
89
+ label,
90
+ name,
91
+ onChange,
92
+ popoverMountNode,
93
+ width = '11rem',
94
+ readonly = false,
95
+ requireColor = false
96
+ }) => {
99
97
  const [isOpen, setIsOpen] = useState(false);
100
98
  const [inputValue, setInputValue] = useState(color);
101
- const colorName = (_NAMED_COLORS$find = NAMED_COLORS.find(c => (c === null || c === void 0 ? void 0 : c.color) === color)) === null || _NAMED_COLORS$find === void 0 ? void 0 : _NAMED_COLORS$find.name;
99
+ const colorName = NAMED_COLORS.find(c => c?.color === color)?.name;
102
100
  useEffect(() => {
103
101
  setInputValue(color);
104
- }, [color]); // fire onChange in case value is valid
102
+ }, [color]);
105
103
 
104
+ // fire onChange in case value is valid
106
105
  const handleColorChange = hex => {
107
106
  if (isValidHex(hex)) {
108
107
  onChange(hex);
109
108
  }
110
-
111
109
  if (!hex || !hex.length) {
112
110
  onChange(null);
113
111
  }
114
-
115
112
  setInputValue(hex);
116
- }; // reset the input value on blur if invalid
117
-
113
+ };
118
114
 
115
+ // reset the input value on blur if invalid
119
116
  const handleInputBlur = () => {
120
117
  if (!inputValue || inputValue.length > 0 && !isValidHex(inputValue)) {
121
118
  setInputValue(color);
122
119
  }
123
120
  };
124
-
125
121
  const colorPreviews = NAMED_COLORS.map(c => /*#__PURE__*/React.createElement(ColorPreview, {
126
- key: `${name}-${c === null || c === void 0 ? void 0 : c.color}`,
127
- color: c === null || c === void 0 ? void 0 : c.color,
128
- name: c === null || c === void 0 ? void 0 : c.name,
122
+ key: `${name}-${c?.color}`,
123
+ color: c?.color,
124
+ name: c?.name,
129
125
  disabled: !isOpen,
130
126
  onSelect: () => {
131
- handleColorChange(c === null || c === void 0 ? void 0 : c.color);
127
+ handleColorChange(c?.color);
132
128
  setIsOpen(false);
133
129
  }
134
130
  }));
135
-
136
131
  function renderPopover() {
137
132
  const pickerLabel = colorName ? formatMessage('Color Picker ({colorName} selected)', {
138
133
  colorName
@@ -167,7 +162,6 @@ export const ColorInput = _ref => {
167
162
  "data-testid": `${name}-popover`
168
163
  }, requireColor ? colorPreviews.slice(0, -1) : colorPreviews));
169
164
  }
170
-
171
165
  return /*#__PURE__*/React.createElement(View, {
172
166
  as: "div"
173
167
  }, /*#__PURE__*/React.createElement(TextInput, {
@@ -190,15 +184,13 @@ export const ColorInput = _ref => {
190
184
  interaction: readonly ? 'readonly' : undefined
191
185
  }));
192
186
  };
193
-
194
- function ColorPreview(_ref2) {
195
- let {
196
- color,
197
- name,
198
- disabled,
199
- margin = 'xxx-small',
200
- onSelect
201
- } = _ref2;
187
+ function ColorPreview({
188
+ color,
189
+ name,
190
+ disabled,
191
+ margin = 'xxx-small',
192
+ onSelect
193
+ }) {
202
194
  return /*#__PURE__*/React.createElement(BaseButton, {
203
195
  interaction: disabled ? 'readonly' : undefined,
204
196
  isCondensed: true,
@@ -216,17 +208,13 @@ function ColorPreview(_ref2) {
216
208
  testId: `colorPreview-${color || 'none'}`
217
209
  }));
218
210
  }
219
-
220
211
  function isValidHex(color) {
221
212
  if (!color) return false;
222
-
223
213
  switch (color.length) {
224
214
  case 4:
225
215
  return /^#[0-9A-F]{3}$/i.test(color);
226
-
227
216
  case 7:
228
217
  return /^#[0-9A-F]{6}$/i.test(color);
229
-
230
218
  default:
231
219
  return false;
232
220
  }
@@ -15,15 +15,15 @@
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 { bool, element, oneOfType, arrayOf } from 'prop-types';
20
21
  import { Tooltip } from '@instructure/ui-tooltip';
21
- export const ConditionalTooltip = _ref => {
22
- let {
23
- condition,
24
- children,
25
- ...tooltipProps
26
- } = _ref;
22
+ export const ConditionalTooltip = ({
23
+ condition,
24
+ children,
25
+ ...tooltipProps
26
+ }) => {
27
27
  return condition ? /*#__PURE__*/React.createElement(Tooltip, tooltipProps, children) : /*#__PURE__*/React.createElement(React.Fragment, null, children);
28
28
  };
29
29
  ConditionalTooltip.propTypes = {
@@ -15,13 +15,13 @@
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
- import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
19
- import { isOnlyTextSelected } from '../../contentInsertionUtils'; // eslint-disable-next-line import/no-nodejs-modules
20
18
 
21
- import * as url from 'url';
19
+ import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
20
+ import { isOnlyTextSelected } from '../../contentInsertionUtils';
22
21
  import formatMessage from '../../../format-message';
23
22
  import { isStudioEmbeddedMedia } from './StudioLtiSupportUtils';
24
23
  import RCEGlobals from '../../RCEGlobals';
24
+ import { parseUrlPath } from '../../../util/url-util';
25
25
  const FILE_DOWNLOAD_PATH_REGEX = /^\/(courses\/\d+\/)?files\/\d+\/download$/;
26
26
  export const LINK_TYPE = 'link';
27
27
  export const FILE_LINK_TYPE = 'file-link';
@@ -34,38 +34,29 @@ export const DISPLAY_AS_EMBED = 'embed';
34
34
  export const DISPLAY_AS_EMBED_DISABLED = 'embed-disabled';
35
35
  export const DISPLAY_AS_DOWNLOAD_LINK = 'download-link';
36
36
  export function asImageEmbed($element) {
37
- const nodeName = $element === null || $element === void 0 ? void 0 : $element.nodeName.toLowerCase();
38
-
37
+ const nodeName = $element?.nodeName.toLowerCase();
39
38
  if (nodeName !== 'img') {
40
39
  return null;
41
40
  }
42
-
43
- return { ...fromImageEmbed($element),
41
+ return {
42
+ ...fromImageEmbed($element),
44
43
  $element,
45
44
  type: IMAGE_EMBED_TYPE
46
45
  };
47
46
  }
48
47
  export function asLink($element, editor) {
49
- var _$link;
50
-
51
48
  let $link = $element;
52
-
53
- if (((_$link = $link) === null || _$link === void 0 ? void 0 : _$link.tagName) !== 'A') {
49
+ if ($link?.tagName !== 'A') {
54
50
  // the user may have selected some text that is w/in a link
55
51
  // but didn't include the <a>. Let's see if that's true
56
- $link = editor.dom.getParent($link, 'a[href]');
52
+ $link = editor && editor.dom.getParent($link, 'a[href]');
57
53
  }
58
-
59
54
  if (!$link || $link.tagName !== 'A' || !$link.href) {
60
55
  return null;
61
56
  }
62
-
63
- const {
64
- pathname
65
- } = url.parse($link.href);
57
+ const pathname = parseUrlPath($link.href);
66
58
  const type = FILE_DOWNLOAD_PATH_REGEX.test(pathname) ? FILE_LINK_TYPE : LINK_TYPE;
67
59
  let displayAs = DISPLAY_AS_LINK;
68
-
69
60
  if ($link.classList.contains('no_preview')) {
70
61
  displayAs = DISPLAY_AS_DOWNLOAD_LINK;
71
62
  } else if ($link.classList.contains('auto_open')) {
@@ -73,7 +64,6 @@ export function asLink($element, editor) {
73
64
  } else if ($link.classList.contains('inline_disabled')) {
74
65
  displayAs = DISPLAY_AS_EMBED_DISABLED;
75
66
  }
76
-
77
67
  const contentType = $link.getAttribute('data-course-type');
78
68
  const fileName = $link.getAttribute('title');
79
69
  const published = $link.getAttribute('data-published') === 'true';
@@ -91,7 +81,9 @@ export function asLink($element, editor) {
91
81
  fileName,
92
82
  published
93
83
  };
94
- } // the video element is a bit tricky.
84
+ }
85
+
86
+ // the video element is a bit tricky.
95
87
  // tinymce won't let me add many attributes to the iframe,
96
88
  // even though I've listed them in tinymce.config.js
97
89
  // extended_valid_elements.
@@ -99,99 +91,76 @@ export function asLink($element, editor) {
99
91
  // and it's attributes, even though this could change with future
100
92
  // tinymce releases.
101
93
  // see https://github.com/tinymce/tinymce/issues/5181
102
-
103
94
  export function asVideoElement($element) {
104
- var _$videoElem$parentEle;
105
-
106
95
  const $videoElem = findMediaPlayerIframe($element);
107
-
108
96
  if (!isVideoElement($videoElem) && !isStudioEmbeddedMedia($videoElem)) {
109
97
  return null;
110
98
  }
111
-
112
- return { ...fromVideoEmbed($videoElem),
99
+ return {
100
+ ...fromVideoEmbed($videoElem),
113
101
  $element,
114
102
  type: VIDEO_EMBED_TYPE,
115
- id: ((_$videoElem$parentEle = $videoElem.parentElement) === null || _$videoElem$parentEle === void 0 ? void 0 : _$videoElem$parentEle.getAttribute('data-mce-p-data-media-id')) || $videoElem.getAttribute('data-mce-p-data-media-id')
103
+ id: $videoElem.parentElement?.getAttribute('data-mce-p-data-media-id') || $videoElem.getAttribute('data-mce-p-data-media-id')
116
104
  };
117
105
  }
118
106
  export function asAudioElement($element) {
119
- var _$element$parentEleme;
120
-
121
107
  if (!$element) {
122
108
  return null;
123
109
  }
124
-
125
110
  const $audioIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
126
111
  const $tinymceIframeShim = $audioIframe.parentElement;
127
112
  const title = ($audioIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
128
113
  const audioOptions = {
129
114
  titleText: title,
130
- id: ((_$element$parentEleme = $element.parentElement) === null || _$element$parentEleme === void 0 ? void 0 : _$element$parentEleme.getAttribute('data-mce-p-data-media-id')) || $element.getAttribute('data-mce-p-data-media-id')
115
+ id: $element.parentElement?.getAttribute('data-mce-p-data-media-id') || $element.getAttribute('data-mce-p-data-media-id')
131
116
  };
132
-
133
117
  if ($audioIframe.tagName === 'IFRAME') {
134
118
  const audioDoc = $audioIframe.contentDocument;
135
-
136
119
  try {
137
- var _audioDoc$querySelect;
138
-
139
- const trackSJson = (_audioDoc$querySelect = audioDoc.querySelector('[data-tracks]')) === null || _audioDoc$querySelect === void 0 ? void 0 : _audioDoc$querySelect.getAttribute('data-tracks');
140
-
120
+ const trackSJson = audioDoc.querySelector('[data-tracks]')?.getAttribute('data-tracks');
141
121
  if (trackSJson) {
142
122
  audioOptions.tracks = JSON.parse(trackSJson);
143
- } // eslint-disable-next-line no-empty
144
-
123
+ }
124
+ // eslint-disable-next-line no-empty
145
125
  } catch (e) {}
146
126
  }
147
-
148
127
  if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
149
128
  const source = $audioIframe.getAttribute('src');
150
- const matches = source === null || source === void 0 ? void 0 : source.match(/\/media_attachments_iframe\/(\d+)/);
151
-
129
+ const matches = source?.match(/\/media_attachments_iframe\/(\d+)/);
152
130
  if (matches) {
153
131
  audioOptions.attachmentId = matches[1];
154
132
  }
155
133
  }
156
-
157
134
  return audioOptions;
158
135
  }
159
-
160
136
  function asText($element, editor) {
161
137
  const text = editor && editor.selection.getContent({
162
138
  format: 'text'
163
139
  });
164
-
165
140
  if (!text) {
166
141
  return null;
167
142
  }
168
-
169
143
  return {
170
144
  $element,
171
145
  text,
172
146
  type: TEXT_TYPE
173
147
  };
174
148
  }
175
-
176
149
  function asNone($element) {
177
150
  return {
178
151
  $element: $element || null,
179
152
  type: NONE_TYPE
180
153
  };
181
154
  }
182
-
183
155
  export function getContentFromElement($element, editor) {
184
156
  if (!($element && $element.nodeName)) {
185
157
  return asNone();
186
158
  }
187
-
188
159
  const content = asLink($element, editor) || asImageEmbed($element) || asVideoElement($element) || asText($element, editor) || asNone($element);
189
160
  return content;
190
161
  }
191
- export function getContentFromEditor(editor) {
192
- let expandSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
162
+ export function getContentFromEditor(editor, expandSelection = false) {
193
163
  let $element;
194
-
195
164
  if (editor && editor.selection) {
196
165
  // tinymce selects the element around the cursor, whether it's
197
166
  // content is selected in the copy/paste sense or not.
@@ -201,15 +170,14 @@ export function getContentFromEditor(editor) {
201
170
  $element = editor.selection.getNode();
202
171
  }
203
172
  }
204
-
205
173
  if ($element == null) {
206
174
  return asNone();
207
175
  }
208
-
209
176
  return getContentFromElement($element, editor);
210
- } // if the selection is somewhere w/in a <a>,
211
- // find the <a> and return it's info
177
+ }
212
178
 
179
+ // if the selection is somewhere w/in a <a>,
180
+ // find the <a> and return it's info
213
181
  export function getLinkContentFromEditor(editor) {
214
182
  const $element = editor.selection.getNode();
215
183
  return $element ? asLink($element, editor) : null;
@@ -220,33 +188,24 @@ export function isFileLink($element, editor) {
220
188
  export function isImageEmbed($element) {
221
189
  return !!asImageEmbed($element) && !$element.getAttribute('data-placeholder-for');
222
190
  }
223
-
224
191
  function isMediaElement($element, mediaType) {
225
- var _tinymceIframeShim$fi, _tinymceIframeShim$ge;
226
-
227
192
  // the video is hosted in an iframe, but tinymce
228
193
  // wraps it in a span with swizzled attribute names
229
- if (!($element !== null && $element !== void 0 && $element.getAttribute) || !$element) {
194
+ if (!$element?.getAttribute || !$element) {
230
195
  return false;
231
196
  }
232
-
233
197
  const tinymceIframeShim = $element.tagName === 'IFRAME' ? $element.parentElement : $element;
234
-
235
- if (((_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
198
+ if (tinymceIframeShim.firstElementChild?.tagName !== 'IFRAME') {
236
199
  return false;
237
200
  }
238
-
239
201
  const media_obj_id = tinymceIframeShim.getAttribute('data-mce-p-data-media-id');
240
- const is_media_attachment_iframe = (_tinymceIframeShim$ge = tinymceIframeShim.getAttribute('data-mce-p-src')) === null || _tinymceIframeShim$ge === void 0 ? void 0 : _tinymceIframeShim$ge.includes('media_attachments_iframe');
241
-
202
+ const is_media_attachment_iframe = tinymceIframeShim.getAttribute('data-mce-p-src')?.includes('media_attachments_iframe');
242
203
  if (!media_obj_id && !is_media_attachment_iframe) {
243
204
  return false;
244
205
  }
245
-
246
206
  const media_type = tinymceIframeShim.getAttribute('data-mce-p-data-media-type');
247
207
  return media_type === mediaType;
248
208
  }
249
-
250
209
  export function isVideoElement($element) {
251
210
  return isMediaElement($element, 'video');
252
211
  }
@@ -254,28 +213,20 @@ export function isAudioElement($element) {
254
213
  return isMediaElement($element, 'audio');
255
214
  }
256
215
  export function findMediaPlayerIframe(elem) {
257
- var _elem$firstElementChi;
258
-
259
216
  if (!elem) return null;
260
-
261
217
  if (elem.tagName === 'IFRAME') {
262
218
  // we have the iframe
263
219
  return elem;
264
220
  }
265
-
266
- if (((_elem$firstElementChi = elem.firstElementChild) === null || _elem$firstElementChi === void 0 ? void 0 : _elem$firstElementChi.tagName) === 'IFRAME') {
221
+ if (elem.firstElementChild?.tagName === 'IFRAME') {
267
222
  // we have the shim tinymce puts around the iframe
268
223
  return elem.firstElementChild;
269
224
  }
270
-
271
225
  if (elem.classList.contains('mce-shim')) {
272
- var _elem$previousSibling;
273
-
274
226
  // tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
275
- if (((_elem$previousSibling = elem.previousSibling) === null || _elem$previousSibling === void 0 ? void 0 : _elem$previousSibling.tagName) === 'IFRAME') {
227
+ if (elem.previousSibling?.tagName === 'IFRAME') {
276
228
  return elem.previousSibling;
277
229
  }
278
230
  }
279
-
280
231
  return null;
281
232
  }
@@ -15,52 +15,43 @@
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
  function scaleEvenly(width, height, scaleFactor, constraints) {
19
20
  const minHeight = constraints.minHeight || 0;
20
21
  const minWidth = constraints.minWidth || 0;
21
22
  const scaledWidth = width * scaleFactor;
22
23
  const scaledHeight = height * scaleFactor;
23
24
  let minimumScaleFactor = scaleFactor;
24
-
25
25
  if (scaledWidth < minWidth) {
26
26
  const atLeastMinWidth = Math.max(scaledWidth, minWidth);
27
27
  minimumScaleFactor = atLeastMinWidth / width;
28
28
  }
29
-
30
29
  if (scaledHeight < minHeight) {
31
30
  const atLeastMinHeight = Math.max(scaledHeight, minHeight);
32
31
  minimumScaleFactor = Math.max(atLeastMinHeight / height, minimumScaleFactor);
33
32
  }
34
-
35
33
  return {
36
34
  height: Math.round(height * minimumScaleFactor),
37
35
  width: Math.round(width * minimumScaleFactor)
38
36
  };
39
37
  }
40
-
41
- export function scaleForHeight(width, height, targetHeight) {
42
- let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
43
-
38
+ export function scaleForHeight(width, height, targetHeight, constraints = {}) {
44
39
  if (targetHeight == null) {
45
40
  return {
46
41
  height: null,
47
42
  width: null
48
43
  };
49
44
  }
50
-
51
45
  const scaleFactor = targetHeight / height;
52
46
  return scaleEvenly(width, height, scaleFactor, constraints);
53
47
  }
54
- export function scaleForWidth(width, height, targetWidth) {
55
- let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
56
-
48
+ export function scaleForWidth(width, height, targetWidth, constraints = {}) {
57
49
  if (targetWidth == null) {
58
50
  return {
59
51
  height: null,
60
52
  width: null
61
53
  };
62
54
  }
63
-
64
55
  const scaleFactor = targetWidth / width;
65
56
  return scaleEvenly(width, height, scaleFactor, constraints);
66
57
  }
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import { func, shape, string } from 'prop-types';
20
21
  import { ScreenReaderContent } from '@instructure/ui-a11y-content';
@@ -22,34 +23,33 @@ import { NumberInput } from '@instructure/ui-number-input';
22
23
  export default function DimensionInput(props) {
23
24
  const {
24
25
  dimensionState,
25
- label
26
+ label,
27
+ messages
26
28
  } = props;
27
29
  const {
28
30
  addOffset,
29
31
  inputValue,
30
32
  setInputValue
31
33
  } = dimensionState;
32
-
33
34
  function handleChange(_event, value) {
34
35
  setInputValue(value);
35
36
  }
36
-
37
37
  function handleDecrement() {
38
38
  addOffset(-1);
39
39
  }
40
-
41
40
  function handleIncrement() {
42
41
  addOffset(1);
43
42
  }
44
-
45
43
  return /*#__PURE__*/React.createElement(NumberInput, {
44
+ allowStringValue: true,
46
45
  renderLabel: /*#__PURE__*/React.createElement(ScreenReaderContent, null, label),
47
46
  onChange: handleChange,
48
47
  onDecrement: handleDecrement,
49
48
  onIncrement: handleIncrement,
50
49
  isRequired: true,
51
50
  showArrows: false,
52
- value: inputValue
51
+ value: inputValue,
52
+ messages: messages
53
53
  });
54
54
  }
55
55
  DimensionInput.propTypes = {
@@ -15,24 +15,34 @@
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 { bool, func, number, shape, string } from 'prop-types';
20
21
  import { ScreenReaderContent } from '@instructure/ui-a11y-content';
21
22
  import { FormFieldGroup } from '@instructure/ui-form-field';
22
- import { IconLockLine } from '@instructure/ui-icons';
23
+ import { IconLockLine, IconWarningSolid } from '@instructure/ui-icons';
23
24
  import { Flex } from '@instructure/ui-flex';
24
25
  import { Text } from '@instructure/ui-text';
25
26
  import { RadioInput, RadioInputGroup } from '@instructure/ui-radio-input';
26
27
  import formatMessage from '../../../../format-message';
27
28
  import DimensionInput from './DimensionInput';
28
29
  export { default as useDimensionsState } from './useDimensionsState';
29
-
30
+ const errorMessage = message => {
31
+ return /*#__PURE__*/React.createElement(Flex, {
32
+ gap: "xx-small",
33
+ alignItems: "center"
34
+ }, /*#__PURE__*/React.createElement(IconWarningSolid, {
35
+ color: "error"
36
+ }), /*#__PURE__*/React.createElement(Text, {
37
+ color: "danger",
38
+ size: "small"
39
+ }, message));
40
+ };
30
41
  const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
31
42
  let result = {
32
43
  text: formatMessage('Aspect ratio will be preserved'),
33
44
  type: 'hint'
34
45
  };
35
-
36
46
  if (dimensionsState.usePercentageUnits) {
37
47
  if (!dimensionsState.isNumeric) {
38
48
  result = {
@@ -41,7 +51,7 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
41
51
  };
42
52
  } else if (!dimensionsState.isAtLeastMinimums) {
43
53
  result = {
44
- text: formatMessage('Must be at least {percentage}%', {
54
+ text: formatMessage('Percentage must be at least {percentage}%', {
45
55
  percentage: minPercentage
46
56
  }),
47
57
  type: 'error'
@@ -54,17 +64,15 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
54
64
  };
55
65
  } else if (!dimensionsState.isAtLeastMinimums) {
56
66
  result = {
57
- text: formatMessage('Must be at least {width} x {height}px', {
67
+ text: formatMessage('Pixels must be at least {width} x {height}px', {
58
68
  width: minWidth,
59
69
  height: minHeight
60
70
  }),
61
71
  type: 'error'
62
72
  };
63
73
  }
64
-
65
74
  return result;
66
75
  };
67
-
68
76
  export default function DimensionsInput(props) {
69
77
  const {
70
78
  dimensionsState,
@@ -73,12 +81,24 @@ export default function DimensionsInput(props) {
73
81
  minPercentage,
74
82
  hidePercentage
75
83
  } = props;
76
-
77
84
  const handleDimensionTypeChange = e => {
78
85
  dimensionsState.setUsePercentageUnits(e.target.value === 'percentage');
79
86
  };
80
-
81
87
  const message = getMessage(dimensionsState, minWidth, minHeight, minPercentage);
88
+ const secondaryMessage = {
89
+ ...message,
90
+ text: ''
91
+ };
92
+ const displayMessage = message => {
93
+ if (!message) {
94
+ return;
95
+ }
96
+ return /*#__PURE__*/React.createElement("div", {
97
+ "data-testid": "message"
98
+ }, message.type === 'error' ? errorMessage(message.text) : /*#__PURE__*/React.createElement(Text, {
99
+ size: "small"
100
+ }, message.text));
101
+ };
82
102
  return /*#__PURE__*/React.createElement(Flex, {
83
103
  direction: "column"
84
104
  }, /*#__PURE__*/React.createElement(Flex.Item, {
@@ -100,8 +120,7 @@ export default function DimensionsInput(props) {
100
120
  }))), /*#__PURE__*/React.createElement(Flex.Item, {
101
121
  padding: "small"
102
122
  }, /*#__PURE__*/React.createElement(FormFieldGroup, {
103
- description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions')),
104
- messages: [message]
123
+ description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions'))
105
124
  }, /*#__PURE__*/React.createElement(Flex, {
106
125
  alignItems: "start",
107
126
  direction: "row",
@@ -111,7 +130,8 @@ export default function DimensionsInput(props) {
111
130
  shouldGrow: true
112
131
  }, /*#__PURE__*/React.createElement(DimensionInput, {
113
132
  dimensionState: dimensionsState.percentageState,
114
- label: formatMessage('Percentage')
133
+ label: formatMessage('Percentage'),
134
+ messages: [secondaryMessage]
115
135
  })), /*#__PURE__*/React.createElement(Flex.Item, {
116
136
  padding: "x-small small"
117
137
  }, "%")) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Flex.Item, {
@@ -119,7 +139,8 @@ export default function DimensionsInput(props) {
119
139
  }, /*#__PURE__*/React.createElement(DimensionInput, {
120
140
  dimensionState: dimensionsState.widthState,
121
141
  label: formatMessage('Width'),
122
- minValue: minWidth
142
+ minValue: minWidth,
143
+ messages: [secondaryMessage]
123
144
  })), /*#__PURE__*/React.createElement(Flex.Item, {
124
145
  padding: "x-small small"
125
146
  }, /*#__PURE__*/React.createElement(IconLockLine, null)), /*#__PURE__*/React.createElement(Flex.Item, {
@@ -127,8 +148,9 @@ export default function DimensionsInput(props) {
127
148
  }, /*#__PURE__*/React.createElement(DimensionInput, {
128
149
  dimensionState: dimensionsState.heightState,
129
150
  label: formatMessage('Height'),
130
- minValue: minHeight
131
- })))))));
151
+ minValue: minHeight,
152
+ messages: [secondaryMessage]
153
+ }))))), displayMessage(message)));
132
154
  }
133
155
  DimensionsInput.propTypes = {
134
156
  dimensionsState: shape({