@instructure/canvas-rce 5.14.0 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/__tests__/sidebar/reducers/all_files.test.js +28 -0
  17. package/babel.config.js +3 -1
  18. package/build.sh +7 -7
  19. package/es/bridge/Bridge.js +8 -56
  20. package/es/bridge/index.js +1 -0
  21. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  22. package/es/canvasFileBrowser/en-US.js +3 -6
  23. package/es/common/FlashAlert.js +7 -28
  24. package/es/common/browser.js +4 -2
  25. package/es/common/fileUrl.js +104 -59
  26. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  27. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  28. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  29. package/es/common/incremental-loading/index.js +1 -0
  30. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  31. package/es/common/indicate.js +15 -8
  32. package/es/common/mimeClass.js +3 -4
  33. package/es/common/natcompare.js +1 -4
  34. package/es/defaultTinymceConfig.js +5 -3
  35. package/es/elementDenylist.js +1 -0
  36. package/es/enhance-user-content/doc_previews.js +17 -28
  37. package/es/enhance-user-content/enhance_user_content.js +28 -60
  38. package/es/enhance-user-content/external_links.js +5 -8
  39. package/es/enhance-user-content/index.js +1 -0
  40. package/es/enhance-user-content/instructure_helper.js +25 -38
  41. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  42. package/es/enhance-user-content/mathml.js +35 -82
  43. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  44. package/es/format-message.js +3 -4
  45. package/es/getThemeVars.js +8 -6
  46. package/es/getTranslations.js +1 -78
  47. package/es/index.js +3 -1
  48. package/es/rce/AlertMessageArea.js +1 -1
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +1 -0
  51. package/es/rce/RCE.js +12 -11
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +27 -10
  54. package/es/rce/RCEWrapper.js +167 -386
  55. package/es/rce/RCEWrapperProps.js +8 -3
  56. package/es/rce/RceHtmlEditor.js +5 -8
  57. package/es/rce/ResizeHandle.js +3 -8
  58. package/es/rce/RestoreAutoSaveModal.js +1 -2
  59. package/es/rce/ShowOnFocusButton/index.js +0 -6
  60. package/es/rce/StatusBar.js +8 -37
  61. package/es/rce/alertHandler.js +1 -4
  62. package/es/rce/contentInsertion.js +35 -57
  63. package/es/rce/contentInsertionUtils.js +6 -8
  64. package/es/rce/contentRendering.js +7 -12
  65. package/es/rce/customEvents.js +1 -0
  66. package/es/rce/editorLanguage.js +22 -10
  67. package/es/rce/indicatorRegion.js +6 -5
  68. package/es/rce/normalizeLocale.js +5 -3
  69. package/es/rce/normalizeProps.js +3 -1
  70. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  71. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  74. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  75. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  76. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  77. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  83. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  84. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  85. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  86. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  95. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  96. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  97. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  98. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  99. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  100. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  101. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  102. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  103. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  127. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  128. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  129. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  130. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  131. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  132. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  134. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  135. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  136. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  137. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  138. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  139. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  140. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  141. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  144. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  147. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  148. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  149. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  150. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  153. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  154. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  155. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  156. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  159. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  164. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  165. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  166. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  167. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  168. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  169. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  170. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  171. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  172. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  173. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  174. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  175. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  176. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  184. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  185. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  186. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  187. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  188. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  198. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  199. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  201. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  202. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  204. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  205. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  206. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  207. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  208. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  210. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  211. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  212. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  213. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  214. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  215. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  216. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  217. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  218. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  219. package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
  220. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  221. package/es/rce/plugins/shared/ColorInput.js +5 -14
  222. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  223. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  224. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  225. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  226. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  227. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  228. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  229. package/es/rce/plugins/shared/EventUtils.js +1 -3
  230. package/es/rce/plugins/shared/Filter.js +8 -38
  231. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  232. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  233. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  234. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  235. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  236. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  237. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  239. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  240. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  241. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  242. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  244. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  245. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  247. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  248. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  250. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  251. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  252. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  253. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  254. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  255. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  256. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  257. package/es/rce/plugins/shared/Previewable.js +1 -0
  258. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  259. package/es/rce/plugins/shared/StoreContext.js +1 -2
  260. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  261. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  262. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  263. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  264. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  265. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  266. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  267. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  268. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  269. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  270. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  271. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  272. package/es/rce/plugins/shared/Upload/index.js +1 -0
  273. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  274. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  275. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  276. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  277. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  278. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  279. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  280. package/es/rce/plugins/shared/dateUtils.js +1 -1
  281. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  282. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  283. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  284. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  285. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  286. package/es/rce/plugins/shared/fileShape.js +4 -9
  287. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  288. package/es/rce/plugins/shared/fileUtils.js +1 -2
  289. package/es/rce/plugins/shared/linkUtils.js +1 -16
  290. package/es/rce/plugins/shared/round.js +1 -0
  291. package/es/rce/plugins/shared/trayUtils.js +4 -3
  292. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  293. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  294. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  295. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  296. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  297. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  299. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  300. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  321. package/es/rce/root.js +9 -8
  322. package/es/rce/sanitizePlugins.js +1 -3
  323. package/es/rce/style.js +1 -4
  324. package/es/rce/tinyRCE.js +13 -9
  325. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  326. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  327. package/es/rce/transformContent.js +8 -10
  328. package/es/rce/types.js +1 -0
  329. package/es/rce/userOS.js +1 -1
  330. package/es/rce/wrapInitCb.js +50 -43
  331. package/es/rcs/api.js +61 -116
  332. package/es/rcs/buildError.js +5 -17
  333. package/es/rcs/fake.js +4 -13
  334. package/es/sidebar/actions/all_files.js +2 -0
  335. package/es/sidebar/actions/data.js +4 -7
  336. package/es/sidebar/actions/documents.js +9 -6
  337. package/es/sidebar/actions/files.js +3 -6
  338. package/es/sidebar/actions/filter.js +1 -0
  339. package/es/sidebar/actions/flickr.js +1 -1
  340. package/es/sidebar/actions/images.js +12 -11
  341. package/es/sidebar/actions/links.js +1 -0
  342. package/es/sidebar/actions/media.js +12 -10
  343. package/es/sidebar/actions/session.js +1 -3
  344. package/es/sidebar/actions/ui.js +1 -0
  345. package/es/sidebar/actions/upload.js +14 -39
  346. package/es/sidebar/containers/Sidebar.js +1 -2
  347. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  348. package/es/sidebar/dragHtml.js +5 -3
  349. package/es/sidebar/reducers/all_files.js +4 -3
  350. package/es/sidebar/reducers/collection.js +12 -13
  351. package/es/sidebar/reducers/collections.js +5 -5
  352. package/es/sidebar/reducers/documents.js +6 -13
  353. package/es/sidebar/reducers/files.js +3 -3
  354. package/es/sidebar/reducers/filter.js +1 -8
  355. package/es/sidebar/reducers/flickr.js +9 -9
  356. package/es/sidebar/reducers/folder.js +15 -15
  357. package/es/sidebar/reducers/folders.js +3 -3
  358. package/es/sidebar/reducers/images.js +3 -13
  359. package/es/sidebar/reducers/index.js +3 -1
  360. package/es/sidebar/reducers/media.js +6 -13
  361. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  362. package/es/sidebar/reducers/noop.js +1 -0
  363. package/es/sidebar/reducers/rootFolderId.js +1 -2
  364. package/es/sidebar/reducers/session.js +3 -3
  365. package/es/sidebar/reducers/ui.js +3 -16
  366. package/es/sidebar/reducers/upload.js +8 -40
  367. package/es/sidebar/store/configureStore.js +1 -0
  368. package/es/sidebar/store/initialState.js +13 -24
  369. package/es/translations/locales/ab.js +1 -0
  370. package/es/translations/locales/ar.js +67 -9
  371. package/es/translations/locales/ca.js +67 -9
  372. package/es/translations/locales/cs.js +1 -0
  373. package/es/translations/locales/cs_CZ.js +1 -0
  374. package/es/translations/locales/cy.js +67 -9
  375. package/es/translations/locales/da-x-k12.js +67 -9
  376. package/es/translations/locales/da.js +67 -9
  377. package/es/translations/locales/da_DK.js +1 -0
  378. package/es/translations/locales/de.js +67 -9
  379. package/es/translations/locales/el.js +4 -0
  380. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  381. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  382. package/es/translations/locales/en.js +72 -8
  383. package/es/translations/locales/en_AU.js +67 -9
  384. package/es/translations/locales/en_CA.js +67 -9
  385. package/es/translations/locales/en_CY.js +67 -9
  386. package/es/translations/locales/en_GB.js +67 -9
  387. package/es/translations/locales/en_NZ.js +1 -0
  388. package/es/translations/locales/en_SE.js +1 -0
  389. package/es/translations/locales/en_US.js +1 -0
  390. package/es/translations/locales/es.js +67 -9
  391. package/es/translations/locales/es_ES.js +67 -9
  392. package/es/translations/locales/es_GT.js +1 -0
  393. package/es/translations/locales/fa_IR.js +7 -0
  394. package/es/translations/locales/fi.js +67 -9
  395. package/es/translations/locales/fr.js +67 -9
  396. package/es/translations/locales/fr_CA.js +68 -10
  397. package/es/translations/locales/ga.js +5 -13
  398. package/es/translations/locales/he.js +7 -0
  399. package/es/translations/locales/hi.js +67 -9
  400. package/es/translations/locales/ht.js +67 -9
  401. package/es/translations/locales/hu.js +7 -6
  402. package/es/translations/locales/hu_HU.js +1 -0
  403. package/es/translations/locales/hy.js +1 -0
  404. package/es/translations/locales/id.js +67 -9
  405. package/es/translations/locales/id_ID.js +1 -0
  406. package/es/translations/locales/is.js +67 -9
  407. package/es/translations/locales/it.js +67 -9
  408. package/es/translations/locales/ja.js +67 -9
  409. package/es/translations/locales/ko.js +1 -0
  410. package/es/translations/locales/ko_KR.js +1 -0
  411. package/es/translations/locales/lt.js +1 -0
  412. package/es/translations/locales/lt_LT.js +1 -0
  413. package/es/translations/locales/mi.js +67 -9
  414. package/es/translations/locales/mn_MN.js +1 -0
  415. package/es/translations/locales/ms.js +67 -9
  416. package/es/translations/locales/nb-x-k12.js +67 -9
  417. package/es/translations/locales/nb.js +67 -9
  418. package/es/translations/locales/nl.js +67 -9
  419. package/es/translations/locales/nl_NL.js +1 -0
  420. package/es/translations/locales/nn.js +7 -6
  421. package/es/translations/locales/pl.js +67 -9
  422. package/es/translations/locales/pt.js +67 -9
  423. package/es/translations/locales/pt_BR.js +67 -9
  424. package/es/translations/locales/ro.js +1 -0
  425. package/es/translations/locales/ru.js +67 -9
  426. package/es/translations/locales/se.js +1 -0
  427. package/es/translations/locales/sl.js +67 -9
  428. package/es/translations/locales/sv-x-k12.js +67 -9
  429. package/es/translations/locales/sv.js +67 -9
  430. package/es/translations/locales/sv_SE.js +1 -0
  431. package/es/translations/locales/tg.js +1 -0
  432. package/es/translations/locales/th.js +67 -9
  433. package/es/translations/locales/th_TH.js +1 -0
  434. package/es/translations/locales/tl_PH.js +1 -0
  435. package/es/translations/locales/tr.js +7 -0
  436. package/es/translations/locales/uk_UA.js +7 -0
  437. package/es/translations/locales/vi.js +67 -9
  438. package/es/translations/locales/vi_VN.js +1 -0
  439. package/es/translations/locales/zh-Hans.js +67 -9
  440. package/es/translations/locales/zh-Hant.js +67 -9
  441. package/es/translations/locales/zh.js +67 -9
  442. package/es/translations/locales/zh_HK.js +67 -9
  443. package/es/translations/locales/zh_TW.Big5.js +1 -0
  444. package/es/translations/locales/zh_TW.js +1 -0
  445. package/es/translations/tinymce/ar_SA.js +1 -0
  446. package/es/translations/tinymce/fi.js +1 -0
  447. package/es/translations/tinymce/ga.js +1 -0
  448. package/es/translations/tinymce/id.js +1 -0
  449. package/es/translations/tinymce/ru.js +1 -0
  450. package/es/translations/tinymce/ru_RU.js +1 -0
  451. package/es/translations/tinymce/sl.js +1 -0
  452. package/es/translations/tinymce/sr.js +1 -0
  453. package/es/translations/tinymce/th.js +1 -0
  454. package/es/translations/tinymce/uk_UA.js +1 -0
  455. package/es/translations/tinymce/vi_VN.js +1 -0
  456. package/es/util/TypedDict.js +4 -2
  457. package/es/util/encrypted-storage.js +3 -13
  458. package/es/util/file-url-util.js +1 -6
  459. package/es/util/fullscreenHelpers.js +4 -1
  460. package/es/util/instui-icon-helper.js +4 -3
  461. package/es/util/loadingPlaceholder.js +38 -39
  462. package/es/util/simpleCache.js +0 -3
  463. package/es/util/string-util.js +1 -1
  464. package/es/util/textarea-editing-util.js +3 -7
  465. package/es/util/tinymce-plugin-util.js +0 -5
  466. package/es/util/url-util.js +16 -25
  467. package/eslint.config.js +239 -0
  468. package/jest.config.js +1 -1
  469. package/package.json +77 -82
  470. package/scripts/build-canvas +2 -1
  471. package/scripts/build.js +4 -4
  472. package/scripts/publish_to_npm.sh +1 -1
  473. package/testcafe/RCEWrapper.test.js +0 -1
  474. package/testcafe/StatusBar.test.js +0 -1
  475. package/testcafe/axe.test.js +3 -4
  476. package/testcafe/enhanceUserContent.test.js +0 -1
  477. package/tsconfig.json +20 -15
  478. package/.eslintrc +0 -45
  479. package/.prettierignore +0 -6
  480. package/es/common/components/FileTree/File.js +0 -64
  481. package/es/common/components/FileTree/Folder.js +0 -110
  482. package/es/common/components/FileTree/index.js +0 -84
  483. package/es/common/components/FileTree/styles.js +0 -72
  484. package/es/common/components/Loading.js +0 -83
