@instructure/canvas-rce 5.14.1 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/DEVELOPMENT.md +2 -2
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +18 -73
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +21 -77
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +15 -39
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +105 -64
  25. package/es/common/incremental-loading/LoadMoreButton.js +4 -4
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +5 -13
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +16 -10
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +24 -35
  36. package/es/enhance-user-content/enhance_user_content.js +32 -67
  37. package/es/enhance-user-content/external_links.js +6 -9
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +22 -50
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +48 -107
  42. package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
  43. package/es/format-message.js +4 -5
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.d.ts +59 -0
  47. package/es/index.js +6 -6
  48. package/es/rce/AlertMessageArea.js +15 -16
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +3 -2
  51. package/es/rce/RCE.js +16 -17
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +29 -14
  54. package/es/rce/RCEWrapper.js +530 -641
  55. package/es/rce/RCEWrapper.utils.js +131 -0
  56. package/es/rce/RCEWrapperProps.js +9 -5
  57. package/es/rce/RceHtmlEditor.js +17 -19
  58. package/es/rce/ResizeHandle.js +4 -10
  59. package/es/rce/RestoreAutoSaveModal.js +1 -2
  60. package/es/rce/ShowOnFocusButton/index.js +2 -8
  61. package/es/rce/StatusBar.js +10 -44
  62. package/es/rce/alertHandler.js +1 -4
  63. package/es/rce/contentInsertion.js +36 -59
  64. package/es/rce/contentInsertionUtils.js +6 -8
  65. package/es/rce/contentRendering.js +13 -17
  66. package/es/rce/customEvents.js +1 -0
  67. package/es/rce/editorLanguage.js +23 -11
  68. package/es/rce/indicatorRegion.js +7 -7
  69. package/es/rce/normalizeLocale.js +5 -3
  70. package/es/rce/normalizeProps.js +7 -5
  71. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  72. package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
  74. package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
  75. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  76. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  78. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
  83. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
  84. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  85. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  86. package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
  87. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
  93. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
  95. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
  96. package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
  97. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  98. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  99. package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
  100. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  101. package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
  102. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  103. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  104. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
  127. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  128. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
  129. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  130. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  131. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  132. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  133. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
  134. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  135. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  136. package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
  137. package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
  138. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  139. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
  140. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
  141. package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
  142. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
  144. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  145. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
  147. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  148. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  149. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
  150. package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
  151. package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
  153. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
  154. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  155. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_image/plugin.js +14 -20
  157. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
  159. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  160. package/es/rce/plugins/instructure_links/components/Link.js +68 -84
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  164. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
  165. package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
  166. package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
  167. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  168. package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
  169. package/es/rce/plugins/instructure_links/plugin.js +23 -49
  170. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  171. package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
  172. package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
  173. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  174. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  175. package/es/rce/plugins/instructure_paste/plugin.js +29 -33
  176. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
  177. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
  182. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  184. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  185. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  186. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
  187. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  188. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
  189. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
  199. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
  200. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  201. package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
  202. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
  203. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
  204. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  205. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
  206. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
  207. package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
  208. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  209. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  210. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
  211. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
  212. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
  213. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  214. package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
  215. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  216. package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
  217. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
  218. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  219. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
  220. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
  221. package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
  222. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  223. package/es/rce/plugins/shared/ColorInput.js +27 -39
  224. package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
  225. package/es/rce/plugins/shared/ContentSelection.js +29 -78
  226. package/es/rce/plugins/shared/DimensionUtils.js +3 -12
  227. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  228. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  229. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  230. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  231. package/es/rce/plugins/shared/EventUtils.js +2 -4
  232. package/es/rce/plugins/shared/Filter.js +8 -38
  233. package/es/rce/plugins/shared/FixedContentTray.js +16 -17
  234. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
  235. package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
  236. package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
  237. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
  239. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
  240. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
  241. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
  242. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
  244. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
  245. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  246. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
  247. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  250. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  252. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
  253. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
  254. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
  255. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  256. package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
  257. package/es/rce/plugins/shared/LinkDisplay.js +9 -11
  258. package/es/rce/plugins/shared/PreviewIcon.js +9 -15
  259. package/es/rce/plugins/shared/Previewable.js +1 -0
  260. package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
  261. package/es/rce/plugins/shared/StoreContext.js +9 -12
  262. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
  263. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  264. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
  265. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
  266. package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
  267. package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
  268. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  269. package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
  270. package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
  271. package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
  272. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
  273. package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
  274. package/es/rce/plugins/shared/Upload/index.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
  276. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
  277. package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
  278. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  279. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  280. package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
  281. package/es/rce/plugins/shared/compressionUtils.js +18 -28
  282. package/es/rce/plugins/shared/dateUtils.js +1 -1
  283. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  284. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
  285. package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
  286. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  287. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  288. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  289. package/es/rce/plugins/shared/fileShape.js +4 -9
  290. package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
  291. package/es/rce/plugins/shared/fileUtils.js +1 -2
  292. package/es/rce/plugins/shared/linkUtils.js +1 -16
  293. package/es/rce/plugins/shared/round.js +2 -2
  294. package/es/rce/plugins/shared/trayUtils.js +7 -3
  295. package/es/rce/plugins/shared/useDataUrl.js +13 -14
  296. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  297. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
  298. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
  299. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  300. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  301. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  302. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
  303. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
  315. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  316. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  317. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
  321. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
  322. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
  323. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  324. package/es/rce/root.js +17 -16
  325. package/es/rce/sanitizePlugins.js +1 -3
  326. package/es/rce/style.js +1 -4
  327. package/es/rce/tinyRCE.js +14 -9
  328. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  329. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  330. package/es/rce/transformContent.js +9 -11
  331. package/es/rce/types.js +1 -0
  332. package/es/rce/userOS.js +1 -1
  333. package/es/rce/wrapInitCb.js +50 -43
  334. package/es/rcs/api.js +100 -171
  335. package/es/rcs/buildError.js +8 -20
  336. package/es/rcs/fake.js +9 -20
  337. package/es/sidebar/actions/all_files.js +2 -0
  338. package/es/sidebar/actions/data.js +4 -7
  339. package/es/sidebar/actions/documents.js +19 -18
  340. package/es/sidebar/actions/files.js +21 -28
  341. package/es/sidebar/actions/filter.js +5 -5
  342. package/es/sidebar/actions/flickr.js +1 -1
  343. package/es/sidebar/actions/images.js +32 -37
  344. package/es/sidebar/actions/links.js +1 -0
  345. package/es/sidebar/actions/media.js +27 -28
  346. package/es/sidebar/actions/session.js +2 -5
  347. package/es/sidebar/actions/ui.js +1 -0
  348. package/es/sidebar/actions/upload.js +38 -74
  349. package/es/sidebar/containers/Sidebar.js +1 -2
  350. package/es/sidebar/containers/sidebarHandlers.js +9 -13
  351. package/es/sidebar/dragHtml.js +11 -5
  352. package/es/sidebar/reducers/all_files.js +5 -6
  353. package/es/sidebar/reducers/collection.js +12 -15
  354. package/es/sidebar/reducers/collections.js +6 -8
  355. package/es/sidebar/reducers/documents.js +7 -16
  356. package/es/sidebar/reducers/files.js +4 -6
  357. package/es/sidebar/reducers/filter.js +8 -23
  358. package/es/sidebar/reducers/flickr.js +10 -12
  359. package/es/sidebar/reducers/folder.js +16 -18
  360. package/es/sidebar/reducers/folders.js +4 -6
  361. package/es/sidebar/reducers/images.js +4 -16
  362. package/es/sidebar/reducers/index.js +3 -1
  363. package/es/sidebar/reducers/media.js +7 -16
  364. package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
  365. package/es/sidebar/reducers/noop.js +2 -2
  366. package/es/sidebar/reducers/rootFolderId.js +2 -5
  367. package/es/sidebar/reducers/session.js +4 -6
  368. package/es/sidebar/reducers/ui.js +6 -25
  369. package/es/sidebar/reducers/upload.js +16 -64
  370. package/es/sidebar/store/configureStore.js +1 -0
  371. package/es/sidebar/store/initialState.js +14 -26
  372. package/es/translations/locales/ab.js +1 -0
  373. package/es/translations/locales/ar.js +72 -8
  374. package/es/translations/locales/ca.js +72 -8
  375. package/es/translations/locales/cs.js +1 -0
  376. package/es/translations/locales/cs_CZ.js +1 -0
  377. package/es/translations/locales/cy.js +72 -8
  378. package/es/translations/locales/da-x-k12.js +72 -8
  379. package/es/translations/locales/da.js +72 -8
  380. package/es/translations/locales/da_DK.js +1 -0
  381. package/es/translations/locales/de.js +72 -8
  382. package/es/translations/locales/el.js +4 -0
  383. package/es/translations/locales/en-AU-x-unimelb.js +72 -8
  384. package/es/translations/locales/en-GB-x-ukhe.js +72 -8
  385. package/es/translations/locales/en.js +72 -8
  386. package/es/translations/locales/en_AU.js +72 -8
  387. package/es/translations/locales/en_CA.js +72 -8
  388. package/es/translations/locales/en_CY.js +72 -8
  389. package/es/translations/locales/en_GB.js +72 -8
  390. package/es/translations/locales/en_NZ.js +1 -0
  391. package/es/translations/locales/en_SE.js +1 -0
  392. package/es/translations/locales/en_US.js +1 -0
  393. package/es/translations/locales/es.js +72 -8
  394. package/es/translations/locales/es_ES.js +72 -8
  395. package/es/translations/locales/es_GT.js +1 -0
  396. package/es/translations/locales/fa_IR.js +7 -0
  397. package/es/translations/locales/fi.js +72 -8
  398. package/es/translations/locales/fr.js +72 -8
  399. package/es/translations/locales/fr_CA.js +73 -9
  400. package/es/translations/locales/ga.js +5 -13
  401. package/es/translations/locales/he.js +7 -0
  402. package/es/translations/locales/hi.js +72 -8
  403. package/es/translations/locales/ht.js +72 -8
  404. package/es/translations/locales/hu.js +7 -6
  405. package/es/translations/locales/hu_HU.js +1 -0
  406. package/es/translations/locales/hy.js +1 -0
  407. package/es/translations/locales/id.js +72 -8
  408. package/es/translations/locales/id_ID.js +1 -0
  409. package/es/translations/locales/is.js +72 -8
  410. package/es/translations/locales/it.js +72 -8
  411. package/es/translations/locales/ja.js +72 -8
  412. package/es/translations/locales/ko.js +1 -0
  413. package/es/translations/locales/ko_KR.js +1 -0
  414. package/es/translations/locales/lt.js +1 -0
  415. package/es/translations/locales/lt_LT.js +1 -0
  416. package/es/translations/locales/mi.js +72 -8
  417. package/es/translations/locales/mn_MN.js +1 -0
  418. package/es/translations/locales/ms.js +72 -8
  419. package/es/translations/locales/nb-x-k12.js +72 -8
  420. package/es/translations/locales/nb.js +72 -8
  421. package/es/translations/locales/nl.js +72 -8
  422. package/es/translations/locales/nl_NL.js +1 -0
  423. package/es/translations/locales/nn.js +7 -6
  424. package/es/translations/locales/pl.js +72 -8
  425. package/es/translations/locales/pt.js +72 -8
  426. package/es/translations/locales/pt_BR.js +72 -8
  427. package/es/translations/locales/ro.js +1 -0
  428. package/es/translations/locales/ru.js +72 -8
  429. package/es/translations/locales/se.js +1 -0
  430. package/es/translations/locales/sl.js +72 -8
  431. package/es/translations/locales/sv-x-k12.js +72 -8
  432. package/es/translations/locales/sv.js +72 -8
  433. package/es/translations/locales/sv_SE.js +1 -0
  434. package/es/translations/locales/tg.js +1 -0
  435. package/es/translations/locales/th.js +72 -8
  436. package/es/translations/locales/th_TH.js +1 -0
  437. package/es/translations/locales/tl_PH.js +1 -0
  438. package/es/translations/locales/tr.js +7 -0
  439. package/es/translations/locales/uk_UA.js +7 -0
  440. package/es/translations/locales/vi.js +72 -8
  441. package/es/translations/locales/vi_VN.js +1 -0
  442. package/es/translations/locales/zh-Hans.js +72 -8
  443. package/es/translations/locales/zh-Hant.js +72 -8
  444. package/es/translations/locales/zh.js +72 -8
  445. package/es/translations/locales/zh_HK.js +72 -8
  446. package/es/translations/locales/zh_TW.Big5.js +1 -0
  447. package/es/translations/locales/zh_TW.js +1 -0
  448. package/es/translations/tinymce/ar_SA.js +1 -0
  449. package/es/translations/tinymce/fi.js +1 -0
  450. package/es/translations/tinymce/ga.js +1 -0
  451. package/es/translations/tinymce/id.js +1 -0
  452. package/es/translations/tinymce/ru.js +1 -0
  453. package/es/translations/tinymce/ru_RU.js +1 -0
  454. package/es/translations/tinymce/sl.js +1 -0
  455. package/es/translations/tinymce/sr.js +1 -0
  456. package/es/translations/tinymce/th.js +1 -0
  457. package/es/translations/tinymce/uk_UA.js +1 -0
  458. package/es/translations/tinymce/vi_VN.js +1 -0
  459. package/es/util/TypedDict.js +4 -2
  460. package/es/util/elem-util.js +1 -1
  461. package/es/util/encrypted-storage.js +3 -13
  462. package/es/util/file-url-util.js +2 -7
  463. package/es/util/fullscreenHelpers.js +9 -9
  464. package/es/util/instui-icon-helper.js +4 -3
  465. package/es/util/loadingPlaceholder.js +39 -41
  466. package/es/util/simpleCache.js +1 -5
  467. package/es/util/string-util.js +1 -1
  468. package/es/util/textarea-editing-util.js +3 -7
  469. package/es/util/tinymce-plugin-util.js +0 -5
  470. package/es/util/url-util.js +20 -29
  471. package/eslint.config.js +250 -0
  472. package/jest.config.js +1 -1
  473. package/locales/en.json +190 -10
  474. package/package.json +78 -82
  475. package/scripts/build-canvas +2 -1
  476. package/scripts/build.js +4 -4
  477. package/scripts/installTranslations.js +7 -8
  478. package/testcafe/RCEWrapper.test.js +0 -1
  479. package/testcafe/StatusBar.test.js +0 -1
  480. package/testcafe/axe.test.js +3 -4
  481. package/testcafe/enhanceUserContent.test.js +0 -1
  482. package/tsconfig.json +21 -16
  483. package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
  484. package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
  485. package/.eslintrc +0 -45
  486. package/.prettierignore +0 -6
  487. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  488. package/es/rce/__mocks__/tinymceReact.js +0 -55
  489. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -15,6 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import formatMessage from '../format-message';
