@instructure/canvas-rce 5.14.1 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/DEVELOPMENT.md +2 -2
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +18 -73
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +21 -77
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +15 -39
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +105 -64
  25. package/es/common/incremental-loading/LoadMoreButton.js +4 -4
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +5 -13
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +16 -10
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +24 -35
  36. package/es/enhance-user-content/enhance_user_content.js +32 -67
  37. package/es/enhance-user-content/external_links.js +6 -9
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +22 -50
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +48 -107
  42. package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
  43. package/es/format-message.js +4 -5
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.d.ts +59 -0
  47. package/es/index.js +6 -6
  48. package/es/rce/AlertMessageArea.js +15 -16
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +3 -2
  51. package/es/rce/RCE.js +16 -17
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +29 -14
  54. package/es/rce/RCEWrapper.js +530 -641
  55. package/es/rce/RCEWrapper.utils.js +131 -0
  56. package/es/rce/RCEWrapperProps.js +9 -5
  57. package/es/rce/RceHtmlEditor.js +17 -19
  58. package/es/rce/ResizeHandle.js +4 -10
  59. package/es/rce/RestoreAutoSaveModal.js +1 -2
  60. package/es/rce/ShowOnFocusButton/index.js +2 -8
  61. package/es/rce/StatusBar.js +10 -44
  62. package/es/rce/alertHandler.js +1 -4
  63. package/es/rce/contentInsertion.js +36 -59
  64. package/es/rce/contentInsertionUtils.js +6 -8
  65. package/es/rce/contentRendering.js +13 -17
  66. package/es/rce/customEvents.js +1 -0
  67. package/es/rce/editorLanguage.js +23 -11
  68. package/es/rce/indicatorRegion.js +7 -7
  69. package/es/rce/normalizeLocale.js +5 -3
  70. package/es/rce/normalizeProps.js +7 -5
  71. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  72. package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
  74. package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
  75. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  76. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  78. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
  83. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
  84. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  85. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  86. package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
  87. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
  93. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
  95. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
  96. package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
  97. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  98. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  99. package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
  100. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  101. package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
  102. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  103. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  104. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
  127. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  128. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
  129. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  130. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  131. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  132. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  133. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
  134. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  135. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  136. package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
  137. package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
  138. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  139. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
  140. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
  141. package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
  142. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
  144. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  145. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
  147. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  148. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  149. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
  150. package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
  151. package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
  153. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
  154. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  155. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_image/plugin.js +14 -20
  157. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
  159. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  160. package/es/rce/plugins/instructure_links/components/Link.js +68 -84
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  164. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
  165. package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
  166. package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
  167. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  168. package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
  169. package/es/rce/plugins/instructure_links/plugin.js +23 -49
  170. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  171. package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
  172. package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
  173. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  174. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  175. package/es/rce/plugins/instructure_paste/plugin.js +29 -33
  176. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
  177. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
  182. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  184. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  185. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  186. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
  187. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  188. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
  189. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
  199. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
  200. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  201. package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
  202. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
  203. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
  204. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  205. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
  206. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
  207. package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
  208. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  209. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  210. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
  211. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
  212. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
  213. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  214. package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
  215. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  216. package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
  217. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
  218. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  219. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
  220. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
  221. package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
  222. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  223. package/es/rce/plugins/shared/ColorInput.js +27 -39
  224. package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
  225. package/es/rce/plugins/shared/ContentSelection.js +29 -78
  226. package/es/rce/plugins/shared/DimensionUtils.js +3 -12
  227. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  228. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  229. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  230. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  231. package/es/rce/plugins/shared/EventUtils.js +2 -4
  232. package/es/rce/plugins/shared/Filter.js +8 -38
  233. package/es/rce/plugins/shared/FixedContentTray.js +16 -17
  234. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
  235. package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
  236. package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
  237. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
  239. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
  240. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
  241. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
  242. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
  244. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
  245. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  246. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
  247. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  250. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  252. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
  253. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
  254. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
  255. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  256. package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
  257. package/es/rce/plugins/shared/LinkDisplay.js +9 -11
  258. package/es/rce/plugins/shared/PreviewIcon.js +9 -15
  259. package/es/rce/plugins/shared/Previewable.js +1 -0
  260. package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
  261. package/es/rce/plugins/shared/StoreContext.js +9 -12
  262. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
  263. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  264. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
  265. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
  266. package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
  267. package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
  268. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  269. package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
  270. package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
  271. package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
  272. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
  273. package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
  274. package/es/rce/plugins/shared/Upload/index.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
  276. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
  277. package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
  278. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  279. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  280. package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
  281. package/es/rce/plugins/shared/compressionUtils.js +18 -28
  282. package/es/rce/plugins/shared/dateUtils.js +1 -1
  283. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  284. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
  285. package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
  286. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  287. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  288. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  289. package/es/rce/plugins/shared/fileShape.js +4 -9
  290. package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
  291. package/es/rce/plugins/shared/fileUtils.js +1 -2
  292. package/es/rce/plugins/shared/linkUtils.js +1 -16
  293. package/es/rce/plugins/shared/round.js +2 -2
  294. package/es/rce/plugins/shared/trayUtils.js +7 -3
  295. package/es/rce/plugins/shared/useDataUrl.js +13 -14
  296. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  297. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
  298. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
  299. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  300. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  301. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  302. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
  303. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
  315. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  316. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  317. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
  321. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
  322. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
  323. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  324. package/es/rce/root.js +17 -16
  325. package/es/rce/sanitizePlugins.js +1 -3
  326. package/es/rce/style.js +1 -4
  327. package/es/rce/tinyRCE.js +14 -9
  328. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  329. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  330. package/es/rce/transformContent.js +9 -11
  331. package/es/rce/types.js +1 -0
  332. package/es/rce/userOS.js +1 -1
  333. package/es/rce/wrapInitCb.js +50 -43
  334. package/es/rcs/api.js +100 -171
  335. package/es/rcs/buildError.js +8 -20
  336. package/es/rcs/fake.js +9 -20
  337. package/es/sidebar/actions/all_files.js +2 -0
  338. package/es/sidebar/actions/data.js +4 -7
  339. package/es/sidebar/actions/documents.js +19 -18
  340. package/es/sidebar/actions/files.js +21 -28
  341. package/es/sidebar/actions/filter.js +5 -5
  342. package/es/sidebar/actions/flickr.js +1 -1
  343. package/es/sidebar/actions/images.js +32 -37
  344. package/es/sidebar/actions/links.js +1 -0
  345. package/es/sidebar/actions/media.js +27 -28
  346. package/es/sidebar/actions/session.js +2 -5
  347. package/es/sidebar/actions/ui.js +1 -0
  348. package/es/sidebar/actions/upload.js +38 -74
  349. package/es/sidebar/containers/Sidebar.js +1 -2
  350. package/es/sidebar/containers/sidebarHandlers.js +9 -13
  351. package/es/sidebar/dragHtml.js +11 -5
  352. package/es/sidebar/reducers/all_files.js +5 -6
  353. package/es/sidebar/reducers/collection.js +12 -15
  354. package/es/sidebar/reducers/collections.js +6 -8
  355. package/es/sidebar/reducers/documents.js +7 -16
  356. package/es/sidebar/reducers/files.js +4 -6
  357. package/es/sidebar/reducers/filter.js +8 -23
  358. package/es/sidebar/reducers/flickr.js +10 -12
  359. package/es/sidebar/reducers/folder.js +16 -18
  360. package/es/sidebar/reducers/folders.js +4 -6
  361. package/es/sidebar/reducers/images.js +4 -16
  362. package/es/sidebar/reducers/index.js +3 -1
  363. package/es/sidebar/reducers/media.js +7 -16
  364. package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
  365. package/es/sidebar/reducers/noop.js +2 -2
  366. package/es/sidebar/reducers/rootFolderId.js +2 -5
  367. package/es/sidebar/reducers/session.js +4 -6
  368. package/es/sidebar/reducers/ui.js +6 -25
  369. package/es/sidebar/reducers/upload.js +16 -64
  370. package/es/sidebar/store/configureStore.js +1 -0
  371. package/es/sidebar/store/initialState.js +14 -26
  372. package/es/translations/locales/ab.js +1 -0
  373. package/es/translations/locales/ar.js +72 -8
  374. package/es/translations/locales/ca.js +72 -8
  375. package/es/translations/locales/cs.js +1 -0
  376. package/es/translations/locales/cs_CZ.js +1 -0
  377. package/es/translations/locales/cy.js +72 -8
  378. package/es/translations/locales/da-x-k12.js +72 -8
  379. package/es/translations/locales/da.js +72 -8
  380. package/es/translations/locales/da_DK.js +1 -0
  381. package/es/translations/locales/de.js +72 -8
  382. package/es/translations/locales/el.js +4 -0
  383. package/es/translations/locales/en-AU-x-unimelb.js +72 -8
  384. package/es/translations/locales/en-GB-x-ukhe.js +72 -8
  385. package/es/translations/locales/en.js +72 -8
  386. package/es/translations/locales/en_AU.js +72 -8
  387. package/es/translations/locales/en_CA.js +72 -8
  388. package/es/translations/locales/en_CY.js +72 -8
  389. package/es/translations/locales/en_GB.js +72 -8
  390. package/es/translations/locales/en_NZ.js +1 -0
  391. package/es/translations/locales/en_SE.js +1 -0
  392. package/es/translations/locales/en_US.js +1 -0
  393. package/es/translations/locales/es.js +72 -8
  394. package/es/translations/locales/es_ES.js +72 -8
  395. package/es/translations/locales/es_GT.js +1 -0
  396. package/es/translations/locales/fa_IR.js +7 -0
  397. package/es/translations/locales/fi.js +72 -8
  398. package/es/translations/locales/fr.js +72 -8
  399. package/es/translations/locales/fr_CA.js +73 -9
  400. package/es/translations/locales/ga.js +5 -13
  401. package/es/translations/locales/he.js +7 -0
  402. package/es/translations/locales/hi.js +72 -8
  403. package/es/translations/locales/ht.js +72 -8
  404. package/es/translations/locales/hu.js +7 -6
  405. package/es/translations/locales/hu_HU.js +1 -0
  406. package/es/translations/locales/hy.js +1 -0
  407. package/es/translations/locales/id.js +72 -8
  408. package/es/translations/locales/id_ID.js +1 -0
  409. package/es/translations/locales/is.js +72 -8
  410. package/es/translations/locales/it.js +72 -8
  411. package/es/translations/locales/ja.js +72 -8
  412. package/es/translations/locales/ko.js +1 -0
  413. package/es/translations/locales/ko_KR.js +1 -0
  414. package/es/translations/locales/lt.js +1 -0
  415. package/es/translations/locales/lt_LT.js +1 -0
  416. package/es/translations/locales/mi.js +72 -8
  417. package/es/translations/locales/mn_MN.js +1 -0
  418. package/es/translations/locales/ms.js +72 -8
  419. package/es/translations/locales/nb-x-k12.js +72 -8
  420. package/es/translations/locales/nb.js +72 -8
  421. package/es/translations/locales/nl.js +72 -8
  422. package/es/translations/locales/nl_NL.js +1 -0
  423. package/es/translations/locales/nn.js +7 -6
  424. package/es/translations/locales/pl.js +72 -8
  425. package/es/translations/locales/pt.js +72 -8
  426. package/es/translations/locales/pt_BR.js +72 -8
  427. package/es/translations/locales/ro.js +1 -0
  428. package/es/translations/locales/ru.js +72 -8
  429. package/es/translations/locales/se.js +1 -0
  430. package/es/translations/locales/sl.js +72 -8
  431. package/es/translations/locales/sv-x-k12.js +72 -8
  432. package/es/translations/locales/sv.js +72 -8
  433. package/es/translations/locales/sv_SE.js +1 -0
  434. package/es/translations/locales/tg.js +1 -0
  435. package/es/translations/locales/th.js +72 -8
  436. package/es/translations/locales/th_TH.js +1 -0
  437. package/es/translations/locales/tl_PH.js +1 -0
  438. package/es/translations/locales/tr.js +7 -0
  439. package/es/translations/locales/uk_UA.js +7 -0
  440. package/es/translations/locales/vi.js +72 -8
  441. package/es/translations/locales/vi_VN.js +1 -0
  442. package/es/translations/locales/zh-Hans.js +72 -8
  443. package/es/translations/locales/zh-Hant.js +72 -8
  444. package/es/translations/locales/zh.js +72 -8
  445. package/es/translations/locales/zh_HK.js +72 -8
  446. package/es/translations/locales/zh_TW.Big5.js +1 -0
  447. package/es/translations/locales/zh_TW.js +1 -0
  448. package/es/translations/tinymce/ar_SA.js +1 -0
  449. package/es/translations/tinymce/fi.js +1 -0
  450. package/es/translations/tinymce/ga.js +1 -0
  451. package/es/translations/tinymce/id.js +1 -0
  452. package/es/translations/tinymce/ru.js +1 -0
  453. package/es/translations/tinymce/ru_RU.js +1 -0
  454. package/es/translations/tinymce/sl.js +1 -0
  455. package/es/translations/tinymce/sr.js +1 -0
  456. package/es/translations/tinymce/th.js +1 -0
  457. package/es/translations/tinymce/uk_UA.js +1 -0
  458. package/es/translations/tinymce/vi_VN.js +1 -0
  459. package/es/util/TypedDict.js +4 -2
  460. package/es/util/elem-util.js +1 -1
  461. package/es/util/encrypted-storage.js +3 -13
  462. package/es/util/file-url-util.js +2 -7
  463. package/es/util/fullscreenHelpers.js +9 -9
  464. package/es/util/instui-icon-helper.js +4 -3
  465. package/es/util/loadingPlaceholder.js +39 -41
  466. package/es/util/simpleCache.js +1 -5
  467. package/es/util/string-util.js +1 -1
  468. package/es/util/textarea-editing-util.js +3 -7
  469. package/es/util/tinymce-plugin-util.js +0 -5
  470. package/es/util/url-util.js +20 -29
  471. package/eslint.config.js +250 -0
  472. package/jest.config.js +1 -1
  473. package/locales/en.json +190 -10
  474. package/package.json +78 -82
  475. package/scripts/build-canvas +2 -1
  476. package/scripts/build.js +4 -4
  477. package/scripts/installTranslations.js +7 -8
  478. package/testcafe/RCEWrapper.test.js +0 -1
  479. package/testcafe/StatusBar.test.js +0 -1
  480. package/testcafe/axe.test.js +3 -4
  481. package/testcafe/enhanceUserContent.test.js +0 -1
  482. package/tsconfig.json +21 -16
  483. package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
  484. package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
  485. package/.eslintrc +0 -45
  486. package/.prettierignore +0 -6
  487. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  488. package/es/rce/__mocks__/tinymceReact.js +0 -55
  489. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import ReactDOM from 'react-dom';
