@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,33 +15,29 @@
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 ReactDOM from 'react-dom';
20
21
  import Bridge from '../../../bridge';
21
22
  import { StoreProvider } from '../shared/StoreContext';
22
23
  import formatMessage from '../../../format-message';
23
24
  import { headerFor, originFromHost } from '../../../rcs/api';
24
- import { instuiPopupMountNode } from '../../../util/fullscreenHelpers';
25
+ import { instuiPopupMountNodeFn } from '../../../util/fullscreenHelpers';
25
26
  import RCEGlobals from '../../RCEGlobals';
26
27
  export const handleUpload = (error, uploadData, onUploadComplete, uploadBookmark) => {
27
28
  let err_msg = error && Bridge.uploadMediaTranslations.UploadMediaStrings.UPLOADING_ERROR;
28
-
29
- if ((error === null || error === void 0 ? void 0 : error.name) === 'FileSizeError') {
29
+ if (error?.name === 'FileSizeError') {
30
30
  err_msg = formatMessage('Size of caption file is greater than the maximum {max} kb allowed file size.', {
31
31
  max: error.maxBytes / 1000
32
32
  });
33
33
  }
34
-
35
34
  const editorComponent = Bridge.activeEditor();
36
35
  let newBookmark;
37
-
38
36
  if (uploadBookmark) {
39
37
  newBookmark = editorComponent.editor.selection.getBookmark(2, true);
40
38
  editorComponent.editor.selection.moveToBookmark(uploadBookmark);
41
39
  }
42
-
43
40
  onUploadComplete(err_msg, uploadData);
44
-
45
41
  if (newBookmark) {
46
42
  editorComponent.editor.selection.moveToBookmark(newBookmark);
47
43
  }
@@ -50,61 +46,53 @@ export default function (ed, document) {
50
46
  return import('@instructure/canvas-media').then(CanvasMedia => {
51
47
  const UploadMedia = CanvasMedia.default;
52
48
  let container = document.querySelector('.canvas-rce-media-upload');
53
-
54
49
  if (!container) {
55
50
  container = document.createElement('div');
56
51
  container.className = 'canvas-rce-media-upload';
57
52
  document.body.appendChild(container);
58
53
  }
59
-
60
54
  const handleDismiss = () => {
61
55
  ReactDOM.unmountComponentAtNode(container);
62
56
  ed.focus(false);
63
- }; // We need to have a place to store the bookmark location
64
- // while the upload happens.
57
+ };
65
58
 
59
+ // We need to have a place to store the bookmark location
60
+ // while the upload happens.
61
+ let uploadBookmark = null;
66
62
 
67
- let uploadBookmark = null; // redux's activateMediaUpload action does the image placeholder,
63
+ // redux's activateMediaUpload action does the image placeholder,
68
64
  // but it also does the upload. We need to separate them if we
69
65
  // want to stay within the redux approach
70
-
71
66
  const handleStartUpload = fileProps => {
72
- var _editorComponent$edit;
73
-
74
67
  Bridge.focusEditor(ed.rceWrapper);
75
68
  const editorComponent = Bridge.activeEditor();
76
- uploadBookmark = editorComponent === null || editorComponent === void 0 ? void 0 : (_editorComponent$edit = editorComponent.editor) === null || _editorComponent$edit === void 0 ? void 0 : _editorComponent$edit.selection.getBookmark(2, true);
69
+ uploadBookmark = editorComponent?.editor?.selection.getBookmark(2, true);
77
70
  Bridge.insertImagePlaceholder(fileProps);
78
71
  handleDismiss();
79
72
  };
80
-
81
73
  const trayProps = Bridge.trayProps.get(ed);
82
- ReactDOM.render( /*#__PURE__*/React.createElement(StoreProvider, trayProps, contentProps => {
83
- var _RCEGlobals$getFeatur;
84
-
85
- return /*#__PURE__*/React.createElement(UploadMedia, {
86
- "data-mce-component": true,
87
- rcsConfig: {
88
- contextType: ed.settings.canvas_rce_user_context.type,
89
- contextId: ed.settings.canvas_rce_user_context.id,
90
- origin: originFromHost(contentProps.host),
91
- headers: headerFor(contentProps.jwt)
92
- },
93
- userLocale: Bridge.userLocale,
94
- mountNode: instuiPopupMountNode,
95
- open: true,
96
- liveRegion: () => document.getElementById('flash_screenreader_holder'),
97
- onStartUpload: fileProps => handleStartUpload(fileProps),
98
- onUploadComplete: (err, data) => handleUpload(err, data, contentProps.mediaUploadComplete, uploadBookmark),
99
- onDismiss: handleDismiss,
100
- tabs: {
101
- record: true,
102
- upload: true
103
- },
104
- uploadMediaTranslations: Bridge.uploadMediaTranslations,
105
- media_links_use_attachment_id: RCEGlobals.getFeatures().media_links_use_attachment_id,
106
- useStudioPlayer: (_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) === null || _RCEGlobals$getFeatur === void 0 ? void 0 : _RCEGlobals$getFeatur.consolidated_media_player
107
- });
108
- }), container);
74
+ ReactDOM.render(/*#__PURE__*/React.createElement(StoreProvider, trayProps, contentProps => /*#__PURE__*/React.createElement(UploadMedia, {
75
+ "data-mce-component": true,
76
+ rcsConfig: {
77
+ contextType: ed.settings.canvas_rce_user_context.type,
78
+ contextId: ed.settings.canvas_rce_user_context.id,
79
+ origin: originFromHost(contentProps.host),
80
+ headers: headerFor(contentProps.jwt)
81
+ },
82
+ userLocale: Bridge.userLocale,
83
+ mountNode: instuiPopupMountNodeFn,
84
+ open: true,
85
+ liveRegion: () => document.getElementById('flash_screenreader_holder'),
86
+ onStartUpload: fileProps => handleStartUpload(fileProps),
87
+ onUploadComplete: (err, data) => handleUpload(err, data, contentProps.mediaUploadComplete, uploadBookmark),
88
+ onDismiss: handleDismiss,
89
+ tabs: {
90
+ record: true,
91
+ upload: true
92
+ },
93
+ uploadMediaTranslations: Bridge.uploadMediaTranslations,
94
+ media_links_use_attachment_id: RCEGlobals.getFeatures().media_links_use_attachment_id,
95
+ useStudioPlayer: RCEGlobals.getFeatures()?.consolidated_media_player
96
+ })), container);
109
97
  });
110
98
  }
@@ -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
  // IMPORTANT!
19
20
  // Do not import this file directly, but get it via Bridge.uploadMediaTranslations
20
21
  // This is because the locale, which is lazy imported, has to be loaded and
@@ -1,5 +1,3 @@
1
- // @ts-nocheck
2
-
3
1
  /*
4
2
  * Copyright (C) 2018 - present Instructure, Inc.
5
3
  *
@@ -17,6 +15,7 @@
17
15
  * You should have received a copy of the GNU Affero General Public License along
18
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
17
  */
18
+
20
19
  import clickCallback from './clickCallback';
21
20
  import bridge from '../../../bridge';
22
21
  import formatMessage from '../../../format-message';
@@ -31,10 +30,10 @@ const COURSE_PLUGIN_KEY = 'course_media';
31
30
  const USER_PLUGIN_KEY = 'user_media';
32
31
  const GROUP_PLUGIN_KEY = 'group_media';
33
32
 
33
+ // @ts-expect-error
34
34
  function getMenuItems(ed) {
35
35
  const contextType = ed.settings.canvas_rce_user_context.type;
36
36
  const items = [];
37
-
38
37
  if (ed.getParam('show_media_upload')) {
39
38
  // test if it's ok
40
39
  items.push({
@@ -42,7 +41,6 @@ function getMenuItems(ed) {
42
41
  value: 'instructure_upload_media'
43
42
  });
44
43
  }
45
-
46
44
  if (contextType === 'course') {
47
45
  items.push({
48
46
  text: formatMessage('Course Media'),
@@ -54,7 +52,6 @@ function getMenuItems(ed) {
54
52
  value: 'instructure_group_media'
55
53
  });
56
54
  }
57
-
58
55
  items.push({
59
56
  text: formatMessage('User Media'),
60
57
  value: 'instructure_user_media'
@@ -62,36 +59,35 @@ function getMenuItems(ed) {
62
59
  return items;
63
60
  }
64
61
 
62
+ // @ts-expect-error
65
63
  function doMenuItem(ed, value) {
66
64
  switch (value) {
67
65
  case 'instructure_upload_media':
68
66
  ed.execCommand('instructureRecord');
69
67
  break;
70
-
71
68
  case 'instructure_course_media':
72
69
  ed.focus(true);
73
70
  ed.execCommand('instructureTrayForMedia', false, COURSE_PLUGIN_KEY);
74
71
  break;
75
-
76
72
  case 'instructure_group_media':
77
73
  ed.focus(true);
78
74
  ed.execCommand('instructureTrayForMedia', false, GROUP_PLUGIN_KEY);
79
75
  break;
80
-
81
76
  case 'instructure_user_media':
82
77
  ed.focus(true);
83
78
  ed.execCommand('instructureTrayForMedia', false, USER_PLUGIN_KEY);
84
79
  break;
85
80
  }
86
- } // Register plugin
87
-
81
+ }
88
82
 
83
+ // Register plugin
89
84
  tinymce.PluginManager.add('instructure_record', function (ed) {
90
85
  ed.addCommand('instructureRecord', () => clickCallback(ed, document));
91
86
  ed.addCommand('instructureTrayForMedia', (ui, plugin_key) => {
92
87
  bridge.showTrayForPlugin(plugin_key, ed.id);
93
- }); // Register menu items
88
+ });
94
89
 
90
+ // Register menu items
95
91
  ed.ui.registry.addNestedMenuItem('instructure_media', {
96
92
  text: formatMessage('Media'),
97
93
  icon: 'video',
@@ -106,8 +102,9 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
106
102
  }
107
103
  };
108
104
  })
109
- }); // Register buttons
105
+ });
110
106
 
