@instructure/canvas-rce 5.14.1 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +8 -56
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +7 -28
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +104 -59
  25. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  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 +15 -8
  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 +17 -28
  36. package/es/enhance-user-content/enhance_user_content.js +28 -60
  37. package/es/enhance-user-content/external_links.js +5 -8
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +12 -34
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +35 -82
  42. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  43. package/es/format-message.js +3 -4
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.js +3 -1
  47. package/es/rce/AlertMessageArea.js +1 -1
  48. package/es/rce/DraggingBlocker.js +4 -2
  49. package/es/rce/KeyboardShortcutModal.js +1 -0
  50. package/es/rce/RCE.js +12 -11
  51. package/es/rce/RCEGlobals.js +12 -10
  52. package/es/rce/RCEVariants.js +27 -10
  53. package/es/rce/RCEWrapper.js +167 -386
  54. package/es/rce/RCEWrapperProps.js +8 -3
  55. package/es/rce/RceHtmlEditor.js +5 -8
  56. package/es/rce/ResizeHandle.js +3 -8
  57. package/es/rce/RestoreAutoSaveModal.js +1 -2
  58. package/es/rce/ShowOnFocusButton/index.js +0 -6
  59. package/es/rce/StatusBar.js +8 -37
  60. package/es/rce/alertHandler.js +1 -4
  61. package/es/rce/contentInsertion.js +35 -57
  62. package/es/rce/contentInsertionUtils.js +6 -8
  63. package/es/rce/contentRendering.js +7 -12
  64. package/es/rce/customEvents.js +1 -0
  65. package/es/rce/editorLanguage.js +22 -10
  66. package/es/rce/indicatorRegion.js +6 -5
  67. package/es/rce/normalizeLocale.js +5 -3
  68. package/es/rce/normalizeProps.js +3 -1
  69. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  70. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  71. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  73. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  74. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  75. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  76. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  82. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  83. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  84. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  85. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  86. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  92. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  94. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  95. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  96. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  97. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  98. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  99. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  100. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  101. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  102. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  103. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  126. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  127. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  128. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  129. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  130. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  131. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  132. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  134. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  135. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  136. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  137. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  138. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  139. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  140. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  141. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  143. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  144. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  146. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  147. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  148. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  149. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  150. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  152. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  153. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  154. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  155. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  158. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  159. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  163. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  164. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  165. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  166. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  167. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  168. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  169. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  170. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  171. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  172. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  173. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  174. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  175. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  176. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  181. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  183. package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
  184. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  185. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  186. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  187. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  188. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  197. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  199. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  201. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  202. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  204. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  205. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  206. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  207. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  208. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  210. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  211. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  212. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  213. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  214. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  215. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  216. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  217. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  218. package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
  219. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  220. package/es/rce/plugins/shared/ColorInput.js +5 -14
  221. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  222. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  223. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  224. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  225. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  226. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  227. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  228. package/es/rce/plugins/shared/EventUtils.js +1 -3
  229. package/es/rce/plugins/shared/Filter.js +8 -38
  230. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  231. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  232. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  233. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  234. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  235. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  236. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  237. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  238. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  239. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  240. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  241. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  242. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  243. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  244. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  245. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  247. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  249. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  250. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  252. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  253. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  254. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  255. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  256. package/es/rce/plugins/shared/Previewable.js +1 -0
  257. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  258. package/es/rce/plugins/shared/StoreContext.js +1 -2
  259. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  260. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  261. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  262. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  263. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  264. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  265. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  266. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  267. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  268. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  269. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  270. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  271. package/es/rce/plugins/shared/Upload/index.js +1 -0
  272. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  273. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  274. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  276. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  277. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  278. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  279. package/es/rce/plugins/shared/dateUtils.js +1 -1
  280. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  281. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  282. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  283. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  284. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  285. package/es/rce/plugins/shared/fileShape.js +4 -9
  286. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  287. package/es/rce/plugins/shared/fileUtils.js +1 -2
  288. package/es/rce/plugins/shared/linkUtils.js +1 -16
  289. package/es/rce/plugins/shared/round.js +1 -0
  290. package/es/rce/plugins/shared/trayUtils.js +4 -3
  291. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  292. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  293. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  294. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  295. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  296. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  297. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  299. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  300. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  314. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  320. package/es/rce/root.js +9 -8
  321. package/es/rce/sanitizePlugins.js +1 -3
  322. package/es/rce/style.js +1 -4
  323. package/es/rce/tinyRCE.js +13 -9
  324. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  325. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  326. package/es/rce/transformContent.js +8 -10
  327. package/es/rce/types.js +1 -0
  328. package/es/rce/userOS.js +1 -1
  329. package/es/rce/wrapInitCb.js +50 -43
  330. package/es/rcs/api.js +61 -116
  331. package/es/rcs/buildError.js +5 -17
  332. package/es/rcs/fake.js +4 -13
  333. package/es/sidebar/actions/all_files.js +2 -0
  334. package/es/sidebar/actions/data.js +4 -7
  335. package/es/sidebar/actions/documents.js +9 -6
  336. package/es/sidebar/actions/files.js +3 -6
  337. package/es/sidebar/actions/filter.js +1 -0
  338. package/es/sidebar/actions/flickr.js +1 -1
  339. package/es/sidebar/actions/images.js +12 -11
  340. package/es/sidebar/actions/links.js +1 -0
  341. package/es/sidebar/actions/media.js +12 -10
  342. package/es/sidebar/actions/session.js +1 -3
  343. package/es/sidebar/actions/ui.js +1 -0
  344. package/es/sidebar/actions/upload.js +14 -39
  345. package/es/sidebar/containers/Sidebar.js +1 -2
  346. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  347. package/es/sidebar/dragHtml.js +5 -3
  348. package/es/sidebar/reducers/all_files.js +4 -3
  349. package/es/sidebar/reducers/collection.js +12 -13
  350. package/es/sidebar/reducers/collections.js +5 -5
  351. package/es/sidebar/reducers/documents.js +6 -13
  352. package/es/sidebar/reducers/files.js +3 -3
  353. package/es/sidebar/reducers/filter.js +1 -8
  354. package/es/sidebar/reducers/flickr.js +9 -9
  355. package/es/sidebar/reducers/folder.js +15 -15
  356. package/es/sidebar/reducers/folders.js +3 -3
  357. package/es/sidebar/reducers/images.js +3 -13
  358. package/es/sidebar/reducers/index.js +3 -1
  359. package/es/sidebar/reducers/media.js +6 -13
  360. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  361. package/es/sidebar/reducers/noop.js +1 -0
  362. package/es/sidebar/reducers/rootFolderId.js +1 -2
  363. package/es/sidebar/reducers/session.js +3 -3
  364. package/es/sidebar/reducers/ui.js +3 -16
  365. package/es/sidebar/reducers/upload.js +8 -40
  366. package/es/sidebar/store/configureStore.js +1 -0
  367. package/es/sidebar/store/initialState.js +13 -24
  368. package/es/translations/locales/ab.js +1 -0
  369. package/es/translations/locales/ar.js +67 -9
  370. package/es/translations/locales/ca.js +67 -9
  371. package/es/translations/locales/cs.js +1 -0
  372. package/es/translations/locales/cs_CZ.js +1 -0
  373. package/es/translations/locales/cy.js +67 -9
  374. package/es/translations/locales/da-x-k12.js +67 -9
  375. package/es/translations/locales/da.js +67 -9
  376. package/es/translations/locales/da_DK.js +1 -0
  377. package/es/translations/locales/de.js +67 -9
  378. package/es/translations/locales/el.js +4 -0
  379. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  380. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  381. package/es/translations/locales/en.js +72 -8
  382. package/es/translations/locales/en_AU.js +67 -9
  383. package/es/translations/locales/en_CA.js +67 -9
  384. package/es/translations/locales/en_CY.js +67 -9
  385. package/es/translations/locales/en_GB.js +67 -9
  386. package/es/translations/locales/en_NZ.js +1 -0
  387. package/es/translations/locales/en_SE.js +1 -0
  388. package/es/translations/locales/en_US.js +1 -0
  389. package/es/translations/locales/es.js +67 -9
  390. package/es/translations/locales/es_ES.js +67 -9
  391. package/es/translations/locales/es_GT.js +1 -0
  392. package/es/translations/locales/fa_IR.js +7 -0
  393. package/es/translations/locales/fi.js +67 -9
  394. package/es/translations/locales/fr.js +67 -9
  395. package/es/translations/locales/fr_CA.js +68 -10
  396. package/es/translations/locales/ga.js +5 -13
  397. package/es/translations/locales/he.js +7 -0
  398. package/es/translations/locales/hi.js +67 -9
  399. package/es/translations/locales/ht.js +67 -9
  400. package/es/translations/locales/hu.js +7 -6
  401. package/es/translations/locales/hu_HU.js +1 -0
  402. package/es/translations/locales/hy.js +1 -0
  403. package/es/translations/locales/id.js +67 -9
  404. package/es/translations/locales/id_ID.js +1 -0
  405. package/es/translations/locales/is.js +67 -9
  406. package/es/translations/locales/it.js +67 -9
  407. package/es/translations/locales/ja.js +67 -9
  408. package/es/translations/locales/ko.js +1 -0
  409. package/es/translations/locales/ko_KR.js +1 -0
  410. package/es/translations/locales/lt.js +1 -0
  411. package/es/translations/locales/lt_LT.js +1 -0
  412. package/es/translations/locales/mi.js +67 -9
  413. package/es/translations/locales/mn_MN.js +1 -0
  414. package/es/translations/locales/ms.js +67 -9
  415. package/es/translations/locales/nb-x-k12.js +67 -9
  416. package/es/translations/locales/nb.js +67 -9
  417. package/es/translations/locales/nl.js +67 -9
  418. package/es/translations/locales/nl_NL.js +1 -0
  419. package/es/translations/locales/nn.js +7 -6
  420. package/es/translations/locales/pl.js +67 -9
  421. package/es/translations/locales/pt.js +67 -9
  422. package/es/translations/locales/pt_BR.js +67 -9
  423. package/es/translations/locales/ro.js +1 -0
  424. package/es/translations/locales/ru.js +67 -9
  425. package/es/translations/locales/se.js +1 -0
  426. package/es/translations/locales/sl.js +67 -9
  427. package/es/translations/locales/sv-x-k12.js +67 -9
  428. package/es/translations/locales/sv.js +67 -9
  429. package/es/translations/locales/sv_SE.js +1 -0
  430. package/es/translations/locales/tg.js +1 -0
  431. package/es/translations/locales/th.js +67 -9
  432. package/es/translations/locales/th_TH.js +1 -0
  433. package/es/translations/locales/tl_PH.js +1 -0
  434. package/es/translations/locales/tr.js +7 -0
  435. package/es/translations/locales/uk_UA.js +7 -0
  436. package/es/translations/locales/vi.js +67 -9
  437. package/es/translations/locales/vi_VN.js +1 -0
  438. package/es/translations/locales/zh-Hans.js +67 -9
  439. package/es/translations/locales/zh-Hant.js +67 -9
  440. package/es/translations/locales/zh.js +67 -9
  441. package/es/translations/locales/zh_HK.js +67 -9
  442. package/es/translations/locales/zh_TW.Big5.js +1 -0
  443. package/es/translations/locales/zh_TW.js +1 -0
  444. package/es/translations/tinymce/ar_SA.js +1 -0
  445. package/es/translations/tinymce/fi.js +1 -0
  446. package/es/translations/tinymce/ga.js +1 -0
  447. package/es/translations/tinymce/id.js +1 -0
  448. package/es/translations/tinymce/ru.js +1 -0
  449. package/es/translations/tinymce/ru_RU.js +1 -0
  450. package/es/translations/tinymce/sl.js +1 -0
  451. package/es/translations/tinymce/sr.js +1 -0
  452. package/es/translations/tinymce/th.js +1 -0
  453. package/es/translations/tinymce/uk_UA.js +1 -0
  454. package/es/translations/tinymce/vi_VN.js +1 -0
  455. package/es/util/TypedDict.js +4 -2
  456. package/es/util/encrypted-storage.js +3 -13
  457. package/es/util/file-url-util.js +1 -6
  458. package/es/util/fullscreenHelpers.js +4 -1
  459. package/es/util/instui-icon-helper.js +4 -3
  460. package/es/util/loadingPlaceholder.js +38 -39
  461. package/es/util/simpleCache.js +0 -3
  462. package/es/util/string-util.js +1 -1
  463. package/es/util/textarea-editing-util.js +3 -7
  464. package/es/util/tinymce-plugin-util.js +0 -5
  465. package/es/util/url-util.js +16 -25
  466. package/eslint.config.js +239 -0
  467. package/jest.config.js +1 -1
  468. package/package.json +76 -81
  469. package/scripts/build-canvas +2 -1
  470. package/scripts/build.js +4 -4
  471. package/testcafe/RCEWrapper.test.js +0 -1
  472. package/testcafe/StatusBar.test.js +0 -1
  473. package/testcafe/axe.test.js +3 -4
  474. package/testcafe/enhanceUserContent.test.js +0 -1
  475. package/tsconfig.json +20 -15
  476. package/.eslintrc +0 -45
  477. package/.prettierignore +0 -6
  478. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  479. package/es/rce/__mocks__/styleMock.js +0 -18
  480. package/es/rce/__mocks__/tinymceReact.js +0 -55
  481. 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,49 @@ 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
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
118
  var _nextNode$data;
