@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,32 +15,33 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import { isAudio, isImage, isVideo } from '../rce/plugins/shared/fileTypeUtils';
19
20
  import { AUDIO_PLAYER_SIZE, VIDEO_SIZE_DEFAULT } from '../rce/plugins/instructure_record/VideoOptionsTray/TrayController';
20
21
  import formatMessage from '../format-message';
21
22
  import { trimmedOrNull } from './string-util';
22
23
  import { assertNever } from './assertNever';
23
24
  import { isTextNode } from './elem-util';
25
+
24
26
  /**
25
27
  * Determines what type of placeholder is appropriate for a given file information.
26
28
  */
27
-
28
29
  export async function placeholderInfoFor(fileMetaProps) {
29
30
  var _fileMetaProps$title, _trimmedOrNull;
30
-
31
31
  const fileName = (_fileMetaProps$title = fileMetaProps.title) !== null && _fileMetaProps$title !== void 0 ? _fileMetaProps$title : fileMetaProps.name;
32
32
  const visibleLabel = (_trimmedOrNull = trimmedOrNull(fileName)) !== null && _trimmedOrNull !== void 0 ? _trimmedOrNull : formatMessage('Loading...');
33
33
  const ariaLabel = formatMessage('Loading placeholder for {fileName}', {
34
34
  fileName: fileName !== null && fileName !== void 0 ? fileName : 'unknown filename'
35
35
  });
36
-
36
+ if (typeof fileMetaProps.contentType !== 'string') {
37
+ throw new Error('Invalid fileMetaProps.contentType');
38
+ }
39
+ const type = fileMetaProps.contentType || fileMetaProps.type;
37
40
  if (isImage(fileMetaProps.contentType) && fileMetaProps.displayAs !== 'link') {
38
41
  var _trimmedOrNull2;
39
-
40
42
  const imageUrl = (_trimmedOrNull2 = trimmedOrNull(fileMetaProps.domObject.preview)) !== null && _trimmedOrNull2 !== void 0 ? _trimmedOrNull2 : URL.createObjectURL(fileMetaProps.domObject);
41
43
  return new Promise((resolve, reject) => {
42
44
  const image = new Image();
43
-
44
45
  image.onload = () => resolve({
45
46
  type: 'block',
46
47
  visibleLabel,
@@ -50,12 +51,10 @@ export async function placeholderInfoFor(fileMetaProps) {
50
51
  vAlign: 'middle',
51
52
  backgroundImageUrl: image.src
52
53
  });
53
-
54
54
  image.onerror = () => reject(new Error('Failed to load image: ' + imageUrl));
55
-
56
55
  image.src = imageUrl;
57
56
  });
58
- } else if (isVideo(fileMetaProps.contentType || fileMetaProps.type)) {
57
+ } else if (typeof type === 'string' && isVideo(type)) {
59
58
  return {
60
59
  type: 'block',
61
60
  visibleLabel,
@@ -64,7 +63,7 @@ export async function placeholderInfoFor(fileMetaProps) {
64
63
  height: VIDEO_SIZE_DEFAULT.height,
65
64
  vAlign: 'bottom'
66
65
  };
67
- } else if (isAudio(fileMetaProps.contentType || fileMetaProps.type)) {
66
+ } else if (typeof type === 'string' && isAudio(type)) {
68
67
  return {
69
68
  type: 'block',
70
69
  visibleLabel,
@@ -82,48 +81,48 @@ export async function placeholderInfoFor(fileMetaProps) {
82
81
  }
83
82
  }
84
83
  export function removePlaceholder(editor, unencodedName) {
85
- const placeholderElem = editor.dom.doc.querySelector(`[data-placeholder-for="${encodeURIComponent(unencodedName)}"]`); // Fail gracefully
84
+ const placeholderElem = editor.dom.doc.querySelector(`[data-placeholder-for="${encodeURIComponent(unencodedName)}"]`);
86
85
 
86
+ // Fail gracefully
87
87
  if (!placeholderElem) return;
88
88
  editor.undoManager.ignore(() => {
89
- editor.dom.remove(placeholderElem); // Cleanup data URIs
89
+ editor.dom.remove(placeholderElem);
90
90
 
91
- placeholderElem.querySelectorAll('img').forEach( // Revoking non-object URLs is safe
91
+ // Cleanup data URIs
92
+ placeholderElem.querySelectorAll('img').forEach(
93
+ // Revoking non-object URLs is safe
92
94
  img => URL.revokeObjectURL(img.src));
93
95
  });
94
96
  }
97
+
95
98
  /**
96
99
  * Inserts a placeholder into a TinyMCE editor. It should be removed by calling removePlaceholder, to ensure
97
100
  * image resources are cleaned up.
98
101
  */
99
-
100
102
  export async function insertPlaceholder(editor, unencodedName, placeholderInfoPromise) {
101
- const placeholderId = `placeholder-${placeholderIdCounter++}`; // Insert a minimal placeholder element into the editor.
103
+ const placeholderId = `placeholder-${placeholderIdCounter++}`;
102
104
 
105
+ // Insert a minimal placeholder element into the editor.
103
106
  editor.undoManager.ignore(() => editor.execCommand('mceInsertContent', false, `<span
104
107
  aria-label="${formatMessage('Loading')}"
105
- data-placeholder-for="${encodeURIComponent(unencodedName)}"
108
+ data-placeholder-for="${encodeURIComponent(unencodedName || '')}"
106
109
  id="${placeholderId}"
107
110
  class="mceNonEditable"
108
111
  style="user-select: none; pointer-events: none; user-focus: none; display: inline-flex;"
109
- ></span>&nbsp;` // Without the trailing &nbsp;, tinymce will place the cursor inside the placeholder, which we don't want.
112
+ ></span>&nbsp;`
113
+ // Without the trailing &nbsp;, tinymce will place the cursor inside the placeholder, which we don't want.
110
114
  ));
111
115
  const placeholderElem = editor.dom.doc.querySelector(`#${placeholderId}`);
112
-
113
116
  if (placeholderElem) {
114
117
  editor.undoManager.ignore(() => {
115
- var _nextNode$data;
116
-
117
118
  // Remove the trailing space
118
119
  const nextNode = placeholderElem.nextSibling;
119
120
  placeholderElem.contentEditable = 'false';
120
-
121
- if (isTextNode(nextNode) && nextNode !== null && nextNode !== void 0 && (_nextNode$data = nextNode.data) !== null && _nextNode$data !== void 0 && _nextNode$data.startsWith('\xA0'
122
- /* nbsp */
123
- )) {
121
+ if (isTextNode(nextNode) && nextNode?.data?.startsWith('\xA0' /* nbsp */)) {
124
122
  // Split out the non-breaking-space which only counts as length 1 for splitText
125
- nextNode.splitText(1); // Remove the now split text node
123
+ nextNode.splitText(1);
126
124
 
125
+ // Remove the now split text node
127
126
  if (placeholderElem.nextSibling) {
128
127
  editor.dom.remove(placeholderElem.nextSibling);
129
128
  }
@@ -132,9 +131,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
132
131
  } else {
133
132
  throw new Error('Failed to find placeholder element after inserting it into the editor.');
134
133
  }
134
+ const placeholderInfo = await placeholderInfoPromise;
135
135
 
136
- const placeholderInfo = await placeholderInfoPromise; // Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
137
-
136
+ // Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
138
137
  editor.undoManager.ignore(() => {
139
138
  // Set up the overall placeholder container
140
139
  placeholderElem.setAttribute('aria-label', placeholderInfo.ariaLabel);
@@ -146,22 +145,21 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
146
145
  alignItems: 'center',
147
146
  borderRadius: '10px',
148
147
  overflow: 'hidden'
149
- }); // Create the spinner
148
+ });
150
149
 
150
+ // Create the spinner
151
151
  placeholderElem.innerHTML = spinnerSvg(placeholderInfo.type === 'inline' ? 'x-small' : 'medium', placeholderId + '-label');
152
152
  const spinnerElem = placeholderElem.firstElementChild;
153
-
154
153
  if (!spinnerElem) {
155
154
  throw new Error("Couldn't find the Spinner element in the placeholder");
156
- } // Create the label
157
-
155
+ }
158
156
 
157
+ // Create the label
159
158
  const labelElem = editor.dom.doc.createElement('div');
160
159
  placeholderElem.appendChild(labelElem);
161
160
  Object.assign(labelElem.style, {
162
161
  color: '#2D3B45',
163
162
  zIndex: '1000',
164
-
165
163
  /* Restrict text to one line */
166
164
  display: 'inline-block',
167
165
  maxWidth: 'calc(100% - 10px)',
@@ -169,8 +167,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
169
167
  whiteSpace: 'nowrap',
170
168
  textOverflow: 'ellipsis'
171
169
  });
172
- labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel)); // Handle type specific stying
170
+ labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
173
171
 
172
+ // Handle type specific stying
174
173
  switch (placeholderInfo.type) {
175
174
  case 'inline':
176
175
  Object.assign(placeholderElem.style, {
@@ -182,7 +181,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
182
181
  backgroundColor: '#F5F5F5'
183
182
  });
184
183
  break;
185
-
186
184
  case 'block':
187
185
  {
188
186
  const {
@@ -203,7 +201,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
203
201
  verticalAlign: vAlign,
204
202
  backgroundColor: '#FFFFFF'
205
203
  });
206
-
207
204
  if (backgroundImageUrl != null) {
208
205
  const imageElem = document.createElement('img');
209
206
  imageElem.src = backgroundImageUrl;
@@ -224,13 +221,13 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
224
221
  }
225
222
  }
226
223
  break;
227
-
228
224
  default:
229
225
  // Ensure all valid placeholderInfo types are handled above.
230
226
  assertNever(placeholderInfo);
231
227
  }
232
- }); // Prevent user interaction with the placeholder elements
228
+ });
233
229
 
230
+ // Prevent user interaction with the placeholder elements
234
231
  placeholderElem.querySelectorAll('*').forEach(elem => {
235
232
  if (elem instanceof HTMLElement) {
236
233
  elem.style.pointerEvents = 'none';
@@ -240,34 +237,35 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
240
237
  });
241
238
  return placeholderElem;
242
239
  }
240
+
243
241
  /**
244
242
  * Something for which a placeholder can be added to the editor.
245
243
  */
246
244
 
245
+ /**
246
+ * Style of placeholder to be inserted into the editor.
247
+ */
248
+
247
249
  let placeholderIdCounter = 0;
250
+
248
251
  /**
249
252
  * A fully standalone version of InstUI <Spinner> that can be used inside TinyMCE's iframe without access to
250
253
  * Canvas's CSS or JS.
251
254
  */
252
255
  // language=html
253
-
254
256
  function spinnerSvg(size, labelId) {
255
257
  const radius = (() => {
256
258
  switch (size) {
257
259
  case 'x-small':
258
260
  return '0.5em';
259
-
260
261
  case 'small':
261
262
  return '1em';
262
-
263
263
  case 'large':
264
264
  return '2.25em';
265
-
266
265
  default:
267
266
  return '1.75em';
268
267
  }
269
268
  })();
270
-
271
269
  return `
272
270
  <span class="Spinner-root Spinner-default Spinner-${size}" role="presentation">
273
271
  <svg class="Spinner-circle"
@@ -22,20 +22,16 @@
22
22
  * @param compute The function to compute values in the cache
23
23
  * @param cache The map to use as a cache
24
24
  */
25
- export function simpleCache(compute) {
26
- let cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();
25
+ export function simpleCache(compute, cache = new Map()) {
27
26
  return {
28
27
  cache,
29
-
30
28
  get(key) {
31
29
  if (cache.has(key)) {
32
30
  return cache.get(key);
33
31
  }
34
-
35
32
  const value = compute(key);
36
33
  cache.set(key, value);
37
34
  return value;
38
35
  }
39
-
40
36
  };
41
37
  }
@@ -26,6 +26,7 @@ export function emptyAsNull(str) {
26
26
  if (str.length === 0) return null;
27
27
  return str;
28
28
  }
29
+
29
30
  /**
30
31
  * Returns null if the string is null, undefined, is empty, or contains only whitespace.
31
32
  *
@@ -39,7 +40,6 @@ export function emptyAsNull(str) {
39
40
  *
40
41
  * @param str
41
42
  */
42
-
43
43
  export function trimmedOrNull(str) {
44
44
  if (str == null) return null;
45
45
  str = str.trim();
@@ -15,8 +15,10 @@
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 * as textFieldEdit from 'text-field-edit';
19
20
  import { assertNever } from './assertNever';
21
+
20
22
  /**
21
23
  * Represents a subset of the editing actions that can be taken on a <textarea> using the text-field-edit library.
22
24
  *
@@ -32,23 +34,20 @@ import { assertNever } from './assertNever';
32
34
  */
33
35
  export function performTextEditActionOnTextarea(textarea, editAction) {
34
36
  var _editAction$before, _editAction$after;
35
-
36
37
  switch (editAction.action) {
37
38
  case 'insert':
38
39
  return textFieldEdit.insert(textarea, editAction.text);
39
-
40
40
  case 'wrapSelection':
41
41
  return textFieldEdit.wrapSelection(textarea, (_editAction$before = editAction.before) !== null && _editAction$before !== void 0 ? _editAction$before : '', (_editAction$after = editAction.after) !== null && _editAction$after !== void 0 ? _editAction$after : '');
42
-
43
42
  default:
44
43
  assertNever(editAction);
45
44
  }
46
45
  }
46
+
47
47
  /**
48
48
  * Executes the given text edit actions on an object representing the important state of textarea editing,
49
49
  * the current text, selection start, and selection end.
50
50
  */
51
-
52
51
  export function performTextEditActionsOnString(args) {
53
52
  let {
54
53
  text: currentText,
@@ -62,11 +61,9 @@ export function performTextEditActionsOnString(args) {
62
61
  selStart += action.text.length;
63
62
  selEnd = selStart;
64
63
  break;
65
-
66
64
  case 'wrapSelection':
67
65
  {
68
66
  var _action$before, _action$after;
69
-
70
67
  const before = (_action$before = action.before) !== null && _action$before !== void 0 ? _action$before : '';
71
68
  const after = (_action$after = action.after) !== null && _action$after !== void 0 ? _action$after : '';
72
69
  currentText = currentText.substring(0, selStart) + before + currentText.substring(selStart, selEnd) + after + currentText.substring(selEnd);
@@ -74,7 +71,6 @@ export function performTextEditActionsOnString(args) {
74
71
  selEnd += before.length;
75
72
  }
76
73
  break;
77
-
78
74
  default:
79
75
  assertNever(action);
80
76
  }
@@ -32,21 +32,16 @@ export function toolbarIconHelperFor(editor, ariaLabel) {
32
32
  // There are a few different potential button selectors
33
33
  const containerSelector = ['.tox-tbtn', '.tox-split-button'].map(buttonSel => `${buttonSel}[aria-label="${CSS.escape(ariaLabel)}"] .tox-icon`).join(',');
34
34
  const $svgContainer = editor.$(containerSelector, document);
35
-
36
35
  if ($svgContainer.length === 0) {
37
36
  console.error(`Failed to find TinyMCE toolbar button for ariaLabel "${ariaLabel}" using selector: ${containerSelector}`);
38
37
  }
39
-
40
38
  return {
41
39
  updateIcon(iconName) {
42
40
  const svg = editor.ui.registry.getAll().icons[iconName];
43
-
44
41
  if (!svg) {
45
42
  console.error(`Invalid icon name given for button labeled "${ariaLabel}": ${iconName}`);
46
43
  }
47
-
48
44
  $svgContainer.html(svg);
49
45
  }
50
-
51
46
  };
52
47
  }
@@ -15,18 +15,18 @@
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 * as URI from 'uri-js';
20
+
19
21
  /**
20
22
  * Attempts to build a URL from the given string, and returns null if it is not a valid URL, rather than
21
23
  * throwing an exception, as the URL constructor does.
22
24
  */
23
-
24
25
  export function parseUrlOrNull(url, base) {
25
26
  if (!url) return null;
26
-
27
27
  try {
28
28
  return new URL(url, base);
29
- } catch (e) {
29
+ } catch (_e) {
30
30
  return null;
31
31
  }
32
32
  }
@@ -38,6 +38,10 @@ export function relativizeUrl(url) {
38
38
  delete parsed.port;
39
39
  return URI.serialize(parsed);
40
40
  }
41
+ export function parseUrlPath(url) {
42
+ return URI.parse(url).path;
43
+ }
44
+
41
45
  /**
42
46
  * Converts the given URL into a relative URL if it meets the following criteria:
43
47
  * - is parsable by the browser URL class
@@ -52,50 +56,46 @@ export function relativizeUrl(url) {
52
56
  * @param inputUrlStr URL to relativize
53
57
  * @param origin Origin to check for
54
58
  */
55
-
56
59
  export function relativeHttpUrlForHostname(inputUrlStr, origin) {
57
60
  if (inputUrlStr == null || inputUrlStr === '') {
58
61
  return inputUrlStr;
59
62
  }
60
-
61
- if (!(inputUrlStr !== null && inputUrlStr !== void 0 && inputUrlStr.match(/^https?:/i)) || !(origin !== null && origin !== void 0 && origin.match(/^https?:/i))) {
63
+ if (!inputUrlStr?.match(/^https?:/i) || !origin?.match(/^https?:/i)) {
62
64
  // Already relative or not a http/https protocol url
63
65
  return inputUrlStr;
64
66
  }
65
-
66
67
  const url = parseUrlOrNull(inputUrlStr);
67
-
68
68
  if (url == null) {
69
69
  return inputUrlStr;
70
- } // Handle the simple case of origins matching. Note that the parsed URL will always have a lowercase origin
71
- // new URL("hTTps://CaNvAs.CoM").origin === 'https://canvas.com'
72
-
70
+ }
73
71
 
72
+ // Handle the simple case of origins matching. Note that the parsed URL will always have a lowercase origin
73
+ // new URL("hTTps://CaNvAs.CoM").origin === 'https://canvas.com'
74
74
  if (url.origin === origin.toLowerCase()) {
75
75
  return relativizeUrl(inputUrlStr);
76
- } // Handle the more complex case of hostname/port matching
77
-
76
+ }
78
77
 
78
+ // Handle the more complex case of hostname/port matching
79
79
  const originUrl = parseUrlOrNull(origin);
80
- const originHostname = originUrl === null || originUrl === void 0 ? void 0 : originUrl.hostname; // Port checks are only needed if the port is not the default port for http or https.
80
+ const originHostname = originUrl?.hostname;
81
+
82
+ // Port checks are only needed if the port is not the default port for http or https.
81
83
  // If the port isn't an http port, then we don't want equivalence, especially for local origins,
82
84
  // since you might be running canvas on "localhost:3000" and some LTI tool on "localhost:4000"
83
85
  // But elsewhere, "http://canvas.com:80" and "http://canvas.com" are equivalent
84
-
85
86
  const urlUsesHttpPort = url.port === '80' || url.port === '443' || url.port === '';
86
- const originUsesHttpPort = originUrl == null || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '80' || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '443' || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '';
87
+ const originUsesHttpPort = originUrl == null || originUrl?.port === '80' || originUrl?.port === '443' || originUrl?.port === '';
87
88
  const portCheckNeeded = !(urlUsesHttpPort && originUsesHttpPort);
88
-
89
- if (portCheckNeeded && (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) !== (url === null || url === void 0 ? void 0 : url.port)) {
89
+ if (portCheckNeeded && originUrl?.port !== url?.port) {
90
90
  return inputUrlStr;
91
91
  }
92
-
93
- if (url.hostname === (originHostname === null || originHostname === void 0 ? void 0 : originHostname.toLowerCase())) {
92
+ if (url.hostname === originHostname?.toLowerCase()) {
94
93
  return relativizeUrl(inputUrlStr);
95
94
  } else {
96
95
  return inputUrlStr;
97
96
  }
98
97
  }
98
+
99
99
  /**
100
100
  * Adds a record of query parameters to a URL. null or undefined values in the record are ignored.
101
101
  *
@@ -105,34 +105,25 @@ export function relativeHttpUrlForHostname(inputUrlStr, origin) {
105
105
  * @param inputUrlStr The URL string to parse
106
106
  * @param queryParams A record containing the query parameters to add
107
107
  */
108
-
109
108
  export function addQueryParamsToUrl(inputUrlStr, queryParams) {
110
109
  var _parsedUrl$query;
111
-
112
110
  if (inputUrlStr == null) {
113
111
  return null;
114
112
  }
115
-
116
113
  const paramEntries = Object.entries(queryParams);
117
-
118
114
  if (paramEntries.length === 0) {
119
115
  return inputUrlStr;
120
116
  }
121
-
122
117
  const parsedUrl = URI.parse(inputUrlStr);
123
-
124
118
  if (parsedUrl == null) {
125
119
  return null;
126
120
  }
127
-
128
121
  const searchParams = new URLSearchParams((_parsedUrl$query = parsedUrl.query) !== null && _parsedUrl$query !== void 0 ? _parsedUrl$query : '');
129
-
130
122
  for (const [paramName, paramValue] of paramEntries) {
131
123
  if (paramValue != null) {
132
124
  searchParams.set(paramName, paramValue);
133
125
  }
134
126
  }
135
-
136
127
  parsedUrl.query = searchParams.toString();
137
128
  return URI.serialize(parsedUrl);
138
129
  }