@instructure/canvas-rce 5.14.0 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/__tests__/sidebar/reducers/all_files.test.js +28 -0
  17. package/babel.config.js +3 -1
  18. package/build.sh +7 -7
  19. package/es/bridge/Bridge.js +8 -56
  20. package/es/bridge/index.js +1 -0
  21. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  22. package/es/canvasFileBrowser/en-US.js +3 -6
  23. package/es/common/FlashAlert.js +7 -28
  24. package/es/common/browser.js +4 -2
  25. package/es/common/fileUrl.js +104 -59
  26. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  27. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  28. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  29. package/es/common/incremental-loading/index.js +1 -0
  30. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  31. package/es/common/indicate.js +15 -8
  32. package/es/common/mimeClass.js +3 -4
  33. package/es/common/natcompare.js +1 -4
  34. package/es/defaultTinymceConfig.js +5 -3
  35. package/es/elementDenylist.js +1 -0
  36. package/es/enhance-user-content/doc_previews.js +17 -28
  37. package/es/enhance-user-content/enhance_user_content.js +28 -60
  38. package/es/enhance-user-content/external_links.js +5 -8
  39. package/es/enhance-user-content/index.js +1 -0
  40. package/es/enhance-user-content/instructure_helper.js +25 -38
  41. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  42. package/es/enhance-user-content/mathml.js +35 -82
  43. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  44. package/es/format-message.js +3 -4
  45. package/es/getThemeVars.js +8 -6
  46. package/es/getTranslations.js +1 -78
  47. package/es/index.js +3 -1
  48. package/es/rce/AlertMessageArea.js +1 -1
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +1 -0
  51. package/es/rce/RCE.js +12 -11
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +27 -10
  54. package/es/rce/RCEWrapper.js +167 -386
  55. package/es/rce/RCEWrapperProps.js +8 -3
  56. package/es/rce/RceHtmlEditor.js +5 -8
  57. package/es/rce/ResizeHandle.js +3 -8
  58. package/es/rce/RestoreAutoSaveModal.js +1 -2
  59. package/es/rce/ShowOnFocusButton/index.js +0 -6
  60. package/es/rce/StatusBar.js +8 -37
  61. package/es/rce/alertHandler.js +1 -4
  62. package/es/rce/contentInsertion.js +35 -57
  63. package/es/rce/contentInsertionUtils.js +6 -8
  64. package/es/rce/contentRendering.js +7 -12
  65. package/es/rce/customEvents.js +1 -0
  66. package/es/rce/editorLanguage.js +22 -10
  67. package/es/rce/indicatorRegion.js +6 -5
  68. package/es/rce/normalizeLocale.js +5 -3
  69. package/es/rce/normalizeProps.js +3 -1
  70. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  71. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  74. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  75. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  76. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  77. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  83. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  84. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  85. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  86. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  95. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  96. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  97. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  98. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  99. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  100. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  101. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  102. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  103. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  127. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  128. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  129. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  130. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  131. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  132. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  134. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  135. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  136. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  137. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  138. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  139. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  140. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  141. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  144. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  147. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  148. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  149. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  150. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  153. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  154. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  155. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  156. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  159. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  164. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  165. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  166. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  167. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  168. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  169. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  170. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  171. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  172. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  173. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  174. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  175. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  176. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  184. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  185. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  186. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  187. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  188. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  198. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  199. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  201. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  202. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  204. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  205. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  206. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  207. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  208. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  210. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  211. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  212. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  213. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  214. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  215. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  216. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  217. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  218. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  219. package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
  220. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  221. package/es/rce/plugins/shared/ColorInput.js +5 -14
  222. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  223. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  224. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  225. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  226. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  227. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  228. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  229. package/es/rce/plugins/shared/EventUtils.js +1 -3
  230. package/es/rce/plugins/shared/Filter.js +8 -38
  231. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  232. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  233. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  234. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  235. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  236. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  237. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  239. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  240. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  241. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  242. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  244. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  245. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  247. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  248. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  250. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  251. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  252. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  253. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  254. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  255. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  256. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  257. package/es/rce/plugins/shared/Previewable.js +1 -0
  258. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  259. package/es/rce/plugins/shared/StoreContext.js +1 -2
  260. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  261. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  262. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  263. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  264. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  265. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  266. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  267. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  268. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  269. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  270. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  271. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  272. package/es/rce/plugins/shared/Upload/index.js +1 -0
  273. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  274. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  275. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  276. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  277. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  278. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  279. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  280. package/es/rce/plugins/shared/dateUtils.js +1 -1
  281. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  282. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  283. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  284. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  285. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  286. package/es/rce/plugins/shared/fileShape.js +4 -9
  287. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  288. package/es/rce/plugins/shared/fileUtils.js +1 -2
  289. package/es/rce/plugins/shared/linkUtils.js +1 -16
  290. package/es/rce/plugins/shared/round.js +1 -0
  291. package/es/rce/plugins/shared/trayUtils.js +4 -3
  292. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  293. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  294. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  295. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  296. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  297. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  299. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  300. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  321. package/es/rce/root.js +9 -8
  322. package/es/rce/sanitizePlugins.js +1 -3
  323. package/es/rce/style.js +1 -4
  324. package/es/rce/tinyRCE.js +13 -9
  325. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  326. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  327. package/es/rce/transformContent.js +8 -10
  328. package/es/rce/types.js +1 -0
  329. package/es/rce/userOS.js +1 -1
  330. package/es/rce/wrapInitCb.js +50 -43
  331. package/es/rcs/api.js +61 -116
  332. package/es/rcs/buildError.js +5 -17
  333. package/es/rcs/fake.js +4 -13
  334. package/es/sidebar/actions/all_files.js +2 -0
  335. package/es/sidebar/actions/data.js +4 -7
  336. package/es/sidebar/actions/documents.js +9 -6
  337. package/es/sidebar/actions/files.js +3 -6
  338. package/es/sidebar/actions/filter.js +1 -0
  339. package/es/sidebar/actions/flickr.js +1 -1
  340. package/es/sidebar/actions/images.js +12 -11
  341. package/es/sidebar/actions/links.js +1 -0
  342. package/es/sidebar/actions/media.js +12 -10
  343. package/es/sidebar/actions/session.js +1 -3
  344. package/es/sidebar/actions/ui.js +1 -0
  345. package/es/sidebar/actions/upload.js +14 -39
  346. package/es/sidebar/containers/Sidebar.js +1 -2
  347. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  348. package/es/sidebar/dragHtml.js +5 -3
  349. package/es/sidebar/reducers/all_files.js +4 -3
  350. package/es/sidebar/reducers/collection.js +12 -13
  351. package/es/sidebar/reducers/collections.js +5 -5
  352. package/es/sidebar/reducers/documents.js +6 -13
  353. package/es/sidebar/reducers/files.js +3 -3
  354. package/es/sidebar/reducers/filter.js +1 -8
  355. package/es/sidebar/reducers/flickr.js +9 -9
  356. package/es/sidebar/reducers/folder.js +15 -15
  357. package/es/sidebar/reducers/folders.js +3 -3
  358. package/es/sidebar/reducers/images.js +3 -13
  359. package/es/sidebar/reducers/index.js +3 -1
  360. package/es/sidebar/reducers/media.js +6 -13
  361. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  362. package/es/sidebar/reducers/noop.js +1 -0
  363. package/es/sidebar/reducers/rootFolderId.js +1 -2
  364. package/es/sidebar/reducers/session.js +3 -3
  365. package/es/sidebar/reducers/ui.js +3 -16
  366. package/es/sidebar/reducers/upload.js +8 -40
  367. package/es/sidebar/store/configureStore.js +1 -0
  368. package/es/sidebar/store/initialState.js +13 -24
  369. package/es/translations/locales/ab.js +1 -0
  370. package/es/translations/locales/ar.js +67 -9
  371. package/es/translations/locales/ca.js +67 -9
  372. package/es/translations/locales/cs.js +1 -0
  373. package/es/translations/locales/cs_CZ.js +1 -0
  374. package/es/translations/locales/cy.js +67 -9
  375. package/es/translations/locales/da-x-k12.js +67 -9
  376. package/es/translations/locales/da.js +67 -9
  377. package/es/translations/locales/da_DK.js +1 -0
  378. package/es/translations/locales/de.js +67 -9
  379. package/es/translations/locales/el.js +4 -0
  380. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  381. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  382. package/es/translations/locales/en.js +72 -8
  383. package/es/translations/locales/en_AU.js +67 -9
  384. package/es/translations/locales/en_CA.js +67 -9
  385. package/es/translations/locales/en_CY.js +67 -9
  386. package/es/translations/locales/en_GB.js +67 -9
  387. package/es/translations/locales/en_NZ.js +1 -0
  388. package/es/translations/locales/en_SE.js +1 -0
  389. package/es/translations/locales/en_US.js +1 -0
  390. package/es/translations/locales/es.js +67 -9
  391. package/es/translations/locales/es_ES.js +67 -9
  392. package/es/translations/locales/es_GT.js +1 -0
  393. package/es/translations/locales/fa_IR.js +7 -0
  394. package/es/translations/locales/fi.js +67 -9
  395. package/es/translations/locales/fr.js +67 -9
  396. package/es/translations/locales/fr_CA.js +68 -10
  397. package/es/translations/locales/ga.js +5 -13
  398. package/es/translations/locales/he.js +7 -0
  399. package/es/translations/locales/hi.js +67 -9
  400. package/es/translations/locales/ht.js +67 -9
  401. package/es/translations/locales/hu.js +7 -6
  402. package/es/translations/locales/hu_HU.js +1 -0
  403. package/es/translations/locales/hy.js +1 -0
  404. package/es/translations/locales/id.js +67 -9
  405. package/es/translations/locales/id_ID.js +1 -0
  406. package/es/translations/locales/is.js +67 -9
  407. package/es/translations/locales/it.js +67 -9
  408. package/es/translations/locales/ja.js +67 -9
  409. package/es/translations/locales/ko.js +1 -0
  410. package/es/translations/locales/ko_KR.js +1 -0
  411. package/es/translations/locales/lt.js +1 -0
  412. package/es/translations/locales/lt_LT.js +1 -0
  413. package/es/translations/locales/mi.js +67 -9
  414. package/es/translations/locales/mn_MN.js +1 -0
  415. package/es/translations/locales/ms.js +67 -9
  416. package/es/translations/locales/nb-x-k12.js +67 -9
  417. package/es/translations/locales/nb.js +67 -9
  418. package/es/translations/locales/nl.js +67 -9
  419. package/es/translations/locales/nl_NL.js +1 -0
  420. package/es/translations/locales/nn.js +7 -6
  421. package/es/translations/locales/pl.js +67 -9
  422. package/es/translations/locales/pt.js +67 -9
  423. package/es/translations/locales/pt_BR.js +67 -9
  424. package/es/translations/locales/ro.js +1 -0
  425. package/es/translations/locales/ru.js +67 -9
  426. package/es/translations/locales/se.js +1 -0
  427. package/es/translations/locales/sl.js +67 -9
  428. package/es/translations/locales/sv-x-k12.js +67 -9
  429. package/es/translations/locales/sv.js +67 -9
  430. package/es/translations/locales/sv_SE.js +1 -0
  431. package/es/translations/locales/tg.js +1 -0
  432. package/es/translations/locales/th.js +67 -9
  433. package/es/translations/locales/th_TH.js +1 -0
  434. package/es/translations/locales/tl_PH.js +1 -0
  435. package/es/translations/locales/tr.js +7 -0
  436. package/es/translations/locales/uk_UA.js +7 -0
  437. package/es/translations/locales/vi.js +67 -9
  438. package/es/translations/locales/vi_VN.js +1 -0
  439. package/es/translations/locales/zh-Hans.js +67 -9
  440. package/es/translations/locales/zh-Hant.js +67 -9
  441. package/es/translations/locales/zh.js +67 -9
  442. package/es/translations/locales/zh_HK.js +67 -9
  443. package/es/translations/locales/zh_TW.Big5.js +1 -0
  444. package/es/translations/locales/zh_TW.js +1 -0
  445. package/es/translations/tinymce/ar_SA.js +1 -0
  446. package/es/translations/tinymce/fi.js +1 -0
  447. package/es/translations/tinymce/ga.js +1 -0
  448. package/es/translations/tinymce/id.js +1 -0
  449. package/es/translations/tinymce/ru.js +1 -0
  450. package/es/translations/tinymce/ru_RU.js +1 -0
  451. package/es/translations/tinymce/sl.js +1 -0
  452. package/es/translations/tinymce/sr.js +1 -0
  453. package/es/translations/tinymce/th.js +1 -0
  454. package/es/translations/tinymce/uk_UA.js +1 -0
  455. package/es/translations/tinymce/vi_VN.js +1 -0
  456. package/es/util/TypedDict.js +4 -2
  457. package/es/util/encrypted-storage.js +3 -13
  458. package/es/util/file-url-util.js +1 -6
  459. package/es/util/fullscreenHelpers.js +4 -1
  460. package/es/util/instui-icon-helper.js +4 -3
  461. package/es/util/loadingPlaceholder.js +38 -39
  462. package/es/util/simpleCache.js +0 -3
  463. package/es/util/string-util.js +1 -1
  464. package/es/util/textarea-editing-util.js +3 -7
  465. package/es/util/tinymce-plugin-util.js +0 -5
  466. package/es/util/url-util.js +16 -25
  467. package/eslint.config.js +239 -0
  468. package/jest.config.js +1 -1
  469. package/package.json +77 -82
  470. package/scripts/build-canvas +2 -1
  471. package/scripts/build.js +4 -4
  472. package/scripts/publish_to_npm.sh +1 -1
  473. package/testcafe/RCEWrapper.test.js +0 -1
  474. package/testcafe/StatusBar.test.js +0 -1
  475. package/testcafe/axe.test.js +3 -4
  476. package/testcafe/enhanceUserContent.test.js +0 -1
  477. package/tsconfig.json +20 -15
  478. package/.eslintrc +0 -45
  479. package/.prettierignore +0 -6
  480. package/es/common/components/FileTree/File.js +0 -64
  481. package/es/common/components/FileTree/Folder.js +0 -110
  482. package/es/common/components/FileTree/index.js +0 -84
  483. package/es/common/components/FileTree/styles.js +0 -72
  484. package/es/common/components/Loading.js +0 -83