20
21
  import bridge from '../../../../bridge';
@@ -29,103 +30,77 @@ export default class TrayController {
29
30
  this._editor = null;
30
31
  this._audioContainer = null;
31
32
  }
32
-
33
33
  get container() {
34
34
  let _container = document.getElementById(CONTAINER_ID);
35
-
36
35
  if (_container == null) {
37
36
  _container = document.createElement('div');
38
37
  _container.id = CONTAINER_ID;
39
38
  document.body.appendChild(_container);
40
39
  }
41
-
42
40
  return _container;
43
41
  }
44
-
45
42
  get isOpen() {
46
43
  return this._isOpen;
47
44
  }
48
-
49
45
  showTrayForEditor(editor) {
50
46
  this._shouldOpen = true;
51
47
  this._editor = editor;
52
48
  this._audioContainer = findMediaPlayerIframe(editor.selection.getNode());
53
-
54
49
  if (bridge.focusedEditor) {
55
50
  // Dismiss any content trays that may already be open
56
51
  bridge.hideTrays();
57
52
  }
58
-
59
53
  const trayProps = bridge.trayProps.get(editor);
60
-
61
54
  this._renderTray(trayProps);
62
55
  }
63
-
64
56
  hideTrayForEditor(editor) {
65
57
  if (this._editor === editor) {
66
58
  this._dismissTray();
67
59
  }
68
60
  }