@@ -15,17 +15,21 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import ReactDOM from 'react-dom';
20
21
  import formatMessage from '../format-message';
21
22
  import { Spinner } from '@instructure/ui-spinner';
22
23
  import { getData, setData } from './jqueryish_funcs';
23
- export const previewableMimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.writer', 'application/excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/rtf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.sun.xml.impress', 'application/vnd.sun.xml.calc', 'application/vnd.ms-excel', 'application/msword', 'application/mspowerpoint', 'application/rtf', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'text/plain', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/postscript', 'application/pdf', 'application/vnd.ms-powerpoint']; // check to see if a file of a certan mimeType is previewable inline in the browser
24
- // ex: isPreviewable("application/mspowerpoint") -> true
24
+ export const previewableMimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.writer', 'application/excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/rtf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.sun.xml.impress', 'application/vnd.sun.xml.calc', 'application/vnd.ms-excel', 'application/msword', 'application/mspowerpoint', 'application/rtf', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'text/plain', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/postscript', 'application/pdf', 'application/vnd.ms-powerpoint'];
25
25
 
26
+ // check to see if a file of a certan mimeType is previewable inline in the browser
27
+ // ex: isPreviewable("application/mspowerpoint") -> true
26
28
  export function isPreviewable(mimeType) {
27
29
  return previewableMimeTypes.includes(mimeType);
28
- } // Show a loading spinner
30
+ }
31
+
32
+ // Show a loading spinner
29
33
  // The typical use is to show the spinner next to a canvas file link