@@ -15,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';
@@ -35,37 +35,29 @@ 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
37
  const nodeName = $element === null || $element === void 0 ? void 0 : $element.nodeName.toLowerCase();
38
-
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
48
  var _$link;
50
-
51
49
  let $link = $element;
52
-
53
50
  if (((_$link = $link) === null || _$link === void 0 ? void 0 : _$link.tagName) !== 'A') {
54
51
  // the user may have selected some text that is w/in a link
55
52
  // but didn't include the <a>. Let's see if that's true
56
- $link = editor.dom.getParent($link, 'a[href]');
53
+ $link = editor && editor.dom.getParent($link, 'a[href]');
57
54
  }
58
-
59
55
  if (!$link || $link.tagName !== 'A' || !$link.href) {
60
56
  return null;
61
57
  }
62
-
63
- const {
64
- pathname
65
- } = url.parse($link.href);
58
+ const pathname = parseUrlPath($link.href);
66
59
  const type = FILE_DOWNLOAD_PATH_REGEX.test(pathname) ? FILE_LINK_TYPE : LINK_TYPE;
67
60
  let displayAs = DISPLAY_AS_LINK;
68
-
69
61
  if ($link.classList.contains('no_preview')) {
70
62
  displayAs = DISPLAY_AS_DOWNLOAD_LINK;
71
63
  } else if ($link.classList.contains('auto_open')) {
@@ -73,7 +65,6 @@ export function asLink($element, editor) {
73
65
  } else if ($link.classList.contains('inline_disabled')) {
74
66
  displayAs = DISPLAY_AS_EMBED_DISABLED;
75
67
  }
76
-
77
68
  const contentType = $link.getAttribute('data-course-type');
78
69
  const fileName = $link.getAttribute('title');
79
70
  const published = $link.getAttribute('data-published') === 'true';
@@ -91,7 +82,9 @@ export function asLink($element, editor) {
91
82
  fileName,
92
83
  published
93
84
  };
94
- } // the video element is a bit tricky.
85
+ }
86
+
87
+ // the video element is a bit tricky.
95
88
  // tinymce won't let me add many attributes to the iframe,