69
-
70
61
  _dismissTray() {
71
62
  if (this._audioContainer) {
72
63
  this._editor.selection.select(this._audioContainer);
73
64
  }
74
-
75
65
  this._resetController();
76
66
  }
77
-
78
67
  _resetController() {
79
68
  this._shouldOpen = false;
80
69
  const trayProps = bridge.trayProps.get(this._editor);
81
-
82
70
  this._renderTray(trayProps);
83
-
84
71
  this._editor = null;
85
72
  this._audioContainer = null;
86
73
  const elem = document.getElementById(CONTAINER_ID);
87
74
  return elem.parentNode.removeChild(elem);
88
75
  }
89
-
90
76
  _applyAudioOptions(audioOptions) {
91
77
  const hasAttachmentId = RCEGlobals.getFeatures().media_links_use_attachment_id && audioOptions.attachment_id;
92
-
93
78
  if (!hasAttachmentId && (!audioOptions.media_object_id || audioOptions.media_object_id === 'undefined')) {
94
79
  return;
95
80
  }
96
-
97
81
  const container = this._audioContainer;
98
82
  return audioOptions.updateMediaObject({
99
83
  media_object_id: audioOptions.media_object_id,
100
84
  subtitles: audioOptions.subtitles,
101
85
  attachment_id: audioOptions.attachment_id
102
- }).then(() => container === null || container === void 0 ? void 0 : container.contentWindow.location.reload()).catch(ex => {
103
- // eslint-disable-next-line no-console
86
+ }).then(() => container?.contentWindow.location.reload()).catch(ex => {
104
87
  console.error('Failed updating audio captions', ex);
105
88
  });
106
89
  }