30
34
  // while the inline preview is loading. It's also used when previewing
31
35
  // student submitted files in speedgrader, in which case $link is really
@@ -35,7 +39,6 @@ export function isPreviewable(mimeType) {
35
39
  //
36
40
  // $link: the DOM node that serves as the reference for locating the spinner
37
41
  // position: one of 'adjacent' or 'centered'
38
-
39
42
  export function showLoadingImage($link) {
40
43
  let position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'adjacent';
41
44
  const dir = $link && window.getComputedStyle($link).direction || 'ltr';
@@ -50,7 +53,6 @@ export function showLoadingImage($link) {
50
53
  const list = getData($link, 'loading_images') || [];
51
54
  list.push($imageHolder);
52
55
  setData($link, 'loading_images', list);
53
-
54
56
  if (!$link.style.position || $link.style.position === 'static') {
55
57
  const top = `${boundingBox.top + window.scrollY + (position === 'adjacent' ? 0 : boundingBox.height / 2)}px`;
56
58
  const left = `${offsetLeft}px`;
@@ -62,8 +64,7 @@ export function showLoadingImage($link) {
62
64
  $imageHolder.setAttribute('style', `z-index:${zIndex}; position: absolute; top: ${top}; left: ${left}; margin-inline-start:${imageMarginInlineStart}; margin-top: ${imageMarginTop}`);
63
65
  $link.appendChild($imageHolder);
64
66
  }
65
-
66
- ReactDOM.render( /*#__PURE__*/React.createElement(Spinner, {
67
+ ReactDOM.render(/*#__PURE__*/React.createElement(Spinner, {
67
68
  size: "x-small",
68
69
  renderTitle: formatMessage('Loading')
69
70
  }), $imageHolder);
@@ -71,7 +72,6 @@ export function showLoadingImage($link) {
71
72
  }
72
73
  export function removeLoadingImage($link) {
73
74
  var _$link$querySelector;
74
-
75
75
  (_$link$querySelector = $link.querySelector('.loading_image')) === null || _$link$querySelector === void 0 ? void 0 : _$link$querySelector.remove();
76
76
  const list = getData($link, 'loading_images') || [];
77
77
  list.forEach(item => {
@@ -95,7 +95,6 @@ export function loadDocPreview($container, options) {
95
95
  if (!($container instanceof HTMLElement)) {
96
96
  throw new Error('loadDocPreview requires a DOM element as first argument');
97
97
  }
98
-
99
98
  function tellAppIViewedThisInline() {
100
99
  // if I have a url to ping back to the app that I viewed this file inline, ping it.
101
100
  if (opts.attachment_view_inline_ping_url) {
@@ -104,7 +103,6 @@ export function loadDocPreview($container, options) {
104
103
  });
105
104
  }
106
105
  }
107
-
108
106
  if (opts.crocodoc_session_url) {
109
107
  const sanitizedUrl = sanitizeUrl(opts.crocodoc_session_url);
110
108
  const iframe = document.createElement('iframe');
@@ -143,12 +141,10 @@ export function loadDocPreview($container, options) {
143
141
  embedded: true,
144
142
  url: opts.public_url
145
143
  }).toString()}`;
146
-
147
144
  if (!opts.ajax_valid || opts.ajax_valid()) {
148
145
  const iframe = document.createElement('iframe');
149
146
  iframe.addEventListener('load', () => {
150
147
  tellAppIViewedThisInline('google');
151
-
152
148
  if (typeof opts.ready === 'function') {
153
149
  opts.ready();
154
150
  }
@@ -159,37 +155,33 @@ export function loadDocPreview($container, options) {
159
155
  $container.appendChild(iframe);
160
156
  }
161
157
  };
162
-
163
158
  if (opts.public_url) {
164
159
  loadGooglePreview();
165
160
  } else if (opts.attachment_id) {
166
161
  let url = `/api/v1/files/${opts.attachment_id}/public_url.json`;
167
-
168
162
  if (opts.submission_id) {
169
163
  url += '?' + new URLSearchParams({
170
164
  submission_id: opts.submission_id
171
165
  }).toString();
172
166
  }
173
-
174
167
  if (opts.verifier) {
175
168
  url += `${opts.submission_id ? '&' : '?'}verifier=${opts.verifier}`;
176
169
  } else {
177
170
  const match = window.location.search.match(/verifier=([^&]+)(?:&|$)/);
178
171
  const ver = match && match[1];
179
-
180
172
  if (ver) {
181
173
  url += `${opts.submission_id ? '&' : '?'}verifier=${ver}`;
182
174
  }
183
175
  }
184
-
185
- showLoadingImage($container, 'centered'); // eslint-disable-next-line promise/catch-or-return
186
-
176
+ showLoadingImage($container, 'centered');
177
+ // eslint-disable-next-line promise/catch-or-return
187
178
  fetch(url).then(response => {
188
179
  if (!response.ok) throw new Error(`${response.status}: ${response.statusText}`);
189
180
  return response;
190
181
  }).then(response => response.json()).then(data => {
191
182
  if (data.public_url) {
192
- opts = { ...opts,
183
+ opts = {
184
+ ...opts,
193
185
  ...data
194
186
  };
195
187
  loadGooglePreview();
@@ -204,31 +196,28 @@ export function loadDocPreview($container, options) {
204
196
  } else {
205
197
  // else fall back with a message that the document can't be viewed inline
206
198
  const paragraph = document.createElement('p');
207
-
208
199
  if (opts.attachment_preview_processing) {
209
200
  paragraph.textContent = formatMessage('The document preview is currently being processed. Please try again later.');
210
201
  } else {
211
202
  paragraph.textContent = formatMessage('This document cannot be displayed within Canvas.');
212
203
  }
213
-
214
- $container.empty().append(paragraph);
204
+ $container.replaceChildren();
205
+ $container.appendChild(paragraph);
215
206
  }
216
207
  }
208
+
217
209
  /**
218
210
  * Replaces bad urls with harmless urls in cases where bad urls might cause harm
219
211
  * @param {string} url
220
212
  */
221
-
222
213
  export function sanitizeUrl(url) {
223
214
  const defaultUrl = 'about:blank';
224
-
225
215
  try {
226
- const parsedUrl = new URL(url, window.location.origin); // eslint-disable-next-line no-script-url
227
-
216
+ const parsedUrl = new URL(url, window.location.origin);
217
+ // eslint-disable-next-line no-script-url
228
218
  if (parsedUrl.protocol === 'javascript:') {
229
219
  return defaultUrl;
230
220
  }
231
-
232
221
  return url;
233
222
  } catch (e) {
234
223
  // URL() throws TypeError if url is not a valid URL
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import { IconDownloadLine } from '@instructure/ui-icons/es/svg';
19
20
  import formatMessage from '../format-message';
20
21
  import { closest, getData, hide, insertAfter, setData, show } from './jqueryish_funcs';
@@ -23,10 +24,10 @@ import mediaCommentThumbnail from './media_comment_thumbnail';
23
24
  import { addParentFrameContextToUrl } from '../rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl';
24
25
  import { MathJaxDirective, Mathml } from './mathml';
25
26
  import { makeExternalLinkIcon } from './external_links';
26
- import getTranslations from '../getTranslations'; // in jest the es directory doesn't exist so stub the undefined svg
27
+ import getTranslations from '../getTranslations';
27
28
 
29
+ // in jest the es directory doesn't exist so stub the undefined svg
28
30
  const IconDownloadSVG = (IconDownloadLine === null || IconDownloadLine === void 0 ? void 0 : IconDownloadLine.src) || '<svg></svg>';
29
-
30
31
  function makeDownloadButton(download_url, filename) {
31
32
  const a = document.createElement('a');
32
33
  a.setAttribute('class', 'file_download_btn');
@@ -47,11 +48,9 @@ function makeDownloadButton(download_url, filename) {
47
48
  a.appendChild(srspan);
48
49
  return a;
49
50
  }
50
-
51
51
  function handleYoutubeLink($link) {
52
52
  const href = $link.getAttribute('href');
53
53
  const id = youTubeID(href || '');
54
-
55
54
  if (id && !$link.classList.contains('inline_disabled')) {
56
55
  const $after = document.createElement('a');
57
56
  $after.setAttribute('href', href);
@@ -97,32 +96,25 @@ function handleYoutubeLink($link) {
97
96
  insertAfter($after, $link);
98
97
  }
99
98
  }
100
-
101
99
  let preview_counter = 0;
102
-
103
100
  function previewId() {
104
101
  return `preview_${++preview_counter}`;
105
102
  }
106
-
107
103
  function buildUrl(url) {
108
104
  try {
109
105
  return new URL(url);
110
- } catch (e) {// Don't raise an error
106
+ } catch (e) {
107
+ // Don't raise an error
111
108
  }
112
109
  }
113
-
114
110
  const addResourceIdentifiersToStudioContent = content => {
115
111
  content.querySelectorAll('iframe.lti-embed').forEach(iframe => {
116
112
  var _userContentContainer, _userContentContainer2;
117
-
118
113
  const url = buildUrl(iframe.getAttribute('src'));
119
-
120
114
  if (!url || !url.pathname.includes('external_tools/retrieve') || !url.search.includes('instructuremedia.com') || !url.search.includes('custom_arc_media_id')) {
121
115
  return;
122
116
  }
123
-
124
117
  const userContentContainer = iframe.closest('.user_content');
125
-
126
118
  if (userContentContainer !== null && userContentContainer !== void 0 && (_userContentContainer = userContentContainer.dataset) !== null && _userContentContainer !== void 0 && _userContentContainer.resourceType && userContentContainer !== null && userContentContainer !== void 0 && (_userContentContainer2 = userContentContainer.dataset) !== null && _userContentContainer2 !== void 0 && _userContentContainer2.resourceId) {
127
119
  url.searchParams.set('com_instructure_course_canvas_resource_type', userContentContainer.dataset.resourceType);
128
120
  url.searchParams.set('com_instructure_course_canvas_resource_id', userContentContainer.dataset.resourceId);
@@ -130,7 +122,6 @@ const addResourceIdentifiersToStudioContent = content => {
130
122
  }
131
123
  });
132
124
  };
133
-
134
125
  export function enhanceUserContent() {
135
126
  let container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
136
127
  let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -140,19 +131,16 @@ export function enhanceUserContent() {
140
131
  kalturaSettings,
141
132
  disableGooglePreviews,
142
133
  canvasLinksTarget,
143
-
144
134
  /**
145
135
  * For MathML configuration
146
136
  */
147
137
  new_math_equation_handling,
148
138
  explicit_latex_typesetting,
149
139
  locale,
150
-
151
140
  /**
152
141
  * When used inside of an LTI tool, this contains the canvas global id of the tool.
153
142
  */
154
143
  containingCanvasLtiToolId,
155
-
156
144
  /**
157
145
  * Contingency plan in case new instfs media links cause problems in rich content.
158
146
  */
@@ -166,12 +154,10 @@ export function enhanceUserContent() {
166
154
  console.error('Failed loading the language file for', locale, '. Falling back to English.');
167
155
  });
168
156
  const content = container instanceof HTMLElement && container || document.getElementById('content') || document;
169
-
170
157
  const showFilePreviewEx = event => showFilePreview(event, {
171
158
  canvasOrigin,
172
159
  disableGooglePreviews
173
160
  });
174
-
175
161
  content.querySelectorAll('.user_content:not(.enhanced)').forEach(elem => {
176
162
  elem.classList.add('unenhanced');
177
163
  explicit_latex_typesetting && elem.classList.add(MathJaxDirective.Process);
@@ -186,43 +172,40 @@ export function enhanceUserContent() {
186
172
  explicit_latex_typesetting && mathml.processNewMathInElem(unenhanced_elem);
187
173
  unenhanced_elem.querySelectorAll('img').forEach(img => {
188
174
  const src = img.getAttribute('src');
189
-
190
175
  if (!/^\/[^/]/.test(src)) {
191
176
  return;
192
- } // if the image file is unpublished it's replaced with the lock image
177
+ }
178
+
179
+ // if the image file is unpublished it's replaced with the lock image
193
180
  // and canvas adds hidden=1 to the URL.
194
181
  // we also need to strip the alt text
195
-
196
-
197
182
  if (/hidden=1$/.test(src)) {
198
183
  img.setAttribute('alt', formatMessage('This image is currently unavailable'));
199
184
  }
200
185
  });
201
- setData(unenhanced_elem, 'unenhanced_content_html', unenhanced_elem.innerHTML); // If instfs links are causing content problems,
202
- // use this to show users old links instead
186
+ setData(unenhanced_elem, 'unenhanced_content_html', unenhanced_elem.innerHTML);
203
187
 
188
+ // If instfs links are causing content problems,
189
+ // use this to show users old links instead
204
190
  if (replaceInstFSLinksWithOldLinks) {
205
191
  const attributes = ['href', 'src'];
206
192
  const selector = '[href], [src]';
207
193
  const oldLinkAttribute = 'data-old-link';
208
194
  unenhanced_elem.querySelectorAll(selector).forEach(element => {
209
195
  const oldLink = element.getAttribute(oldLinkAttribute);
210
-
211
196
  if (!oldLink) {
212
197
  return;
213
198
  }
214
-
215
199
  for (const a of attributes) {
216
200
  const newLink = element.getAttribute(a);
217
-
218
201
  if (newLink && newLink != oldLink) {
219
202
  element.setAttribute(a, oldLink);
220
203
  }
221
204
  }
222
205
  });
223
- } // guarantee relative links point to canvas
224
-
206
+ }
225
207
 
208
+ // guarantee relative links point to canvas
226
209
  if (canvasOrigin) {
227
210
  const attributes = ['href', 'src'];
228
211
  const selector = '[href], [src]';
@@ -230,38 +213,34 @@ export function enhanceUserContent() {
230
213
  try {
231
214
  for (const a of attributes) {
232
215
  const potentialUrl = element.getAttribute(a);
233
-
234
216
  if (!/^\/[^/]/.test(potentialUrl)) {
235
217
  continue;
236
218
  }
237
-
238
219
  const absoluteUrl = new URL(potentialUrl, canvasOrigin);
239
220
  element.setAttribute(a, absoluteUrl.href);
240
-
241
221
  if (canvasLinksTarget && element.tagName === 'A' && (!element.getAttribute('target') || element.getAttribute('target') === '_blank')) {
242
222
  element.setAttribute('target', canvasLinksTarget);
243
223
  }
244
224
  }
245
- } catch (_ignore) {// canvasOrigin probably isn't a valid base url
225
+ } catch (_ignore) {
226
+ // canvasOrigin probably isn't a valid base url
246
227
  }
247
228
  });
248
- } // add parent_frame_context to canvas iframes to allow them loading inside another LTI tool
249
-
229
+ }
250
230
 
231
+ // add parent_frame_context to canvas iframes to allow them loading inside another LTI tool
251
232
  if (containingCanvasLtiToolId != null) {
252
233
  unenhanced_elem.querySelectorAll('iframe[src]').forEach(iframeElem => {
253
234
  const src = iframeElem.getAttribute('src');
254
-
255
235
  if (src.startsWith(canvasOrigin)) {
256
236
  iframeElem.setAttribute('src', addParentFrameContextToUrl(src, containingCanvasLtiToolId));
257
237
  }
258
238
  });
259
- } // tell LTI tools that they are launching from within the active RCE
260
-
239
+ }
261
240
 
241
+ // tell LTI tools that they are launching from within the active RCE
262
242
  unenhanced_elem.querySelectorAll('iframe[src]').forEach(iframeElem => {
263
243
  const src = iframeElem.getAttribute('src');
264
-
265
244
  if (src.startsWith(canvasOrigin)) {
266
245
  iframeElem.setAttribute('src', src.replace('display=in_rce', 'display=borderless'));
267
246
  }
@@ -275,9 +254,7 @@ export function enhanceUserContent() {
275
254
  const $linkSpan = document.createElement('span');
276
255
  const $linkText = childLink.innerHTML;
277
256
  $linkSpan.innerHTML = $linkText;
278
-
279
257
  while (childLink.firstChild) childLink.removeChild(childLink.firstChild);
280
-
281
258
  childLink.appendChild($linkSpan);
282
259
  const externalLinkIcon = makeExternalLinkIcon(childLink);
283
260
  childLink.appendChild(externalLinkIcon);
@@ -285,21 +262,20 @@ export function enhanceUserContent() {
285
262
  addResourceIdentifiersToStudioContent(unenhanced_elem);
286
263
  });
287
264
  content.querySelectorAll('a.instructure_file_link, a.instructure_scribd_file').forEach(file_link => {
288
- const href = buildUrl(file_link.href); // Don't attempt to enhance links with no href
265
+ const href = buildUrl(file_link.href);
289
266
 
267
+ // Don't attempt to enhance links with no href
290
268
  if (!href) return;
291
269
  const matchesCanvasFile = href.pathname.match(/(?:\/(courses|groups|users)\/\d+)?\/files\/([\d~]+)(?=[!*'();:@&=+$,/?#\[\]]|$)/);
292
-
293
270
  if (!matchesCanvasFile) {
294
271
  // a bug in the new RCE added instructure_file_link class name to all links
295
272
  // only proceed if this is a canvas file link
296
273
  return;
297
274
  }
298
-
299
275
  if (file_link.textContent.trim()) {
300
276
  file_link.addEventListener('click', showFilePreviewEx);
301
- const filename = file_link.textContent; // instructure_file_link_holder is used to find file_preview_link
302
-
277
+ const filename = file_link.textContent;
278
+ // instructure_file_link_holder is used to find file_preview_link
303
279
  const $span = document.createElement('span');
304
280
  $span.setAttribute('class', 'instructure_file_holder link_holder instructure_file_link_holder');
305
281
  const qs = href.searchParams;
@@ -307,7 +283,6 @@ export function enhanceUserContent() {
307
283
  qs.append('download_frd', '1');
308
284
  const download_url = `${href.origin}${href.pathname.replace(/(?:\/(download|preview))?$/, '/download')}?${qs}`;
309
285
  const $download_btn = makeDownloadButton(download_url, filename);
310
-
311
286
  if (file_link.classList.contains('instructure_scribd_file')) {
312
287
  if (file_link.classList.contains('no_preview')) {
313
288
  // link downloads
@@ -321,22 +296,21 @@ export function enhanceUserContent() {
321
296
  file_link.classList.add('file_preview_link');
322
297
  }
323
298
  }
324
-
325
299
  file_link.classList.remove('instructure_file_link');
326
300
  file_link.classList.remove('instructure_scribd_file');
327
301
  file_link.parentElement.replaceChild($span, file_link);
328
302
  $span.appendChild(file_link);
329
303
  if ($download_btn) $span.appendChild($download_btn);
330
304
  }
331
- }); // Some schools have been using 'file_preview_link' for inline previews
305
+ });
306
+
307
+ // Some schools have been using 'file_preview_link' for inline previews
332
308
  // outside of the RCE so find them all after we've gone through and
333
309
  // added our own (above)
334
-
335
310
  content.querySelectorAll('.instructure_file_link_holder a.file_preview_link, .instructure_file_link_holder a.scribd_file_preview_link').forEach($link => {
336
311
  if ($link.classList.contains('previewable')) {
337
312
  return;
338
313
  }
339
-
340
314
  const preview_id = previewId();
341
315
  $link.setAttribute('aria-expanded', 'false');
342
316
  $link.setAttribute('aria-controls', preview_id);
@@ -348,7 +322,6 @@ export function enhanceUserContent() {
348
322
  $preview_container.id = preview_id;
349
323
  $preview_container.setAttribute('style', 'display: none;');
350
324
  $link.parentElement.appendChild($preview_container);
351
-
352
325
  if ($link.classList.contains('auto_open')) {
353
326
  $link.click();
354
327
  }
@@ -359,25 +332,20 @@ export function enhanceUserContent() {
359
332
  const a = closest($thumbnail, 'a', content);
360
333
  a === null || a === void 0 ? void 0 : a.classList.add('instructure_inline_media_comment');
361
334
  });
362
-
363
335
  if ($anchor.matches('.instructure_inline_media_comment')) {
364
336
  $anchor.classList.remove('no-underline');
365
337
  mediaCommentThumbnail($anchor, 'normal', false, kalturaSettings);
366
338
  }
367
-
368
339
  if ($anchor.matches('.instructure_video_link, .instructure_audio_link')) {
369
340
  mediaCommentThumbnail($anchor, 'normal', true, kalturaSettings);
370
341
  }
371
-
372
342
  if (!$anchor.matches('.youtubed')) {
373
343
  handleYoutubeLink($anchor);
374
344
  }
375
345
  });
376
-
377
346
  if (customEnhanceFunc) {
378
347
  customEnhanceFunc();
379
348
  }
380
-
381
349
  content.querySelectorAll('.user_content.unenhanced').forEach($elem => {
382
350
  $elem.classList.remove('unenhanced');
383
351
  $elem.classList.add('enhanced');
@@ -387,9 +355,9 @@ export function enhanceUserContent() {
387
355
  $elem.submit();
388
356
  $elem.classList.add('submitted');
389
357
  });
390
- }, 10); // Remove sandbox attribute from user content iframes to fix busted
358
+ }, 10);
359
+ // Remove sandbox attribute from user content iframes to fix busted
391
360
  // third-party content, like Google Drive documents.
392
-
393
361
  document.querySelectorAll('.user_content iframe[sandbox="allow-scripts allow-forms allow-same-origin"]').forEach(frame => {
394
362
  frame.removeAttribute('sandbox');
395
363
  const src = frame.src;
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import { IconExternalLinkLine } from '@instructure/ui-icons/es/svg';
19
20
  import { getTld } from './instructure_helper';
20
21
  import formatMessage from '../format-message';
@@ -42,19 +43,17 @@ export function makeAllExternalLinksExternalLinks() {
42
43
  if (!content) return;
43
44
  const tld = getTld(window.location.hostname);
44
45
  const links = content.querySelectorAll(`a[href*="//"]:not([href*="${tld}"])`); // technique for finding "external" links copied from https://davidwalsh.name/external-links-css
45
-
46
46
  for (let i = 0; i < links.length; i++) {
47
- const $link = links[i]; // don't mess with the ones that were already processed in enhanceUserContent
48
-
47
+ const $link = links[i];
48
+ // don't mess with the ones that were already processed in enhanceUserContent
49
49
  if ($link.classList.contains('external')) continue;
50
50
  if ($link.matches('.open_in_a_new_tab')) continue;
51
51
  if ($link.querySelectorAll('img').length > 0) continue;
52
52
  if ($link.matches('.not_external')) continue;
53
- if ($link.matches('.exclude_external_icon')) continue; // we have some pre-instui buttons that are styled links
54
-
53
+ if ($link.matches('.exclude_external_icon')) continue;
54
+ // we have some pre-instui buttons that are styled links
55
55
  if ($link.classList.contains('btn')) continue;
56
56
  const $linkToReplace = $link;
57
-
58
57
  if ($linkToReplace) {
59
58
  const $linkIndicator = makeExternalLinkIcon();
60
59
  $linkToReplace.classList.add('external');
@@ -64,9 +63,7 @@ export function makeAllExternalLinksExternalLinks() {
64
63
  const $linkSpan = document.createElement('span');
65
64
  const $linkText = $linkToReplace.innerHTML;
66
65
  $linkSpan.innerHTML = $linkText;
67
-
68
66
  while ($linkToReplace.firstChild) $linkToReplace.removeChild($linkToReplace.firstChild);
69
-
70
67
  $linkToReplace.appendChild($linkSpan);
71
68
  $linkToReplace.appendChild($linkIndicator);
72
69
  }
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import mediaCommentThumbnail from './media_comment_thumbnail';
19
20
  export * from './enhance_user_content';
20
21
  export { isPreviewable, loadDocPreview } from './doc_previews';