116
-
117
119
  // Remove the trailing space
118
120
  const nextNode = placeholderElem.nextSibling;
119
121
  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
- )) {
122
+ if (isTextNode(nextNode) && nextNode !== null && nextNode !== void 0 && (_nextNode$data = nextNode.data) !== null && _nextNode$data !== void 0 && _nextNode$data.startsWith('\xA0' /* nbsp */)) {
124
123
  // Split out the non-breaking-space which only counts as length 1 for splitText
125
- nextNode.splitText(1); // Remove the now split text node
124
+ nextNode.splitText(1);
126
125
 
126
+ // Remove the now split text node
127
127
  if (placeholderElem.nextSibling) {
128
128
  editor.dom.remove(placeholderElem.nextSibling);
129
129
  }
@@ -132,9 +132,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
132
132
  } else {
133
133
  throw new Error('Failed to find placeholder element after inserting it into the editor.');
134
134
  }
135
+ const placeholderInfo = await placeholderInfoPromise;
135
136
 
136
- const placeholderInfo = await placeholderInfoPromise; // Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
137
-
137
+ // Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
138
138
  editor.undoManager.ignore(() => {
139
139
  // Set up the overall placeholder container
140
140
  placeholderElem.setAttribute('aria-label', placeholderInfo.ariaLabel);
@@ -146,22 +146,21 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
146
146
  alignItems: 'center',
147
147
  borderRadius: '10px',
148
148
  overflow: 'hidden'
149
- }); // Create the spinner
149
+ });
150
150
 