96
89
  // even though I've listed them in tinymce.config.js
97
90
  // extended_valid_elements.
@@ -99,17 +92,14 @@ export function asLink($element, editor) {
99
92
  // and it's attributes, even though this could change with future
100
93
  // tinymce releases.
101
94
  // see https://github.com/tinymce/tinymce/issues/5181
102
-
103
95
  export function asVideoElement($element) {
104
96
  var _$videoElem$parentEle;
105
-
106
97
  const $videoElem = findMediaPlayerIframe($element);
107
-
108
98
  if (!isVideoElement($videoElem) && !isStudioEmbeddedMedia($videoElem)) {
109
99
  return null;
110
100
  }
111
-
112
- return { ...fromVideoEmbed($videoElem),
101
+ return {
102
+ ...fromVideoEmbed($videoElem),
113
103
  $element,
114
104
  type: VIDEO_EMBED_TYPE,
115
105
  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')
@@ -117,11 +107,9 @@ export function asVideoElement($element) {
117
107
  }
118
108
  export function asAudioElement($element) {
119
109
  var _$element$parentEleme;
120
-
121
110
  if (!$element) {
122
111
  return null;
123
112
  }
124
-
125
113
  const $audioIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
126
114
  const $tinymceIframeShim = $audioIframe.parentElement;
127
115
  const title = ($audioIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
@@ -129,69 +117,55 @@ export function asAudioElement($element) {
129
117
  titleText: title,
130
118
  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')
131
119
  };
132
-
133
120
  if ($audioIframe.tagName === 'IFRAME') {
134
121
  const audioDoc = $audioIframe.contentDocument;
135
-
136
122
  try {
137
123
  var _audioDoc$querySelect;
138
-
139
124
  const trackSJson = (_audioDoc$querySelect = audioDoc.querySelector('[data-tracks]')) === null || _audioDoc$querySelect === void 0 ? void 0 : _audioDoc$querySelect.getAttribute('data-tracks');
140
-
141
125
  if (trackSJson) {
142
126
  audioOptions.tracks = JSON.parse(trackSJson);
143
- } // eslint-disable-next-line no-empty
144
-
127
+ }
128
+ // eslint-disable-next-line no-empty
145
129
  } catch (e) {}
146
130
  }
147
-
148
131
  if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
149
132
  const source = $audioIframe.getAttribute('src');
150
133
  const matches = source === null || source === void 0 ? void 0 : source.match(/\/media_attachments_iframe\/(\d+)/);
151
-
152
134
  if (matches) {
153
135
  audioOptions.attachmentId = matches[1];
154
136
  }
155
137
  }
156
-
157
138
  return audioOptions;
158
139
  }
159
-
160
140
  function asText($element, editor) {
161
141
  const text = editor && editor.selection.getContent({
162
142
  format: 'text'
163
143
  });
164
-
165
144
  if (!text) {
166
145
  return null;
167
146
  }
168
-
169
147
  return {
170
148
  $element,
171
149
  text,
172
150
  type: TEXT_TYPE
173
151
  };
174
152
  }
175
-
176
153
  function asNone($element) {
177
154
  return {
178
155
  $element: $element || null,
179
156
  type: NONE_TYPE
180
157
  };
181
158
  }
182
-
183
159
  export function getContentFromElement($element, editor) {
184
160
  if (!($element && $element.nodeName)) {
185
161
  return asNone();
186
162
  }
187
-
188
163
  const content = asLink($element, editor) || asImageEmbed($element) || asVideoElement($element) || asText($element, editor) || asNone($element);
189
164
  return content;
190
165
  }
191
166
  export function getContentFromEditor(editor) {
192
167
  let expandSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
193
168
  let $element;
194
-
195
169
  if (editor && editor.selection) {
196
170
  // tinymce selects the element around the cursor, whether it's
197
171
  // content is selected in the copy/paste sense or not.
@@ -201,15 +175,14 @@ export function getContentFromEditor(editor) {
201
175
  $element = editor.selection.getNode();
202
176
  }
203
177
  }
204
-
205
178
  if ($element == null) {
206
179
  return asNone();
207
180
  }
208
-
209
181
  return getContentFromElement($element, editor);
210
- } // if the selection is somewhere w/in a <a>,
211
- // find the <a> and return it's info
182
+ }
212
183
 
184
+ // if the selection is somewhere w/in a <a>,
185
+ // find the <a> and return it's info
213
186
  export function getLinkContentFromEditor(editor) {
214
187
  const $element = editor.selection.getNode();
215
188
  return $element ? asLink($element, editor) : null;
@@ -220,33 +193,25 @@ export function isFileLink($element, editor) {
220
193
  export function isImageEmbed($element) {
221
194
  return !!asImageEmbed($element) && !$element.getAttribute('data-placeholder-for');
222
195
  }
223
-
224
196
  function isMediaElement($element, mediaType) {
225
197
  var _tinymceIframeShim$fi, _tinymceIframeShim$ge;
226
-
227
198
  // the video is hosted in an iframe, but tinymce
228
199
  // wraps it in a span with swizzled attribute names
229
200
  if (!($element !== null && $element !== void 0 && $element.getAttribute) || !$element) {
230
201
  return false;
231
202
  }
232
-
233
203
  const tinymceIframeShim = $element.tagName === 'IFRAME' ? $element.parentElement : $element;
234
-
235
204
  if (((_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
236
205
  return false;
237
206
  }
238
-
239
207
  const media_obj_id = tinymceIframeShim.getAttribute('data-mce-p-data-media-id');
240
208
  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
-
242
209
  if (!media_obj_id && !is_media_attachment_iframe) {
243
210
  return false;
244
211
  }
245
-
246
212
  const media_type = tinymceIframeShim.getAttribute('data-mce-p-data-media-type');
247
213
  return media_type === mediaType;
248
214
  }
249
-
250
215
  export function isVideoElement($element) {
251
216
  return isMediaElement($element, 'video');
252
217
  }
@@ -255,27 +220,21 @@ export function isAudioElement($element) {
255
220
  }
256
221
  export function findMediaPlayerIframe(elem) {
257
222
  var _elem$firstElementChi;
258
-
259
223
  if (!elem) return null;
260
-
261
224
  if (elem.tagName === 'IFRAME') {
262
225
  // we have the iframe
263
226
  return elem;
264
227
  }
265
-
266
228
  if (((_elem$firstElementChi = elem.firstElementChild) === null || _elem$firstElementChi === void 0 ? void 0 : _elem$firstElementChi.tagName) === 'IFRAME') {
267
229
  // we have the shim tinymce puts around the iframe
268
230
  return elem.firstElementChild;
269
231
  }
270
-
271
232
  if (elem.classList.contains('mce-shim')) {
272
233
  var _elem$previousSibling;
273
-
274
234
  // tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
275
235
  if (((_elem$previousSibling = elem.previousSibling) === null || _elem$previousSibling === void 0 ? void 0 : _elem$previousSibling.tagName) === 'IFRAME') {
276
236
  return elem.previousSibling;
277
237
  }
278
238
  }
279
-
280
239
  return null;
281
240
  }
@@ -15,52 +15,45 @@
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
38
  export function scaleForHeight(width, height, targetHeight) {
42
39
  let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
43
-
44
40
  if (targetHeight == null) {
45
41
  return {
46
42
  height: null,
47
43
  width: null
48
44
  };
49
45
  }
50
-
51
46
  const scaleFactor = targetHeight / height;
52
47
  return scaleEvenly(width, height, scaleFactor, constraints);
53
48
  }
54
49
  export function scaleForWidth(width, height, targetWidth) {
55
50
  let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
56
-
57
51
  if (targetWidth == null) {
58
52
  return {
59
53
  height: null,
60
54
  width: null
61
55
  };
62
56
  }
63
-
64
57
  const scaleFactor = targetWidth / width;
65
58
  return scaleEvenly(width, height, scaleFactor, constraints);
66
59
  }
@@ -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({
@@ -15,30 +15,25 @@
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 { useState } from 'react';
19
20
  import { scaleForHeight, scaleForWidth } from '../DimensionUtils';
20
-
21
21
  function normalizedNumber(number) {
22
22
  if (number == null) {
23
23
  return null;
24
24
  }
25
-
26
25
  return Number.isFinite(number) ? Math.round(number) : NaN;
27
26
  }
28
-
29
27
  function parseAsInteger(inputString) {
30
28
  if (inputString.trim() === '') {
31
29
  return null;
32
30
  }
33
-
34
31
  const number = Number.parseFloat(inputString, 10);
35
32
  return Number.isFinite(number) ? Math.round(number) : NaN;
36
33
  }
37
-
38
34
  function inputValueFor(initialNumber) {
39
35
  return Number.isFinite(initialNumber) ? `${initialNumber}` : '';
40
36
  }
41
-
42
37
  export default function useDimensionsState(initialDimensions, constraints) {
43
38
  const {
44
39
  appliedHeight,
@@ -81,19 +76,17 @@ export default function useDimensionsState(initialDimensions, constraints) {
81
76
  height: scaleForHeight,
82
77
  width: scaleForWidth
83
78
  };
84
-
85
79
  function updateDimensions(attributes) {
86
- setDimensions({ ...dimensions,
80
+ setDimensions({
81
+ ...dimensions,
87
82
  ...attributes,
88
83
  numericHeight: normalizedNumber(attributes.numericHeight),
89
84
  numericWidth: normalizedNumber(attributes.numericWidth),
90
85
  numericPercentage: normalizedNumber(attributes.numericPercentage)
91
86
  });
92
87
  }
93
-
94
88
  function scaleDimensions(dimensionName, number, scaleConstraints) {
95
89
  let width, height, percentage;
96
-
97
90
  if (dimensionName === 'percentage') {
98
91
  width = naturalWidth;
99
92
  height = naturalHeight;
@@ -105,14 +98,12 @@ export default function useDimensionsState(initialDimensions, constraints) {
105
98
  height = scaledDimensions.height;
106
99
  percentage = initialNumericValues.percentage;
107
100
  }
108
-
109
101
  return {
110
102
  width,
111
103
  height,
112
104
  percentage
113
105
  };
114
106
  }
115
-
116
107
  function setNumericDimension(dimensionName, number) {
117
108
  const {
118
109
  height,
@@ -128,7 +119,6 @@ export default function useDimensionsState(initialDimensions, constraints) {
128
119
  inputPercentage: inputValueFor(percentage)
129
120
  });
130
121
  }
131
-
132
122
  function setDimensionValue(dimensionName, value) {
133
123
  const number = parseAsInteger(value);
134
124
  const {
@@ -145,63 +135,49 @@ export default function useDimensionsState(initialDimensions, constraints) {
145
135
  inputPercentage: dimensionName === 'percentage' ? value : inputValueFor(percentage)
146
136
  });
147
137
  }
148
-
149
138
  function offsetDimension(dimensionName, offset) {
150
139
  const minValue = dimensionMinimums[dimensionName];
151
140
  const initialNumber = initialNumericValues[dimensionName];
152
141
  const numericValue = currentNumericValues[dimensionName];
153
-
154
142
  if (numericValue != null && !Number.isFinite(numericValue)) {
155
143
  return;
156
144
  }
157
-
158
145
  const newNumber = numericValue == null ? initialNumber + offset : Math.max(minValue, Math.floor(numericValue + offset));
159
146
  setNumericDimension(dimensionName, newNumber);
160
147
  }
161
-
162
148
  const widthState = {
163
149
  inputValue: dimensions.inputWidth,
164
-
165
150
  addOffset(offset) {
166
151
  offsetDimension('width', offset);
167
152
  },
168
-
169
153
  setInputValue(value) {
170
154
  setDimensionValue('width', value);
171
155
  }
172
-
173
156
  };
174
157
  const heightState = {
175
158
  inputValue: dimensions.inputHeight,
176
-
177
159
  addOffset(offset) {
178
160
  offsetDimension('height', offset);
179
161
  },
180
-
181
162
  setInputValue(value) {
182
163
  setDimensionValue('height', value);
183
164
  }
184
-
185
165
  };
186
166
  const percentageState = {
187
167
  inputValue: dimensions.inputPercentage,
188
-
189
168
  addOffset(offset) {
190
169
  offsetDimension('percentage', offset);
191
170
  },
192
-
193
171
  setInputValue(value) {
194
172
  setDimensionValue('percentage', value);
195
173
  }
196
-
197
174
  };
198
-
199
175
  const handleUsePercentageUnitsChange = value => {
200
- setDimensions({ ...dimensions,
176
+ setDimensions({
177
+ ...dimensions,
201
178
  usePercentageUnits: value
202
179
  });
203
180
  };
204
-
205
181
  const isNumeric = dimensions.usePercentageUnits ? Number.isFinite(dimensions.numericPercentage) : [dimensions.numericHeight, dimensions.numericWidth].every(Number.isFinite);
206
182
  const isAtLeastMinimums = dimensions.usePercentageUnits ? dimensions.numericPercentage >= minPercentage : dimensions.numericHeight >= minHeight && dimensions.numericWidth >= minWidth;
207
183
  return {
@@ -17,8 +17,9 @@
17
17
  */
18
18
  import React from 'react';
19
19
  import PropTypes from 'prop-types';
20
- import formatMessage from '../../../format-message'; // TODO: a placeholder. Design a better one. See CORE-2826
20
+ import formatMessage from '../../../format-message';
21
21
 
22
+ // TODO: a placeholder. Design a better one. See CORE-2826
22
23
  export default class ErrorBoundary extends React.Component {
23
24
  constructor(props) {
24
25
  super(props);
@@ -26,7 +27,6 @@ export default class ErrorBoundary extends React.Component {
26
27
  hasError: false
27
28
  };
28
29
  }
29
-
30
30
  static getDerivedStateFromError(error) {
31
31
  // Update state so the next render will show the fallback UI.
32
32
  return {
@@ -34,7 +34,6 @@ export default class ErrorBoundary extends React.Component {
34
34
  error
35
35
  };
36
36
  }
37
-
38
37
  render() {
39
38
  if (this.state.hasError) {
40
39
  const msg = this.state.error.message ? this.state.error.message : this.state.error.toString();
@@ -44,10 +43,8 @@ export default class ErrorBoundary extends React.Component {
44
43
  }
45
44
  }, /*#__PURE__*/React.createElement("h2", null, formatMessage('Something went wrong.')), /*#__PURE__*/React.createElement("p", null, msg));
46
45
  }
47
-
48
46
  return this.props.children;
49
47
  }
50
-
51
48
  }
52
49
  ErrorBoundary.propTypes = {
53
50
  children: PropTypes.node