107
-
108
90
  requestSubtitlesFromIframe(cb) {
109
- var _this$_audioContainer, _this$_audioContainer2;
110
-
111
91
  if (!bridge.canvasOrigin) return;
112
92
  this._subtitleListener = new AbortController();
113
93
  window.addEventListener('message', event => {
114
- var _event$data;
115
-
116
- if ((event === null || event === void 0 ? void 0 : (_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.subject) === 'media_tracks_response') {
117
- var _event$data2;
118
-
119
- cb(event === null || event === void 0 ? void 0 : (_event$data2 = event.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.payload);
94
+ if (event?.data?.subject === 'media_tracks_response') {
95
+ cb(event?.data?.payload);
120
96
  }
121
97
  }, {
122
98
  signal: this._subtitleListener.signal
123
99
  });
124
- (_this$_audioContainer = this._audioContainer) === null || _this$_audioContainer === void 0 ? void 0 : (_this$_audioContainer2 = _this$_audioContainer.contentWindow) === null || _this$_audioContainer2 === void 0 ? void 0 : _this$_audioContainer2.postMessage({
100
+ this._audioContainer?.contentWindow?.postMessage({
125
101
  subject: 'media_tracks_request'
126
102
  }, bridge.canvasOrigin);
127
103
  }
128
-
129
104
  _renderTray(trayProps) {
130
105
  const audioOptions = asAudioElement(this._audioContainer) || {};
131
106
  const element = /*#__PURE__*/React.createElement(AudioOptionsTray, {
@@ -134,15 +109,12 @@ export default class TrayController {
134
109
  this._isOpen = true;
135
110
  },
136
111
  onExited: () => {
137
- var _this$_subtitleListen;
138
-
139
112
  bridge.focusActiveEditor(false);
140
113
  this._isOpen = false;
141
- (_this$_subtitleListen = this._subtitleListener) === null || _this$_subtitleListen === void 0 ? void 0 : _this$_subtitleListen.abort();
114
+ this._subtitleListener?.abort();
142
115
  },
143
116
  onSave: options => {
144
117
  this._applyAudioOptions(options);
145
-
146
118
  this._dismissTray();
147
119
  },
148
120
  onDismiss: () => this._dismissTray(),
@@ -152,5 +124,4 @@ export default class TrayController {
152
124
  });
153
125
  ReactDOM.render(element, this.container);
154
126
  }
155
-
156
127
  }
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React, { useState, useEffect } from 'react';
19
20
  import { arrayOf, bool, func, shape, string } from 'prop-types';
20
21
  import { Flex } from '@instructure/ui-flex';
@@ -26,27 +27,23 @@ import { StoreProvider } from '../../shared/StoreContext';
26
27
  import Bridge from '../../../../bridge';
27
28
  import formatMessage from '../../../../format-message';
28
29
  import { getTrayHeight } from '../../shared/trayUtils';
29
- import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
30
+ import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
30
31
  import { Heading } from '@instructure/ui-heading';
31
-
32
32
  const getLiveRegion = () => document.getElementById('flash_screenreader_holder');
33
-
34
- export default function AudioOptionsTray(_ref) {
35
- let {
36
- open,
37
- onEntered,
38
- onExited,
39
- onDismiss,
40
- onSave,
41
- trayProps,
42
- audioOptions,
43
- requestSubtitlesFromIframe
44
- } = _ref;
33
+ export default function AudioOptionsTray({
34
+ open,
35
+ onEntered,
36
+ onExited,
37
+ onDismiss,
38
+ onSave,
39
+ trayProps,
40
+ audioOptions,
41
+ requestSubtitlesFromIframe
42
+ }) {
45
43
  const [subtitles, setSubtitles] = useState(audioOptions.tracks || []);
46
44
  useEffect(() => {
47
45
  if (subtitles.length === 0) requestSubtitlesFromIframe(setSubtitles);
48
46
  }, []);
49
-
50
47
  const handleSave = (e, contentProps) => {
51
48
  onSave({
52
49
  media_object_id: audioOptions.id,
@@ -55,12 +52,11 @@ export default function AudioOptionsTray(_ref) {
55
52
  updateMediaObject: contentProps.updateMediaObject
56
53
  });
57
54
  };
58
-
59
55
  return /*#__PURE__*/React.createElement(StoreProvider, trayProps, contentProps => /*#__PURE__*/React.createElement(Tray, {
60
56
  key: "audio-options-tray",
61
57
  "data-mce-component": true,
62
58
  label: formatMessage('Audio Options Tray'),
63
- mountNode: instuiPopupMountNode,
59
+ mountNode: instuiPopupMountNodeFn,
64
60
  onDismiss: onDismiss,
65
61
  onEntered: onEntered,
66
62
  onExited: onExited,
@@ -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, { useRef } from 'react';
19
20
  import { func, oneOf, shape, string } from 'prop-types';
20
21
  import { contentTrayDocumentShape } from '../../shared/fileShape';
@@ -24,23 +25,18 @@ import { View } from '@instructure/ui-view';
24
25
  import Link from '../../instructure_documents/components/Link';
25
26
  import { LoadMoreButton, LoadingIndicator, LoadingStatus, useIncrementalLoading } from '../../../../common/incremental-loading';
26
27
  const PENDING_MEDIA_ENTRY_ID = 'maybe';
27
-
28
28
  function hasFiles(media) {
29
29
  return media.files.length > 0;
30
30
  }
31
-
32
31
  function isEmpty(media) {
33
32
  return !hasFiles(media) && !media.hasMore && !media.isLoading;
34
33
  }
35
-
36
34
  function renderLinks(files, handleClick, lastItemRef) {
37
35
  return files.map((f, index) => {
38
36
  let focusRef = null;
39
-
40
37
  if (index === files.length - 1) {
41
38
  focusRef = lastItemRef;
42
39
  }
43
-
44
40
  return /*#__PURE__*/React.createElement(Link, Object.assign({
45
41
  key: f.id
46
42
  }, f, {
@@ -51,7 +47,6 @@ function renderLinks(files, handleClick, lastItemRef) {
51
47
  }));
52
48
  });
53
49
  }
54
-
55
50
  function renderLoadingError(_error) {
56
51
  return /*#__PURE__*/React.createElement(View, {
57
52
  as: "div",
@@ -61,7 +56,6 @@ function renderLoadingError(_error) {
61
56
  color: "danger"
62
57
  }, formatMessage('Loading failed.')));
63
58
  }
64
-
65
59
  export default function MediaPanel(props) {
66
60
  const {
67
61
  fetchInitialMedia,
@@ -89,11 +83,9 @@ export default function MediaPanel(props) {
89
83
  sortBy,
90
84
  searchString
91
85
  });
92
-
93
86
  const handleFileClick = file => {
94
87
  props.onMediaEmbed(file);
95
88
  };
96
-
97
89
  return /*#__PURE__*/React.createElement(View, {
98
90
  as: "div",
99
91
  "data-testid": "instructure_links-MediaPanel"
@@ -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 ReactDOM from 'react-dom';
20
21
  import bridge from '../../../../bridge';
@@ -27,7 +28,6 @@ export const VIDEO_SIZE_DEFAULT = {
27
28
  height: '225px',
28
29
  width: '400px'
29
30
  }; // AKA "LARGE"
30
-
31
31
  export const AUDIO_PLAYER_SIZE = {
32
32
  width: '320px',
33
33
  height: '14.25rem'
@@ -39,77 +39,55 @@ export default class TrayController {
39
39
  this._shouldOpen = false;
40
40
  this._renderId = 0;
41
41
  }
42
-
43
42
  get $container() {
44
43
  let $container = document.getElementById(CONTAINER_ID);
45
-
46
44
  if ($container == null) {
47
45
  $container = document.createElement('div');
48
46
  $container.id = CONTAINER_ID;
49
47
  document.body.appendChild($container);
50
48
  }
51
-
52
49
  return $container;
53
50
  }
54
-
55
51
  get isOpen() {
56
52
  return this._isOpen;
57
53
  }
58
-
59
54
  showTrayForEditor(editor) {
60
55
  this._editor = editor;
61
56
  this.$videoContainer = findMediaPlayerIframe(editor.selection.getNode());
62
57
  this._shouldOpen = true;
63
-
64
58
  if (bridge.focusedEditor) {
65
59
  // Dismiss any content trays that may already be open
66
60
  bridge.hideTrays();
67
61
  }
68
-
69
62
  const trayProps = bridge.trayProps.get(editor);
70
-
71
63
  this._renderTray(trayProps);
72
64
  }
73
-
74
65
  hideTrayForEditor(editor) {
75
66
  if (this._editor === editor) {
76
67
  this._dismissTray();
77
68
  }
78
69
  }
79
-
80
70
  _applyVideoOptions(videoOptions) {
81
- var _this$$videoContainer;
82
-
83
- if (((_this$$videoContainer = this.$videoContainer) === null || _this$$videoContainer === void 0 ? void 0 : _this$$videoContainer.tagName) === 'IFRAME') {
71
+ if (this.$videoContainer?.tagName === 'IFRAME') {
84
72
  const $tinymceIframeShim = this.$videoContainer.parentElement;
85
-
86
73
  if (videoOptions.displayAs === 'embed') {
87
- var _videoOptions$subtitl;
88
-
89
- const isVertical = videoOptions.appliedHeight > videoOptions.appliedWidth; // player v5 requires more space for the CC button
74
+ const isVertical = videoOptions.appliedHeight > videoOptions.appliedWidth;
75
+ // player v5 requires more space for the CC button
90
76
  // TODO: remove when using v7
91
-
92
- const minWidth = (_videoOptions$subtitl = videoOptions.subtitles) !== null && _videoOptions$subtitl !== void 0 && _videoOptions$subtitl.length ? 400 : 320;
77
+ const minWidth = videoOptions.subtitles?.length ? 400 : 320;
93
78
  const styl = {
94
79
  height: `${videoOptions.appliedHeight}px`,
95
80
  width: `${Math.max(minWidth, isVertical ? videoOptions.appliedHeight : videoOptions.appliedWidth)}px`
96
81
  };
97
-
98
82
  this._editor.dom.setStyles($tinymceIframeShim, styl);
99
-
100
83
  this._editor.dom.setStyles(this.$videoContainer, styl);
101
-
102
84
  const title = videoOptions.titleText;
103
-
104
85
  this._editor.dom.setAttrib($tinymceIframeShim, 'data-mce-p-title', title);
105
-
106
86
  this._editor.dom.setAttrib($tinymceIframeShim, 'data-mce-p-data-titleText', videoOptions.titleText);
107
-
108
87
  this._editor.dom.setAttrib(this.$videoContainer, 'title', title);
88
+ this._editor.dom.setAttrib(this.$videoContainer, 'data-titleText', videoOptions.titleText);
109
89
 
110
- this._editor.dom.setAttrib(this.$videoContainer, 'data-titleText', videoOptions.titleText); // tell tinymce so the context toolbar resets
111
-
112
-
90
+ // tell tinymce so the context toolbar resets
113
91
  this._editor.fire('ObjectResized', {
114
92
  target: this.$videoContainer,
115
93
  width: videoOptions.appliedWidth,
@@ -117,37 +95,29 @@ export default class TrayController {
117
95
  });
118
96
  } else {
119
97
  const href = this._editor.dom.getAttrib($tinymceIframeShim, 'data-mce-p-src');
120
-
121
98
  const title = videoOptions.titleText || this._editor.dom.getAttrib(this.$videoContainer, 'title');
122
-
123
99
  const link = document.createElement('a');
124
100
  link.setAttribute('href', href);
125
101
  link.setAttribute('target', '_blank');
126
102
  link.setAttribute('rel', 'noreferrer noopener');
127
103
  link.textContent = title;
128
-
129
104
  this._editor.dom.replace(link, $tinymceIframeShim);
130
-
131
105
  this._editor.selection.select(link);
132
-
133
106
  this.$videoContainer = null;
134
107
  }
135
-
136
108
  const data = {
137
109
  media_object_id: videoOptions.media_object_id,
138
110
  title: videoOptions.titleText,
139
111
  subtitles: videoOptions.subtitles
140
112
  };
141
-
142
113
  if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
143
114
  data.attachment_id = videoOptions.attachment_id;
144
- } // If the video just edited came from a file uploaded to canvas
115
+ }
116
+
117
+ // If the video just edited came from a file uploaded to canvas
145
118
  // and not notorious, we probably don't have a media_object_id.
146
119
  // If not, we can't update the MediaObject in the canvas db.
147
-
148
-
149
120
  const hasMediaId = videoOptions.media_object_id && videoOptions.media_object_id !== 'undefined' || data.attachment_id && data.attachment_id !== 'undefined';
150
-
151
121
  if (hasMediaId && !videoOptions.editLocked) {
152
122
  videoOptions.updateMediaObject(data).then(_r => {
153
123
  if (this.$videoContainer && videoOptions.displayAs === 'embed') {
@@ -158,52 +128,36 @@ export default class TrayController {
158
128
  }, bridge.canvasOrigin);
159
129
  }
160
130
  }).catch(ex => {
161
- console.error('failed updating video captions', ex); // eslint-disable-line no-console
131
+ console.error('failed updating video captions', ex);
162
132
  });
163
133
  }
164
134
  }
165
-
166
135
  this._dismissTray();
167
136
  }
168
-
169
137
  _dismissTray() {
170
138
  if (this.$videoContainer) {
171
- var _this$_editor, _this$_editor$selecti;
172
-
173
- (_this$_editor = this._editor) === null || _this$_editor === void 0 ? void 0 : (_this$_editor$selecti = _this$_editor.selection) === null || _this$_editor$selecti === void 0 ? void 0 : _this$_editor$selecti.select(this.$videoContainer);
139
+ this._editor?.selection?.select(this.$videoContainer);
174
140
  }
175
-
176
141
  this._shouldOpen = false;
177
-
178
142
  this._renderTray();
179
-
180
143
  this._editor = null;
181
144
  }
182
-
183
145
  requestSubtitlesFromIframe(cb) {
184
- var _this$$videoContainer2, _this$$videoContainer3;
185
-
186
146
  if (!bridge.canvasOrigin) return;
187
147
  this._subtitleListener = new AbortController();
188
148
  window.addEventListener('message', event => {
189
- var _event$data;
190
-
191
- if ((event === null || event === void 0 ? void 0 : (_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.subject) === 'media_tracks_response') {
192
- var _event$data2;
193
-
194
- cb(event === null || event === void 0 ? void 0 : (_event$data2 = event.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.payload);
149
+ if (event?.data?.subject === 'media_tracks_response') {
150
+ cb(event?.data?.payload);
195
151
  }
196
152
  }, {
197
153
  signal: this._subtitleListener.signal
198
154
  });
199
- (_this$$videoContainer2 = this.$videoContainer) === null || _this$$videoContainer2 === void 0 ? void 0 : (_this$$videoContainer3 = _this$$videoContainer2.contentWindow) === null || _this$$videoContainer3 === void 0 ? void 0 : _this$$videoContainer3.postMessage({
155
+ this.$videoContainer?.contentWindow?.postMessage({
200
156
  subject: 'media_tracks_request'
201
157
  }, bridge.canvasOrigin);
202
158
  }
203
-
204
159
  _renderTray(trayProps) {
205
160
  let vo = {};
206
-
207
161
  if (this._shouldOpen) {
208
162
  /*
209
163
  * When the tray is being opened again, it should be rendered fresh
@@ -213,7 +167,6 @@ export default class TrayController {
213
167
  this._renderId++;
214
168
  vo = asVideoElement(this.$videoContainer) || {};
215
169
  }
216
-
217
170
  const element = /*#__PURE__*/React.createElement(VideoOptionsTray, {
218
171
  id: "video-options-tray",
219
172
  key: this._renderId,
@@ -222,11 +175,9 @@ export default class TrayController {
222
175
  this._isOpen = true;
223
176
  },
224
177
  onExited: () => {
225
- var _this$_subtitleListen;
226
-
227
178
  bridge.focusActiveEditor(false);
228
179
  this._isOpen = false;
229
- (_this$_subtitleListen = this._subtitleListener) === null || _this$_subtitleListen === void 0 ? void 0 : _this$_subtitleListen.abort();
180
+ this._subtitleListener?.abort();
230
181
  },
231
182
  onSave: videoOptions => {
232
183
  this._applyVideoOptions(videoOptions);
@@ -239,5 +190,4 @@ export default class TrayController {
239
190
  });
240
191
  ReactDOM.render(element, this.$container);
241
192
  }
242
-
243
193
  }
@@ -38,24 +38,22 @@ import RceApiSource from '../../../../rcs/api';
38
38
  import formatMessage from '../../../../format-message';
39
39
  import DimensionsInput, { useDimensionsState } from '../../shared/DimensionsInput';
40
40
  import { getTrayHeight } from '../../shared/trayUtils';
41
- import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
41
+ import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
42
42
  import { parsedStudioOptionsPropType } from '../../shared/StudioLtiSupportUtils';
43
-
44
43
  const getLiveRegion = () => document.getElementById('flash_screenreader_holder');
45
-
46
- export default function VideoOptionsTray(_ref) {
47
- let {
48
- videoOptions,
49
- onRequestClose,
50
- onSave,
51
- open,
52
- trayProps,
53
- requestSubtitlesFromIframe = () => {},
54
- onEntered = null,
55
- onExited = null,
56
- id = 'video-options-tray',
57
- studioOptions = null
58
- } = _ref;
44
+ export default function VideoOptionsTray({
45
+ videoOptions,
46
+ onRequestClose,
47
+ onSave,
48
+ open,
49
+ trayProps,
50
+ requestSubtitlesFromIframe = () => {},
51
+ onEntered = null,
52
+ onExited = null,
53
+ id = 'video-options-tray',
54
+ studioOptions = null,
55
+ forBlockEditorUse = false
56
+ }) {
59
57
  const {
60
58
  naturalHeight,
61
59
  naturalWidth
@@ -74,8 +72,8 @@ export default function VideoOptionsTray(_ref) {
74
72
  const [editLocked, setEditLocked] = useState(null);
75
73
  const [loading, setLoading] = useState(true);
76
74
  const isStudio = !!studioOptions;
77
- const showDisplayOptions = !isStudio || studioOptions.convertibleToLink;
78
- const showSizeControls = !isStudio || studioOptions.resizable;
75
+ const showDisplayOptions = (!isStudio || studioOptions.convertibleToLink) && !forBlockEditorUse;
76
+ const showSizeControls = (!isStudio || studioOptions.resizable) && !forBlockEditorUse;
79
77
  const dimensionsState = useDimensionsState(videoOptions, {
80
78
  minHeight,
81
79
  minWidth,
@@ -87,7 +85,7 @@ export default function VideoOptionsTray(_ref) {
87
85
  api.getFile(videoOptions.attachmentId, {
88
86
  include: ['blueprint_course_status']
89
87
  }).then(response => {
90
- setEditLocked((response === null || response === void 0 ? void 0 : response.restricted_by_master_course) && (response === null || response === void 0 ? void 0 : response.is_master_course_child_content));
88
+ setEditLocked(response?.restricted_by_master_course && response?.is_master_course_child_content);
91
89
  setLoading(false);
92
90
  }).catch(error => {
93
91
  setLoading(false);
@@ -97,19 +95,15 @@ export default function VideoOptionsTray(_ref) {
97
95
  useEffect(() => {
98
96
  if (subtitles.length === 0) requestSubtitlesFromIframe(setSubtitles);
99
97
  }, []);
100
-
101
98
  function handleTitleTextChange(event) {
102
99
  setTitleText(event.target.value);
103
100
  }
104
-
105
101
  function handleDisplayAsChange(event) {
106
102
  event.target.focus();
107
103
  setDisplayAs(event.target.value);
108
104
  }
109
-
110
105
  function handleVideoSizeChange(event, selectedOption) {
111
106
  setVideoSize(selectedOption.value);
112
-
113
107
  if (selectedOption.value === CUSTOM) {
114
108
  setVideoHeight(currentHeight);
115
109
  setVideoWidth(currentWidth);
@@ -122,21 +116,17 @@ export default function VideoOptionsTray(_ref) {
122
116
  setVideoWidth(width);
123
117
  }
124
118
  }
125
-
126
119
  function handleUpdateSubtitles(new_subtitles) {
127
120
  setSubtitles(new_subtitles);
128
121
  }
129
-
130
122
  function handleSave(event, updateMediaObject) {
131
123
  event.preventDefault();
132
124
  let appliedHeight = videoHeight;
133
125
  let appliedWidth = videoWidth;
134
-
135
126
  if (videoSize === CUSTOM) {
136
127
  appliedHeight = dimensionsState.height;
137
128
  appliedWidth = dimensionsState.width;
138
129
  }
139
-
140
130
  onSave({
141
131
  media_object_id: videoOptions.id,
142
132
  attachment_id: videoOptions.attachmentId,
@@ -149,7 +139,6 @@ export default function VideoOptionsTray(_ref) {
149
139
  editLocked
150
140
  });
151
141
  }
152
-
153
142
  const tooltipText = formatMessage('Used by screen readers to describe the video');
154
143
  const textAreaLabel = /*#__PURE__*/React.createElement(Flex, {
155
144
  alignItems: "center"
@@ -171,7 +160,6 @@ export default function VideoOptionsTray(_ref) {
171
160
  withBorder: false
172
161
  }))));
173
162
  const messagesForSize = [];
174
-
175
163
  if (videoSize !== CUSTOM) {
176
164
  messagesForSize.push({
177
165
  text: formatMessage('{width} x {height}px', {
@@ -181,13 +169,12 @@ export default function VideoOptionsTray(_ref) {
181
169
  type: 'hint'
182
170
  });
183
171
  }
184
-
185
172
  const saveDisabled = displayAs === 'embed' && (titleText === '' || videoSize === CUSTOM && !dimensionsState.isValid);
186
173
  return /*#__PURE__*/React.createElement(StoreProvider, trayProps, contentProps => /*#__PURE__*/React.createElement(Tray, {
187
174
  key: "video-options-tray",
188
175
  "data-mce-component": true,
189
176
  label: isStudio ? formatMessage('Studio Media Options Tray') : formatMessage('Video Options Tray'),
190
- mountNode: instuiPopupMountNode,
177
+ mountNode: instuiPopupMountNodeFn,
191
178
  onDismiss: onRequestClose,
192
179
  onEntered: onEntered,
193
180
  onExited: onExited,
@@ -219,7 +206,7 @@ export default function VideoOptionsTray(_ref) {
219
206
  margin: "xx-large",
220
207
  padding: "xx-large"
221
208
  }, /*#__PURE__*/React.createElement(Spinner, {
222
- renderTitle: formatMessage("Loading")
209
+ renderTitle: formatMessage('Loading')
223
210
  })) : /*#__PURE__*/React.createElement(Flex.Item, {
224
211
  as: "form",
225
212
  shouldGrow: true,
@@ -273,7 +260,7 @@ export default function VideoOptionsTray(_ref) {
273
260
  padding: "small small xx-small small"
274
261
  }, /*#__PURE__*/React.createElement(SimpleSelect, {
275
262
  id: `${id}-size`,
276
- mountNode: instuiPopupMountNode,
263
+ mountNode: instuiPopupMountNodeFn,
277
264
  disabled: displayAs !== 'embed',
278
265
  renderLabel: formatMessage('Size'),
279
266
  messages: messagesForSize,
@@ -305,13 +292,12 @@ export default function VideoOptionsTray(_ref) {
305
292
  file: {
306
293
  name: st.language || st.locale
307
294
  } // this is an artifact of ClosedCaptionCreatorRow's inards
308
-
309
295
  })),
310
296
  uploadMediaTranslations: Bridge.uploadMediaTranslations,
311
297
  userLocale: Bridge.userLocale,
312
298
  updateSubtitles: handleUpdateSubtitles,
313
299
  liveRegion: getLiveRegion,
314
- mountNode: instuiPopupMountNode
300
+ mountNode: instuiPopupMountNodeFn
315
301
  }))))), /*#__PURE__*/React.createElement(Flex.Item, {
316
302
  background: "secondary",
317
303
  borderWidth: "small none none none",