151
+ // Create the spinner
151
152
  placeholderElem.innerHTML = spinnerSvg(placeholderInfo.type === 'inline' ? 'x-small' : 'medium', placeholderId + '-label');
152
153
  const spinnerElem = placeholderElem.firstElementChild;
153
-
154
154
  if (!spinnerElem) {
155
155
  throw new Error("Couldn't find the Spinner element in the placeholder");
156
- } // Create the label
157
-
156
+ }
158
157
 
158
+ // Create the label
159
159
  const labelElem = editor.dom.doc.createElement('div');
160
160
  placeholderElem.appendChild(labelElem);
161
161
  Object.assign(labelElem.style, {
162
162
  color: '#2D3B45',
163
163
  zIndex: '1000',
164
-
165
164
  /* Restrict text to one line */
166
165
  display: 'inline-block',
167
166
  maxWidth: 'calc(100% - 10px)',
@@ -169,8 +168,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
169
168
  whiteSpace: 'nowrap',
170
169
  textOverflow: 'ellipsis'
171
170
  });
172
- labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel)); // Handle type specific stying
171
+ labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
173
172
 
173
+ // Handle type specific stying
174
174
  switch (placeholderInfo.type) {
175
175
  case 'inline':
176
176
  Object.assign(placeholderElem.style, {
@@ -182,7 +182,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
182
182
  backgroundColor: '#F5F5F5'
183
183
  });
184
184
  break;
185
-
186
185
  case 'block':
187
186
  {
188
187
  const {
@@ -203,7 +202,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
203
202
  verticalAlign: vAlign,
204
203
  backgroundColor: '#FFFFFF'
205
204
  });
206
-
207
205
  if (backgroundImageUrl != null) {
208
206
  const imageElem = document.createElement('img');
209
207
  imageElem.src = backgroundImageUrl;
@@ -224,13 +222,13 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
224
222
  }
225
223
  }