19
20
  import { showFlashAlert } from '../common/FlashAlert';
20
21
  import { isPreviewable, loadDocPreview, removeLoadingImage, showLoadingImage } from './doc_previews';
@@ -23,57 +24,47 @@ import { parseUrlOrNull } from '../util/url-util';
23
24
  const youTubeRegEx = /^https?:\/\/(www\.youtube\.com\/watch.*v(=|\/)|youtu\.be\/)([^&#]*)/;
24
25
  export function youTubeID(path) {
25
26
  const match = path.match(youTubeRegEx);
26
-
27
27
  if (match && match[match.length - 1]) {
28
28
  return match[match.length - 1];
29
29
  }
30
-
31
30
  return null;
32
31
  }
33
32
  export function getTld(hostname) {
34
33
  hostname = (hostname || '').split(':')[0];
35
34
  const parts = hostname.split('.'),
36
- length = parts.length;
35
+ length = parts.length;
37
36
  return (length > 1 ? [parts[length - 2], parts[length - 1]] : parts).join('.');
38
37
  }
39
- export function isExternalLink(element) {
40
- let canvasOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.location.origin;
38
+ export function isExternalLink(element, canvasOrigin = window.location.origin) {
41
39
  let canvasHost;
42
-
43
40
  try {
44
41
  canvasHost = new URL(canvasOrigin).hostname;
45
42
  } catch (_ex) {
46
43
  canvasHost = window.location.hostname;
47
44
  }
48
-
49
- const href = element.getAttribute('href'); // if a browser doesnt support <a>.hostname then just dont mark anything as external, better to not get false positives.
50
-
45
+ const href = element.getAttribute('href');
46
+ // if a browser doesnt support <a>.hostname then just dont mark anything as external, better to not get false positives.
51
47
  return !!(href && href.length && !href.match(/^(mailto\:|javascript\:)/) && element.hostname && getTld(element.hostname) !== getTld(canvasHost));
52
48
  }
53
- export function showFilePreview(event) {
54
- var _event$target, _event$currentTarget;
55
-
56
- let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
49
+ export function showFilePreview(event, opts = {}) {
57
50
  event.stopPropagation();
58
51
  const {
59
52
  canvasOrigin,
60
53
  disableGooglePreviews
61
- } = { ...opts
54
+ } = {
55
+ ...opts
62
56
  };
63
57
  let target = null;
64
-
65
- if ((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.href) {
58
+ if (event.target?.href) {
66
59
  target = event.target;
67
- } else if ((_event$currentTarget = event.currentTarget) !== null && _event$currentTarget !== void 0 && _event$currentTarget.href) {
60
+ } else if (event.currentTarget?.href) {
68
61
  target = event.currentTarget;
69
62
  } else {
70
63
  return;
71
64
  }
72
-
73
65
  if (target.classList.contains('no_preview')) {
74
66
  return;
75
67
  }
76
-
77
68
  if (target.classList.contains('inline_disabled') || target.classList.contains('preview_in_overlay')) {
78
69
  showFilePreviewInOverlay(event, canvasOrigin);
79
70
  } else {
@@ -81,45 +72,37 @@ export function showFilePreview(event) {
81
72
  }
82
73
  }
83
74
  export function showFilePreviewInOverlay(event, canvasOrigin) {
84
- var _event$target2, _event$currentTarget2, _target;
85
-
86
75
  let target = null;
87
-
88
- if ((_event$target2 = event.target) !== null && _event$target2 !== void 0 && _event$target2.href) {
76
+ if (event.target?.href) {
89
77
  target = event.target;
90
- } else if ((_event$currentTarget2 = event.currentTarget) !== null && _event$currentTarget2 !== void 0 && _event$currentTarget2.href) {
78
+ } else if (event.currentTarget?.href) {
91
79
  target = event.currentTarget;
92
80
  }
93
-
94
- const matches = (_target = target) === null || _target === void 0 ? void 0 : _target.href.match(/\/files\/(\d+~\d+|\d+)/);
95
-
81
+ const matches = target?.href.match(/\/files\/(\d+~\d+|\d+)/);
96
82
  if (matches) {
97
83
  if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) {
98
84
  // if any modifier keys are pressed, do the browser default thing
99
85
  return;
100
86
  }
101
-
102
87
  event.preventDefault();
103
88
  const url = new URL(target.href);
104
- const verifier = url === null || url === void 0 ? void 0 : url.searchParams.get('verifier');
105
- const access_token = url === null || url === void 0 ? void 0 : url.searchParams.get('access_token');
106
- const instfs_id = url === null || url === void 0 ? void 0 : url.searchParams.get('instfs_id');
89
+ const verifier = url?.searchParams.get('verifier');
90
+ const access_token = url?.searchParams.get('access_token');
91
+ const instfs_id = url?.searchParams.get('instfs_id');
107
92
  const file_id = matches[1];
108
93
  const params = {
109
94
  subject: 'preview_file',
110
95
  file_id
111
96
  };
112
97
  if (verifier) params.verifier = verifier;
113
-
114
98
  if (access_token && instfs_id) {
115
99
  params.access_token = access_token;
116
100
  params.instfs_id = instfs_id;
117
- } // TODO:
101
+ }
102
+ // TODO:
118
103
  // 1. what window should we be using
119
104
  // 2. is that the right origin?
120
105
  // 3. this is temporary until we can decouple the file previewer from canvas
121
-
122
-
123
106
  window.top.postMessage(params, canvasOrigin);
124
107
  }
125
108
  }
@@ -128,21 +111,19 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
128
111
  // if any modifier keys are pressed, do the browser default thing
129
112
  return;
130
113
  }
131
-
132
114
  event.preventDefault();
133
115
  const $link = event.currentTarget || event.target;
134
-
135
116
  if ($link.getAttribute('aria-expanded') === 'true') {
136
117
  // close the preview by clicking the "Minimize File Preview" link
137
118
  const $preview = document.getElementById($link.getAttribute('aria-controls'));
138
119
  $preview.querySelector('.hide_file_preview_link').click();
139
120
  return;
140
121
  }
141
-
142
122
  showLoadingImage($link);
143
123
  fetch($link.getAttribute('href').replace(/\/(download|preview)/, '') // download as part of the path
144
124
  .replace(/wrap=1&?/, '') // wrap=1 as part of the query_string
145
- .replace(/[?&]$/, ''), // any trailing chars if wrap=1 was at the end
125
+ .replace(/[?&]$/, ''),
126
+ // any trailing chars if wrap=1 was at the end
146
127
  {
147
128
  method: 'GET',
148
129
  headers: {
@@ -156,16 +137,11 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
156
137
  const attachment = data && data.attachment;
157
138
  removeLoadingImage($link);
158
139
  let canvadoc_session_url = attachment.canvadoc_session_url;
159
-
160
140
  if (attachment && (!disableGooglePreviews && isPreviewable(attachment.content_type) || canvadoc_session_url)) {
161
141
  $link.setAttribute('aria-expanded', 'true');
162
-
163
142
  if (canvasOrigin && canvadoc_session_url !== null) {
164
- var _parseUrlOrNull;
165
-
166
- canvadoc_session_url = (_parseUrlOrNull = parseUrlOrNull(canvadoc_session_url, canvasOrigin)) === null || _parseUrlOrNull === void 0 ? void 0 : _parseUrlOrNull.toString();
143
+ canvadoc_session_url = parseUrlOrNull(canvadoc_session_url, canvasOrigin)?.toString();
167
144
  }
168
-
169
145
  const $div = document.querySelector(`[id="${$link.getAttribute('aria-controls')}"]`);
170
146
  $div.style.display = 'block';
171
147
  loadDocPreview($div, {
@@ -185,7 +161,6 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
185
161
  resetInlinePreview($link, $div);
186
162
  });
187
163
  $div.prepend($minimizeLink);
188
-
189
164
  if (Object.prototype.hasOwnProperty.call(event, 'originalEvent')) {
190
165
  // Only focus this link if the open preview link was initiated by a real browser event
191
166
  // If it was triggered by our auto_open stuff it shouldn't focus here.
@@ -196,19 +171,16 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
196
171
  showFlashAlert({
197
172
  message: formatMessage('Failed getting file contents'),
198
173
  type: 'error'
199
- }); // eslint-disable-next-line no-console
200
-
174
+ });
201
175
  console.error(ex);
202
176
  resetInlinePreview($link);
203
177
  removeLoadingImage($link);
204
178
  });
205
179
  }
206
-
207
180
  function resetInlinePreview($link, $previewContainer) {
208
181
  $link.setAttribute('aria-expanded', 'false');
209
182
  show($link);
210
183
  $link.focus();
211
-
212
184
  if ($previewContainer) {
213
185
  $previewContainer.innerHTML = '';
214
186
  $previewContainer.style.display = 'none';
@@ -15,30 +15,29 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  export function hidden(elem) {
19
20
  const width = elem.offsetWidth,
20
- height = elem.offsetHeight;
21
+ height = elem.offsetHeight;
21
22
  return width === 0 && height === 0;
22
23
  }
23
24
  export function visible(elem) {
24
25
  return !hidden(elem);
25
- } // start: the element where we start
26
+ }
27
+
28
+ // start: the element where we start
26
29
  // selector: find an ancestor to elem that matches this
27
30
  // context: optional DOM element within which the matching element may be found
28
-
29
31
  export function closest(start, selector, context) {
30
32
  const upperbound = context || document.body;
31
33
  let elem = start;
32
-
33
34
  while (elem) {
34
35
  if (elem.matches(selector)) {
35
36
  return elem;
36
37
  }
37
-
38
38
  if (elem === upperbound) {
39
39
  return null;
40
40
  }
41
-
42
41
  elem = elem.parentElement;
43
42
  }
44
43
  }
@@ -51,7 +50,9 @@ export function show(elem) {
51
50
  }
52
51
  export function capitalize(word) {
53
52
  return word.replace(/^./, letter => letter.toUpperCase());
54
- } // this implementation of get|setData does not
53
+ }
54
+
55
+ // this implementation of get|setData does not
55
56
  // deal with elements being recreated in the dom
56
57
  // but that seems to be OK
57
58
  //
@@ -59,9 +60,7 @@ export function capitalize(word) {
59
60
  // from canvas, there is other code that expects to use
60
61
  // jquery data saved in enhanceUserContent, but if not
61
62
  // so something useful anyway.
62
-
63
63
  /* eslint-disable no-undef */
64
-
65
64
  export function setData(elem, key, value) {
66
65
  if (typeof $ !== 'undefined') {
67
66
  $(elem).data(key, value);
@@ -74,11 +73,9 @@ export function getData(elem, key) {
74
73
  if (typeof $ !== 'undefined') {
75
74
  return $(elem).data(key);
76
75
  }
77
-
78
76
  if (elem.data && key in elem.data) {
79
77
  return elem.data[key];
80
78
  }
81
-
82
79
  return elem.getAttribute(`data-${key}`);
83
80
  }
84
81
  /* eslint-enable no-undef */
@@ -15,11 +15,13 @@
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
  const MathJaxDirective = Object.freeze({
19
20
  Ignore: 'mathjax_ignore',
20
21
  Process: 'mathjax_process'
21
- }); // configure MathJax to use 'color' extension fo LaTeX coding
22
+ });
22
23
 
24
+ // configure MathJax to use 'color' extension fo LaTeX coding
23
25
  const localConfig = {
24
26
  TeX: {
25
27
  extensions: ['autoload-all.js']
@@ -47,34 +49,23 @@ const localConfig = {
47
49
  showMathMenu: true,
48
50
  messageStyle: 'none'
49
51
  };
50
-
51
52
  class Mathml {
52
- constructor() {
53
- let features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
54
- let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
53
+ constructor(features = {}, config = {}) {
55
54
  this._features = features;
56
55
  this._config = config;
57
56
  }
58
-
59
- loadMathJax() {
60
- let configFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'TeX-MML-AM_SVG';
61
- let cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
62
-
57
+ loadMathJax(configFile = 'TeX-MML-AM_SVG', cb = null) {
63
58
  if (this.preventMathJax()) {
64
59
  return;
65
60
  }
66
-
67
61
  if (!this.isMathJaxLoaded()) {
68
- var _this$_features, _this$_config;
69
-
70
62
  // Statically declare this in the localConfig above as part of MAT-1219
71
- if ((_this$_features = this._features) !== null && _this$_features !== void 0 && _this$_features.explicit_latex_typesetting) {
63
+ if (this._features?.explicit_latex_typesetting) {
72
64
  localConfig.elements = document.getElementsByClassName(MathJaxDirective.Process);
73
65
  localConfig.tex2jax.processClass = MathJaxDirective.Process;
74
66
  }
75
-
76
- const locale = ((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.locale) || 'en'; // signal local config to mathjax as it loads
77
-
67
+ const locale = this._config?.locale || 'en';
68
+ // signal local config to mathjax as it loads
78
69
  window.MathJax = localConfig;
79
70
  if (window.MathJaxIsLoading) return;
80
71
  window.MathJaxIsLoading = true;
@@ -85,40 +76,31 @@ class Mathml {
85
76
  script.onerror = reject;
86
77
  script.async = true;
87
78
  script.src = `//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=${configFile}&locale=${locale}`;
88
- }); // eslint-disable-next-line promise/catch-or-return
89
-
79
+ });
90
80
  scriptPromise.then(() => {
91
- var _this$_features2;
92
-
93
81
  window.MathJax.Hub.Register.StartupHook('MathMenu Ready', function () {
94
82
  // get the mathjax context menu above the rce's equation editor
95
83
  window.MathJax.Menu.BGSTYLE['z-index'] = 2000;
96
84
  });
97
85
  window.MathJax.Hub.Register.StartupHook('End Config', function () {
98
86
  // wait until MathJAx is configured before calling the callback
99
- cb === null || cb === void 0 ? void 0 : cb();
87
+ cb?.();
100
88
  });
101
-
102
- if ((_this$_features2 = this._features) !== null && _this$_features2 !== void 0 && _this$_features2.new_math_equation_handling) {
89
+ if (this._features?.new_math_equation_handling) {
103
90
  window.MathJax.Hub.Register.MessageHook('Begin PreProcess', function (message) {
104
91
  mathImageHelper.catchEquationImages(message[1]);
105
92
  });
106
93
  window.MathJax.Hub.Register.MessageHook('Math Processing Error', function (message) {
107
- var _elem$parentElement;
108
-
109
- const elem = Array.isArray(message[1]) ? message[1][0] : message[1]; // ".math_equation_latex" is the elem we added for MathJax to typeset the image equation
110
-
111
- if ((_elem$parentElement = elem.parentElement) !== null && _elem$parentElement !== void 0 && _elem$parentElement.classList.contains('math_equation_latex')) {
112
- var _elem$parentElement$p;
113
-
94
+ const elem = Array.isArray(message[1]) ? message[1][0] : message[1];
95
+ // ".math_equation_latex" is the elem we added for MathJax to typeset the image equation
96
+ if (elem.parentElement?.classList.contains('math_equation_latex')) {
114
97
  // The equation we image we were trying to replace and failed is up 1 and back 1.
115
98
  // If we remove its "mathjaxified" attribute, the "End Math" handler
116
99
  // won't remove it from the DOM.
117
- if ((_elem$parentElement$p = elem.parentElement.previousElementSibling) !== null && _elem$parentElement$p !== void 0 && _elem$parentElement$p.hasAttribute('mathjaxified')) {
100
+ if (elem.parentElement.previousElementSibling?.hasAttribute('mathjaxified')) {
118
101
  elem.parentElement.previousElementSibling.removeAttribute('mathjaxified');
119
- } // remove the "math processing error" mathjax output.
120
-
121
-
102
+ }
103
+ // remove the "math processing error" mathjax output.
122
104
  elem.parentElement.remove();
123
105
  }
124
106
  });
@@ -144,15 +126,15 @@ class Mathml {
144
126
  element.remove();
145
127
  });
146
128
  });
147
- } // leaving this here so I don't have to keep looking up how to see all messages
129
+ }
130
+
131
+ // leaving this here so I don't have to keep looking up how to see all messages
148
132
  // window.MathJax.Hub.Startup.signal.Interest(function (message) {
149
133
  // console.log('>>> MathJax startup:', message)
150
134
  // })
151
135
  // window.MathJax.Hub.signal.Interest(function(message) {
152
136
  // console.log('>>> MathJax signal', message)
153
137
  // })
154
-
155
-
156
138
  delete window.MathJaxIsLoading;
157
139
  });
158
140
  } else {
@@ -161,116 +143,95 @@ class Mathml {
161
143
  // something has changed on the page and needs to get pulled into the MathJax ecosystem
162
144
  // window.MathJax.Hub.Reprocess([document.body])
163
145
  window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub]);
164
- cb === null || cb === void 0 ? void 0 : cb();
146
+ cb?.();
165
147
  }
166
148
  }
167
-
168
149
  preventMathJax() {
169
150
  return /(?:rubrics|\/files)/.test(window.location.pathname);
170
151
  }
171
-
172
152
  isMathOnPage() {
173
153
  return this.isMathInElement(document.body);
174
154
  }
175
-
176
155
  isMathInElement(elem) {
177
- var _this$_features3;
178
-
179
- if ((elem === null || elem === void 0 ? void 0 : elem.getAttribute('data-testid')) === 'mathml-preview-element') {
156
+ if (elem?.getAttribute('data-testid') === 'mathml-preview-element') {
180
157
  return true;
181
158
  }
182
-
183
- if ((_this$_features3 = this._features) !== null && _this$_features3 !== void 0 && _this$_features3.new_math_equation_handling) {
159
+ if (this._features?.new_math_equation_handling) {
184
160
  // handle the change from image + hidden mathml to mathjax formatted latex
185
161
  if (elem.querySelector('.math_equation_latex,.math_equation_mml')) {
186
162
  return true;
187
163
  }
188
-
189
164
  if (elem.querySelector('img.equation_image')) {
190
165
  return true;
191
- } // look for latex the user may have entered w/o the equation editor by
192
- // looking for mathjax's opening delimiters
193
-
166
+ }
194
167
 
168
+ // look for latex the user may have entered w/o the equation editor by
169
+ // looking for mathjax's opening delimiters
195
170
  if (/(?:\$\$|\\\()/.test(elem.textContent)) {
196
171
  return true;
197
172
  }
198
173
  }
199
-
200
174
  const mathElements = elem.getElementsByTagName('math');
201
-
202
175
  for (let i = 0; i < mathElements.length; i++) {
203
176
  const el = mathElements[i];
204
-
205
177
  if (el.offsetParent !== null && !el.closest('.hidden-readable') && !el.closest('.MJX_Assistive_MathML') // already mathjax'd
206
178
  ) {
207
179
  return true;
208
180
  }
209
181
  }
210
-
211
182
  return false;
212
183
  }
213
-
214
184
  get mathJaxGenerated() {
215
185
  return /^MathJax|MJX/;
216
- } // elements to ignore selector
217
-
186
+ }
218
187
 
188
+ // elements to ignore selector
219
189
  get ignore_list() {
220
190
  return '#header,#mobile-header,#left-side,#quiz-elapsed-time,.ui-menu-carat';
221
191
  }
222
-
223
192
  isMathJaxIgnored(elem) {
224
- var _this$_features4, _elem$parentElement2;
225
-
226
193
  if (!elem) return true;
227
-
228
- if ((_this$_features4 = this._features) !== null && _this$_features4 !== void 0 && _this$_features4.explicit_latex_typesetting && !elem.classList.contains(MathJaxDirective.Process)) {
194
+ if (this._features?.explicit_latex_typesetting && !elem.classList.contains(MathJaxDirective.Process)) {
229
195
  return true;
230
- } // ignore disconnected elements
231
-
196
+ }
232
197
 
233
- if (!document.body.contains(elem)) return true; // check if elem is in the ignore list
198
+ // ignore disconnected elements
199
+ if (!document.body.contains(elem)) return true;
234
200
 
235
- if (((_elem$parentElement2 = elem.parentElement) === null || _elem$parentElement2 === void 0 ? void 0 : _elem$parentElement2.querySelector(this.ignore_list)) === elem) {
201
+ // check if elem is in the ignore list
202
+ if (elem.parentElement?.querySelector(this.ignore_list) === elem) {
236
203
  return true;
237
- } // check if elem is a child of something we're ignoring
238
-
204
+ }
239
205
 
206
+ // check if elem is a child of something we're ignoring
240
207
  while (elem !== document.body) {
241
208
  // child of ignored element?
242
209
  if (elem.classList.contains(MathJaxDirective.Ignore)) {
243
210
  return true;
244
- } // // child of MathJax generated element?
211
+ }
212
+
213
+ // // child of MathJax generated element?
245
214
  // if (
246
215
  // this.mathJaxGenerated.test(elem.id) ||
247
216
  // this.mathJaxGenerated.test(elem.getAttribute('class'))
248
217
  // ) {
249
218
  // return true
250
219
  // }
251
-
252
-
253
220
  elem = elem.parentElement;
254
221
  }
255
-
256
222
  return false;
257
- } // legacy api
258
-
223
+ }
259
224
 
225
+ // legacy api
260
226
  isMathMLOnPage() {
261
227
  return this.isMathOnPage();
262
228
  }
263
-
264
229
  isMathJaxLoaded() {
265
- var _window$MathJax;
266
-
267
- return !!((_window$MathJax = window.MathJax) !== null && _window$MathJax !== void 0 && _window$MathJax.Hub);
230
+ return !!window.MathJax?.Hub;
268
231
  }
269
-
270
232
  shouldProcess(elem) {
271
233
  return this.isMathInElement(elem) && !this.isMathJaxIgnored(elem);
272
234
  }
273
-
274
235
  processNewMathInElem(elem) {
275
236
  if (this.shouldProcess(elem)) {
276
237
  if (this.isMathJaxLoaded()) {
@@ -280,53 +241,43 @@ class Mathml {
280
241
  }
281
242
  }
282
243
  }
244
+
283
245
  /*
284
246
  * elem: string with elementId or en elem object
285
247
  */
286
-
287
-
288
248
  reloadElement(elem) {
289
249
  if (this.isMathJaxLoaded()) {
290
250
  window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub, elem]);
291
251
  }
292
252
  }
293
-
294
253
  static get processNewMathEventName() {
295
254
  return 'process-new-math';
296
255
  }
297
-
298
256
  }
299
-
300
257
  const mathImageHelper = {
301
258
  getImageEquationText(img) {
302
259
  let equation_text;
303
260
  const src = img.getAttribute('src');
304
-
305
261
  if (src) {
306
262
  try {
307
263
  const url = new URL(src, 'http://localhost'); // we don't care about the host
308
-
309
264
  const srceq = url.pathname.split('/equation_images/')[1];
310
-
311
265
  if (srceq) {
312
266
  equation_text = decodeURIComponent(decodeURIComponent(srceq));
313
267
  }
314
- } catch (_ex) {// If we failed to parse the src URL, something is wrong.
268
+ } catch (_ex) {
269
+ // If we failed to parse the src URL, something is wrong.
315
270
  }
316
271
  }
317
-
318
272
  return equation_text;
319
273
  },
320
-
321
274
  catchEquationImages(refnode) {
322
- refnode = Array.isArray(refnode) ? refnode[0] : refnode; // find equation images and replace with inline LaTeX
323
-
275
+ refnode = Array.isArray(refnode) ? refnode[0] : refnode;
276
+ // find equation images and replace with inline LaTeX
324
277
  const eqimgs = refnode.querySelectorAll('img.equation_image');
325
-
326
278
  if (eqimgs.length > 0) {
327
279
  eqimgs.forEach(img => {
328
280
  const equation_text = this.getImageEquationText(img);
329
-
330
281
  if (equation_text) {
331
282
  img.setAttribute('mathjaxified', '');
332
283
  const mathtex = document.createElement('span');
@@ -334,7 +285,6 @@ const mathImageHelper = {
334
285
  mathtex.setAttribute('style', img.getAttribute('style'));
335
286
  mathtex.textContent = `\\(${equation_text}\\)`;
336
287
  mathtex.style.maxWidth = '';
337
-
338
288
  if (img.nextSibling) {
339
289
  img.parentElement.insertBefore(mathtex, img.nextSibling);
340
290
  } else {
@@ -345,7 +295,6 @@ const mathImageHelper = {
345
295
  return true;
346
296
  }
347
297
  },
348
-
349
298
  removeStrayEquationImages(refnode) {
350
299
  const eqimgs = refnode.querySelectorAll('img.equation_image');
351
300
  eqimgs.forEach(img => {
@@ -354,37 +303,30 @@ const mathImageHelper = {
354
303
  }
355
304
  });
356
305
  },
357
-
358
306
  nearlyInfiniteStyleFix(elem) {
359
307
  elem.querySelectorAll('[style*=clip], [style*=vertical-align]').forEach(e => {
360
308
  let changed = false;
361
309
  let s = e.getAttribute('style');
362
310
  const r = e.style.clip;
363
-
364
311
  if (/[\d.]+e\+?\d/.test(r)) {
365
312
  // e.g. "rect(1e+07em, -9.999e+06em, -1e+07em, -999.997em)"
366
313
  s = s.replace(/clip: rect[^;]+;/, '');
367
314
  changed = true;
368
315
  }
369
-
370
316
  const v = e.style.verticalAlign;
371
-
372
317
  if (Math.abs(parseFloat(v)) > 10000) {
373
318
  // 10000 is a ridiculously large number
374
319
  s = s.replace(/vertical-align[^;]+;/, '');
375
320
  changed = true;
376
321
  }
377
-
378
322
  if (changed) {
379
323
  e.setAttribute('style', s);
380
324
  }
381
325
  });
382
326
  }
383
-
384
327
  };
385
-
386
328
  function handleNewMath(event) {
387
- if (event !== null && event !== void 0 && event.detail) {
329
+ if (event?.detail) {
388
330
  const {
389
331
  features,
390
332
  config,
@@ -394,6 +336,5 @@ function handleNewMath(event) {
394
336
  mathml.processNewMathInElem(target);
395
337
  }
396
338
  }
397
-
398
339
  window.addEventListener(Mathml.processNewMathEventName, handleNewMath);
399
340
  export { Mathml, mathImageHelper, MathJaxDirective };