107
+ // Register buttons
111
108
  ed.ui.registry.addMenuButton('instructure_record', {
112
109
  tooltip: formatMessage('Record/Upload Media'),
113
110
  icon: 'video',
@@ -117,32 +114,29 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
117
114
  value: item.value,
118
115
  onAction: () => doMenuItem(ed, item.value)
119
116
  }))),
120
-
121
117
  onSetup(api) {
118
+ // @ts-expect-error
122
119
  function handleNodeChange(_e) {
123
120
  api.setDisabled(!isOKToLink(ed.selection.getContent()));
124
121
  }
125
-
126
122
  setTimeout(handleNodeChange);
127
123
  ed.on('NodeChange', handleNodeChange);
128
124
  return () => {
129
125
  ed.off('NodeChange', handleNodeChange);
130
126
  };
131
127
  }
132
-
133
128
  });
129
+
134
130
  /*
135
131
  * Register the Video "Options" button that will open the Video Options
136
132
  * tray.
137
133
  */
138
-
139
134
  const buttonAriaLabel = formatMessage('Show video options');
140
135
  ed.ui.registry.addButton('instructure-video-options', {
141
136
  onAction() {
142
137
  // show the tray
143
138
  videoTrayController.showTrayForEditor(ed);
144
139
  },
145
-
146
140
  text: formatMessage('Video Options'),
147
141
  tooltip: buttonAriaLabel
148
142
  });