226
224
  break;
227
-
228
225
  default:
229
226
  // Ensure all valid placeholderInfo types are handled above.
230
227
  assertNever(placeholderInfo);
231
228
  }
232
- }); // Prevent user interaction with the placeholder elements
229
+ });
233
230
 
231
+ // Prevent user interaction with the placeholder elements
234
232
  placeholderElem.querySelectorAll('*').forEach(elem => {
235
233
  if (elem instanceof HTMLElement) {
236
234
  elem.style.pointerEvents = 'none';
@@ -240,34 +238,35 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
240
238
  });
241
239
  return placeholderElem;
242
240
  }
241
+
243
242
  /**
244
243
  * Something for which a placeholder can be added to the editor.
245
244
  */
246
245
 
246
+ /**
247
+ * Style of placeholder to be inserted into the editor.
248
+ */
249
+
247
250
  let placeholderIdCounter = 0;
251
+
248
252
  /**
249
253
  * A fully standalone version of InstUI <Spinner> that can be used inside TinyMCE's iframe without access to
250
254
  * Canvas's CSS or JS.
251
255
  */
252
256
  // language=html
253
-
254
257
  function spinnerSvg(size, labelId) {
255
258
  const radius = (() => {
256
259
  switch (size) {
257
260
  case 'x-small':
258
261
  return '0.5em';
259
-
260
262
  case 'small':
261
263
  return '1em';
262
-
263
264
  case 'large':
264
265
  return '2.25em';
265
-
266
266
  default:
267
267
  return '1.75em';
268
268
  }
269
269
  })();
270
-
271
270
  return `
272
271
  <span class="Spinner-root Spinner-default Spinner-${size}" role="presentation">
273
272
  <svg class="Spinner-circle"
@@ -26,16 +26,13 @@ export function simpleCache(compute) {
26
26
  let cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();
27
27
  return {
28
28
  cache,
29
-
30
29
  get(key) {
31
30
  if (cache.has(key)) {
32
31
  return cache.get(key);
33
32
  }
34
-
35
33
  const value = compute(key);
36
34
  cache.set(key, value);
37
35
  return value;
38
36
  }
39
-
40
37
  };
41
38
  }
@@ -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
63
  if (!(inputUrlStr !== null && inputUrlStr !== void 0 && inputUrlStr.match(/^https?:/i)) || !(origin !== null && origin !== void 0 && 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 === null || originUrl === void 0 ? void 0 : 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
87
  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
88
  const portCheckNeeded = !(urlUsesHttpPort && originUsesHttpPort);
88
-
89
89
  if (portCheckNeeded && (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) !== (url === null || url === void 0 ? void 0 : url.port)) {
90
90
  return inputUrlStr;
91
91
  }
92
-
93
92
  if (url.hostname === (originHostname === null || originHostname === void 0 ? void 0 : 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
  }