@@ -156,7 +150,6 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
156
150
  onAction() {
157
151
  audioTrayController.showTrayForEditor(ed);
158
152
  },
159
-
160
153
  text: formatMessage('Audio Options'),
161
154
  tooltip: formatMessage('Show audio options')
162
155
  });
@@ -15,33 +15,29 @@
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 ReactDOM from 'react-dom';
20
21
  import FindReplaceController from './components/FindReplaceTrayController';
21
22
  import { getSelectionContext } from './getSelectionContext';
22
23
  const CONTAINER_ID = 'instructure-find-replace-tray-container';
23
24
  export default function (editor, document) {
24
- var _editor$selection, _editor$selection2;
25
-
26
25
  const plugin = editor.plugins.searchreplace;
27
- const initalSelection = (_editor$selection = editor.selection) === null || _editor$selection === void 0 ? void 0 : _editor$selection.getContent({
26
+ const initalSelection = editor.selection?.getContent({
28
27
  format: 'text'
29
28
  });
30
- if (initalSelection) (_editor$selection2 = editor.selection) === null || _editor$selection2 === void 0 ? void 0 : _editor$selection2.collapse(true);
29
+ if (initalSelection) editor.selection?.collapse(true);
31
30
  let container = document.getElementById(CONTAINER_ID);
32
-
33
31
  if (container == null) {
34
32
  container = document.createElement('div');
35
33
  container.id = CONTAINER_ID;
36
34
  document.body.appendChild(container);
37
35
  }
38
-
39
36
  const handleDismiss = () => {
40
37
  if (container) ReactDOM.unmountComponentAtNode(container);
41
38
  editor.focus(false);
42
39
  };
43
-
44
- ReactDOM.render( /*#__PURE__*/React.createElement(FindReplaceController, {
40
+ ReactDOM.render(/*#__PURE__*/React.createElement(FindReplaceController, {
45
41
  plugin: plugin,
46
42
  onDismiss: handleDismiss,
47
43
  initialText: initalSelection,
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2019 - present Instructure, Inc.
5
4
  *
@@ -17,31 +16,32 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import React, { useEffect, useRef, useState } from 'react';
21
21
  import { Button, CloseButton } from '@instructure/ui-buttons';
22
22
  import { Flex } from '@instructure/ui-flex';
23
23
  import { Heading } from '@instructure/ui-heading';
24
+ import { IconWarningSolid } from '@instructure/ui-icons';
24
25
  import { getTrayHeight } from '../../shared/trayUtils';
25
26
  import { View } from '@instructure/ui-view';
26
- import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
27
+ import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
27
28
  import formatMessage from '../../../../format-message';
28
29
  import { Tray } from '@instructure/ui-tray';
29
30
  import { TextInput } from '@instructure/ui-text-input';
30
31
  import { Text } from '@instructure/ui-text';
31
32
  import { ScreenReaderContent } from '@instructure/ui-a11y-content';
32
33
  import { Alert } from '@instructure/ui-alerts';
33
- export default function FindReplaceTray(_ref) {
34
- let {
35
- onNext,
36
- onPrevious,
37
- onFind,
38
- onRequestClose,
39
- onReplace,
40
- index,
41
- max,
42
- initialText = '',
43
- selectionContext = ['', '']
44
- } = _ref;
34
+ export default function FindReplaceTray({
35
+ onNext,
36
+ onPrevious,
37
+ onFind,
38
+ onRequestClose,
39
+ onReplace,
40
+ index,
41
+ max,
42
+ initialText = '',
43
+ selectionContext = ['', '']
44
+ }) {
45
45
  const [findText, setFindText] = useState(initialText);
46
46
  const [replaceText, setReplaceText] = useState('');
47
47
  const [hasOpened, setHasOpened] = useState(false);
@@ -50,23 +50,19 @@ export default function FindReplaceTray(_ref) {
50
50
  const [alertReplaceText, setAlertReplaceText] = useState('');
51
51
  const trayRef = useRef(null);
52
52
  const liveRegionKey = useRef(0);
53
- const srDupKey = useRef(0); // moves RCE when tray opens/closes, copied from CanvasContentTray
54
-
53
+ const srDupKey = useRef(0);
54
+ // moves RCE when tray opens/closes, copied from CanvasContentTray
55
55
  useEffect(() => {
56
- var _trayRef$current;
57
-
58
56
  if (!hasOpened) return;
59
57
  let c = document.querySelector('[role="main"]');
60
58
  let target_w = 0;
61
59
  if (!c) return;
62
60
  const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
63
- target_w = c.offsetWidth - ((_trayRef$current = trayRef.current) === null || _trayRef$current === void 0 ? void 0 : _trayRef$current.offsetWidth) + margin;
64
-
61
+ target_w = c.offsetWidth - trayRef.current?.offsetWidth + margin;
65
62
  if (target_w >= 320 && target_w < c.offsetWidth) {
66
63
  c.style.boxSizing = 'border-box';
67
64
  c.style.width = `${target_w}px`;
68
65
  }
69
-
70
66
  return () => {
71
67
  c = document.querySelector('[role="main"]');
72
68
  if (!c) return;
@@ -76,10 +72,9 @@ export default function FindReplaceTray(_ref) {
76
72
  useEffect(() => {
77
73
  if (initialText) {
78
74
  onFind(initialText);
79
- } // eslint-disable-next-line react-hooks/exhaustive-deps
80
-
75
+ }
76
+ // eslint-disable-next-line react-hooks/exhaustive-deps
81
77
  }, []);
82
-
83
78
  function usePrevious(value) {
84
79
  const ref = useRef();
85
80
  useEffect(() => {
@@ -87,7 +82,6 @@ export default function FindReplaceTray(_ref) {
87
82
  }, [value]);
88
83
  return ref.current;
89
84
  }
90
-
91
85
  const prepend = selectionContext[0];
92
86
  const append = selectionContext[1];
93
87
  const srContextMsg = formatMessage('{prepend}{findText}{append}', {
@@ -97,15 +91,12 @@ export default function FindReplaceTray(_ref) {
97
91
  });
98
92
  const previousSrMsg = usePrevious(srContextMsg);
99
93
  const previousFindText = usePrevious(findText);
100
-
101
94
  const handleTextChange = e => {
102
95
  setFindText(e.target.value);
103
96
  onFind(e.target.value);
104
97
  };
105
-
106
98
  const handleFindKeyDown = e => {
107
99
  if (e.key !== 'Enter') return;
108
-
109
100
  if (e.shiftKey) {
110
101
  if (isButtonDisabled('previous')) return;
111
102
  onPrevious();
@@ -115,33 +106,27 @@ export default function FindReplaceTray(_ref) {
115
106
  onFind(findText);
116
107
  return;
117
108
  }
118
-
119
109
  if (isButtonDisabled('next')) return;
120
110
  onNext();
121
111
  }
122
112
  };
123
-
124
113
  const handleReplaceKeyDown = e => {
125
114
  if (e.key !== 'Enter') return;
126
115
  if (isButtonDisabled('replace')) return;
127
116
  const forward = !e.shiftKey;
128
117
  replace(replaceText, forward, false);
129
118
  };
130
-
131
119
  const replace = (newText, forward, all) => {
132
120
  onReplace(newText, forward, all);
133
-
134
121
  if (all) {
135
122
  setShowReplaceAlert('replaceAll');
136
123
  } else {
137
124
  setShowReplaceAlert('replace');
138
125
  }
139
-
140
126
  setAlertFindText(findText);
141
127
  setAlertReplaceText(newText);
142
128
  liveRegionKey.current++;
143
129
  };
144
-
145
130
  const alertText = showReplaceAlert === '' ? '' : showReplaceAlert === 'replace' ? formatMessage('Replaced {alertFindText} with {alertReplaceText}', {
146
131
  alertFindText,
147
132
  alertReplaceText
@@ -149,13 +134,11 @@ export default function FindReplaceTray(_ref) {
149
134
  alertFindText,
150
135
  alertReplaceText
151
136
  });
152
-
153
137
  const renderReplaceAlert = () => {
154
138
  if (!showReplaceAlert) {
155
139
  liveRegionKey.current = 0;
156
140
  return /*#__PURE__*/React.createElement(React.Fragment, null);
157
141
  }
158
-
159
142
  return /*#__PURE__*/React.createElement(Alert, {
160
143
  variant: "success",
161
144
  renderCloseButtonLabel: "Close Alert",
@@ -165,26 +148,31 @@ export default function FindReplaceTray(_ref) {
165
148
  timeout: 3000
166
149
  }, alertText);
167
150
  };
168
-
169
151
  const renderScreenReaderAlert = () => {
170
152
  return /*#__PURE__*/React.createElement(ScreenReaderContent, null, alertText);
171
153
  };
172
-
173
- const errMsg = formatMessage('No results found');
154
+ const errMsg = /*#__PURE__*/React.createElement(Flex, {
155
+ gap: "xx-small",
156
+ alignItems: "center"
157
+ }, /*#__PURE__*/React.createElement(IconWarningSolid, {
158
+ color: "error",
159
+ "data-testid": "error-icon"
160
+ }), /*#__PURE__*/React.createElement(Text, {
161
+ color: "danger",
162
+ size: "small"
163
+ }, formatMessage('No results found')));
174
164
  const messages = findText && max === 0 ? [{
175
165
  text: errMsg,
176
166
  type: 'error'
177
167
  }] : [];
178
-
179
168
  const resultText = () => {
180
- const srErrMsg = messages.length === 0 ? '' : errMsg; // resolves issue where focus is lost when this (dis)appears
181
-
169
+ const srErrMsg = messages.length === 0 ? '' : errMsg;
170
+ // resolves issue where focus is lost when this (dis)appears
182
171
  if (max === 0) {
183
172
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ScreenReaderContent, {
184
173
  "aria-live": "polite"
185
174
  }, srErrMsg), /*#__PURE__*/React.createElement(Text, null));
186
175
  }
187
-
188
176
  const msg = formatMessage('{index} of {max}', {
189
177
  index,
190
178
  max
@@ -192,12 +180,12 @@ export default function FindReplaceTray(_ref) {
192
180
  const srResultMsg = formatMessage('Result {index} of {max}.', {
193
181
  index,
194
182
  max
195
- }); // necessary to force screen reader to read the same message while typing
183
+ });
196
184
 
185
+ // necessary to force screen reader to read the same message while typing
197
186
  if (srContextMsg === previousSrMsg && previousFindText != findText) {
198
187
  srDupKey.current++;
199
188
  } else srDupKey.current = 0;
200
-
201
189
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(View, {
202
190
  as: "span",
203
191
  key: srDupKey.current,
@@ -208,28 +196,23 @@ export default function FindReplaceTray(_ref) {
208
196
  "aria-hidden": "true"
209
197
  }, msg));
210
198
  };
211
-
212
199
  const isButtonDisabled = button => {
213
200
  switch (button) {
214
201
  case 'next':
215
202
  case 'previous':
216
203
  return max < 2;
217
-
218
204
  case 'replace':
219
205
  return !replaceText || index === 0;
220
-
221
206
  case 'replaceAll':
222
207
  return !replaceText || max < 2 || index === 0;
223
-
224
208
  default:
225
209
  return false;
226
210
  }
227
211
  };
228
-
229
212
  return /*#__PURE__*/React.createElement(Tray, {
230
213
  "data-mce-component": true,
231
214
  label: formatMessage('Find and Replace'),
232
- mountNode: instuiPopupMountNode,
215
+ mountNode: instuiPopupMountNodeFn(),
233
216
  onDismiss: onRequestClose,
234
217
  open: true,
235
218
  placement: "end",
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2019 - present Instructure, Inc.
5
4
  *
@@ -17,29 +16,26 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import React, { useState } from 'react';
21
21
  import FindReplaceTray from './FindReplaceTray';
22
- export default function FindReplaceTrayController(_ref) {
23
- let {
24
- plugin,
25
- onDismiss,
26
- initialText = '',
27
- undoManager,
28
- getSelectionContext
29
- } = _ref;
22
+ export default function FindReplaceTrayController({
23
+ plugin,
24
+ onDismiss,
25
+ initialText = '',
26
+ undoManager,
27
+ getSelectionContext
28
+ }) {
30
29
  // this component really just exists to make the index easier to track
31
30
  const [findIndex, setFindIndex] = useState(0);
32
31
  const [findCount, setFindCount] = useState(0);
33
32
  const [selectionContext, setSelectionContext] = useState(['', '']);
34
-
35
33
  const updateSelectionContext = () => {
36
34
  const srText = getSelectionContext();
37
35
  setSelectionContext(srText);
38
36
  };
39
-
40
37
  const newFindIndex = direction => {
41
38
  let newIndex = 0;
42
-
43
39
  if (findCount === 0) {
44
40
  newIndex = 0;
45
41
  } else if (direction === 1) {
@@ -53,34 +49,28 @@ export default function FindReplaceTrayController(_ref) {
53
49
  newIndex = findCount;
54
50
  } else newIndex = findIndex - 1;
55
51
  }
56
-
57
52
  return newIndex;
58
53
  };
59
-
60
54
  const done = () => {
61
55
  plugin.done(false);
62
56
  setFindCount(0);
63
57
  setFindIndex(0);
64
58
  setSelectionContext([]);
65
59
  };
66
-
67
60
  const handleDismiss = () => {
68
61
  done();
69
62
  onDismiss();
70
63
  };
71
-
72
64
  const handleNext = () => {
73
65
  plugin.next();
74
66
  setFindIndex(newFindIndex(1));
75
67
  updateSelectionContext();
76
68
  };
77
-
78
69
  const handlePrevious = () => {
79
70
  plugin.prev();
80
71
  setFindIndex(newFindIndex(-1));
81
72
  updateSelectionContext();
82
73
  };
83
-
84
74
  const handleFind = text => {
85
75
  if (!text) {
86
76
  done();
@@ -92,34 +82,26 @@ export default function FindReplaceTrayController(_ref) {
92
82
  updateSelectionContext();
93
83
  }
94
84
  };
95
-
96
- const handleReplace = function (text) {
97
- let forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
98
- let all = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
85
+ const handleReplace = (text, forward = true, all = false) => {
99
86
  if (!text) return;
100
- undoManager === null || undoManager === void 0 ? void 0 : undoManager.add();
87
+ undoManager?.add();
101
88
  plugin.replace(text, forward, all);
102
-
103
89
  if (findCount === 1 || all) {
104
90
  done();
105
91
  return;
106
- } // we can't just find again, because that will reset index to 1
107
-
108
-
92
+ }
93
+ // we can't just find again, because that will reset index to 1
109
94
  let newIndex;
110
95
  const newFindCount = findCount - 1;
111
-
112
96
  if (forward) {
113
97
  newIndex = findIndex === findCount ? 1 : findIndex;
114
98
  } else {
115
99
  newIndex = findIndex === 1 ? newFindCount : findIndex - 1;
116
100
  }
117
-
118
101
  setFindCount(newFindCount);
119
102
  setFindIndex(newIndex);
120
103
  updateSelectionContext();
121
104
  };
122
-
123
105
  return /*#__PURE__*/React.createElement(FindReplaceTray, {
124
106
  onRequestClose: handleDismiss,
125
107
  onNext: handleNext,