@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
@@ -1,5 +1,5 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1
2
  // @ts-nocheck
2
-
3
3
  /*
4
4
  * Copyright (C) 2018 - present Instructure, Inc.
5
5
  *
@@ -17,25 +17,24 @@
17
17
  * You should have received a copy of the GNU Affero General Public License along
18
18
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  */
20
+
20
21
  import { isContentItemIframeJson, isContentItemThumbnailJson } from './Lti13ContentItemJson';
21
22
  import { addParentFrameContextToUrl } from '../util/addParentFrameContextToUrl';
23
+
22
24
  /**
23
25
  * Represents an LTI 1.3 Deep Linking Content Item for purposes related to the Rich Content Editor.
24
26
  *
25
27
  * Use rceLti13ContentItemFromJson to create instances of this class.
26
28
  */
27
-
28
29
  export class RceLti13ContentItem {
29
30
  constructor(type, json, context) {
30
31
  this.type = type;
31
32
  this.json = json;
32
33
  this.context = context;
33
34
  }
34
-
35
35
  get untypedJson() {
36
36
  return this.json;
37
37
  }
38
-
39
38
  linkThumbnail() {
40
39
  if (isContentItemThumbnailJson(this.untypedJson.thumbnail)) {
41
40
  const {
@@ -48,51 +47,39 @@ export class RceLti13ContentItem {
48
47
  return this.imageTag(this.untypedJson.thumbnail);
49
48
  }
50
49
  }
51
-
52
50
  iframeTag() {
53
51
  const iframeInfo = this.untypedJson.iframe;
54
-
55
52
  if (isContentItemIframeJson(iframeInfo)) {
56
53
  var _addParentFrameContex, _this$context$ltiIfra;
57
-
58
54
  const iframeTag = document.createElement('iframe');
59
55
  iframeTag.setAttribute('src', (_addParentFrameContex = addParentFrameContextToUrl(iframeInfo.src, this.context.containingCanvasLtiToolId)) !== null && _addParentFrameContex !== void 0 ? _addParentFrameContex : '');
60
56
  iframeTag.setAttribute('title', this.buildTitle() || '');
61
57
  iframeTag.setAttribute('allowfullscreen', 'true');
62
58
  iframeTag.setAttribute('allow', (_this$context$ltiIfra = this.context.ltiIframeAllowPolicy) !== null && _this$context$ltiIfra !== void 0 ? _this$context$ltiIfra : '');
63
-
64
59
  if (iframeInfo.width) {
65
60
  iframeTag.style.width = `${iframeInfo.width}px`;
66
61
  }
67
-
68
62
  if (iframeInfo.height) {
69
63
  iframeTag.style.height = `${iframeInfo.height}px`;
70
64
  }
71
-
72
65
  return iframeTag.outerHTML;
73
66
  }
74
67
  }
75
-
76
68
  imageTag(src, width, height) {
77
69
  const imgTag = document.createElement('img');
78
70
  imgTag.setAttribute('src', src);
79
71
  const text = this.buildText();
80
-
81
72
  if (text != null) {
82
73
  imgTag.setAttribute('alt', text);
83
74
  }
84
-
85
75
  if (width) {
86
76
  imgTag.setAttribute('width', width.toString());
87
77
  }
88
-
89
78
  if (height) {
90
79
  imgTag.setAttribute('height', height.toString());
91
80
  }
92
-
93
81
  return imgTag.outerHTML;
94
82
  }
95
-
96
83
  anchorTag(innerHTML) {
97
84
  const anchorTag = document.createElement('a');
98
85
  anchorTag.setAttribute('href', this.safeUrl);
@@ -101,11 +88,7 @@ export class RceLti13ContentItem {
101
88
  anchorTag.innerHTML = innerHTML || '';
102
89
  return anchorTag.outerHTML;
103
90
  }
104
-
105
91
  get safeUrl() {
106
- var _this$buildUrl;
107
-
108
- return ((_this$buildUrl = this.buildUrl()) === null || _this$buildUrl === void 0 ? void 0 : _this$buildUrl.replace(/^(data:text\/html|javascript:)/, '#$1')) || '';
92
+ return this.buildUrl()?.replace(/^(data:text\/html|javascript:)/, '#$1') || '';
109
93
  }
110
-
111
94
  }
@@ -15,65 +15,51 @@
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 { RceLti13ContentItem } from '../RceLti13ContentItem';
19
20
  // Base content item type
20
21
  export default class BaseLinkContentItem extends RceLti13ContentItem {
21
22
  toHtmlString() {
22
- var _this$iframe;
23
-
24
- if (((_this$iframe = this.iframe) === null || _this$iframe === void 0 ? void 0 : _this$iframe.src) != null) {
23
+ if (this.iframe?.src != null) {
25
24
  return this.iframeTag();
26
25
  } else {
27
26
  return this.anchorTag(this.linkBody());
28
27
  }
29
28
  }
30
-
31
29
  linkText() {
32
- var _this$buildText$trim, _this$buildText, _this$buildTitle$trim, _this$buildTitle;
33
-
34
- const text = (_this$buildText$trim = (_this$buildText = this.buildText()) === null || _this$buildText === void 0 ? void 0 : _this$buildText.trim()) !== null && _this$buildText$trim !== void 0 ? _this$buildText$trim : '';
35
- const title = (_this$buildTitle$trim = (_this$buildTitle = this.buildTitle()) === null || _this$buildTitle === void 0 ? void 0 : _this$buildTitle.trim()) !== null && _this$buildTitle$trim !== void 0 ? _this$buildTitle$trim : '';
30
+ var _this$buildText$trim, _this$buildTitle$trim;
31
+ const text = (_this$buildText$trim = this.buildText()?.trim()) !== null && _this$buildText$trim !== void 0 ? _this$buildText$trim : '';
32
+ const title = (_this$buildTitle$trim = this.buildTitle()?.trim()) !== null && _this$buildTitle$trim !== void 0 ? _this$buildTitle$trim : '';
36
33
  return text.length > 0 ? text : title.length > 0 ? title : undefined;
37
34
  }
38
-
39
35
  linkBody() {
40
36
  if (this.thumbnail) {
41
37
  return this.linkThumbnail();
42
38
  }
43
-
44
39
  return this.linkText();
45
40
  }
46
-
47
41
  buildText() {
48
42
  return this.context.selection || this.json.text;
49
43
  }
50
-
51
44
  buildUrl() {
52
45
  return this.json.url;
53
46
  }
54
-
55
47
  buildTitle() {
56
48
  return this.json.title;
57
49
  }
58
-
59
50
  get icon() {
60
51
  return this.json.icon;
61
52
  }
62
-
63
53
  get thumbnail() {
64
54
  return this.json.thumbnail;
65
55
  }
66
-
67
56
  get iframe() {
68
57
  return this.json.iframe;
69
58
  }
70
-
71
59
  get custom() {
72
60
  return this.json.custom;
73
61
  }
74
-
75
62
  get lookup_uuid() {
76
63
  return this.json.lookup_uuid;
77
64
  }
78
-
79
65
  }
@@ -15,33 +15,28 @@
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 { RceLti13ContentItem } from '../RceLti13ContentItem';
19
20
  export default class HtmlFragmentContentItem extends RceLti13ContentItem {
20
21
  constructor(json, context) {
21
22
  super(HtmlFragmentContentItem.type, json, context);
22
23
  }
23
-
24
24
  get html() {
25
25
  return this.json.html;
26
26
  }
27
-
28
27
  buildTitle() {
29
28
  return this.json.title;
30
29
  }
31
-
32
30
  buildText() {
33
31
  return this.json.text;
34
32
  }
35
-
36
33
  buildUrl() {
37
34
  return undefined;
38
35
  }
39
-
40
36
  toHtmlString() {
41
37
  // TinyMCE takes care of sanitizing this HTML string.
42
38
  // If using a target other than TinyMCE be sure to sanitize.
43
39
  return this.html;
44
40
  }
45
-
46
41
  }
47
42
  HtmlFragmentContentItem.type = 'html';
@@ -15,43 +15,35 @@
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 { RceLti13ContentItem } from '../RceLti13ContentItem';
19
20
  export default class ImageContentItem extends RceLti13ContentItem {
20
21
  constructor(json, context) {
21
22
  super(ImageContentItem.type, json, context);
22
23
  }
23
-
24
24
  buildUrl() {
25
25
  return this.json.url;
26
26
  }
27
-
28
27
  buildTitle() {
29
28
  return this.json.title;
30
29
  }
31
-
32
30
  get thumbnail() {
33
31
  return this.json.thumbnail;
34
32
  }
35
-
36
33
  buildText() {
37
34
  return this.json.text;
38
35
  }
39
-
40
36
  get width() {
41
37
  return this.json.width;
42
38
  }
43
-
44
39
  get height() {
45
40
  return this.json.height;
46
41
  }
47
-
48
42
  toHtmlString() {
49
43
  if (this.thumbnail) {
50
44
  return this.anchorTag(this.linkThumbnail());
51
45
  }
52
-
53
46
  return this.imageTag(this.safeUrl, this.width, this.height);
54
47
  }
55
-
56
48
  }
57
49
  ImageContentItem.type = 'image';
@@ -15,12 +15,12 @@
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 BaseLinkContentItem from './BaseLinkContentItem';
19
20
  // Base content item type
20
21
  export default class LinkContentItem extends BaseLinkContentItem {
21
22
  constructor(json, context) {
22
23
  super(LinkContentItem.type, json, context);
23
24
  }
24
-
25
25
  }
26
26
  LinkContentItem.type = 'link';
@@ -15,14 +15,14 @@
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 BaseLinkContentItem from './BaseLinkContentItem';
19
20
  import { addQueryParamsToUrl } from '../../../../../util/url-util';
20
- import { PARENT_FRAME_CONTEXT_PARAM } from '../../ExternalToolsEnv';
21
+ import { parentFrameContextParam } from '../../constants';
21
22
  export default class ResourceLinkContentItem extends BaseLinkContentItem {
22
23
  constructor(json, context) {
23
24
  super(ResourceLinkContentItem.type, json, context);
24
25
  }
25
-
26
26
  toHtmlString() {
27
27
  if (this.iframe != null) {
28
28
  // The iframe src must always be the Canvas launch endpoint
@@ -32,16 +32,14 @@ export default class ResourceLinkContentItem extends BaseLinkContentItem {
32
32
  return this.anchorTag(this.linkBody());
33
33
  }
34
34
  }
35
-
36
35
  buildUrl() {
37
36
  // iframed launches need canvas wrapped around them for postMessages to work
38
37
  const display = this.iframe != null ? 'in_rce' : 'borderless';
39
38
  return addQueryParamsToUrl(this.context.ltiEndpoint, {
40
39
  display,
41
40
  resource_link_lookup_uuid: this.lookup_uuid,
42
- [PARENT_FRAME_CONTEXT_PARAM]: this.context.containingCanvasLtiToolId
41
+ [parentFrameContextParam]: this.context.containingCanvasLtiToolId
43
42
  });
44
43
  }
45
-
46
44
  }
47
45
  ResourceLinkContentItem.type = 'ltiResourceLink';
@@ -1,5 +1,3 @@
1
- // @ts-nocheck
2
-
3
1
  /*
4
2
  * Copyright (C) 2018 - present Instructure, Inc.
5
3
  *
@@ -17,18 +15,17 @@
17
15
  * You should have received a copy of the GNU Affero General Public License along
18
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
17
  */
18
+
20
19
  import { rceLti13ContentItemFromJson } from './rceLti13ContentItemFromJson';
21
20
  import { showFlashAlert } from '../../../../common/FlashAlert';
22
21
  import formatMessage from '../../../../format-message';
23
22
  export default function processEditorContentItems(event, env, dialog) {
24
23
  try {
25
- var _event$data, _event$data$content_i, _event$data2, _event$data4;
26
-
27
- const ltiEndpoint = (_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.ltiEndpoint;
24
+ var _event$data$content_i;
25
+ const ltiEndpoint = event.data?.ltiEndpoint;
28
26
  const selection = env.editorSelection;
29
- const eventContentItems = (_event$data$content_i = (_event$data2 = event.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.content_items) !== null && _event$data$content_i !== void 0 ? _event$data$content_i : [];
27
+ const eventContentItems = (_event$data$content_i = event.data?.content_items) !== null && _event$data$content_i !== void 0 ? _event$data$content_i : [];
30
28
  let unsupportedItemWarningShown = false;
31
-
32
29
  for (const inputItem of eventContentItems) {
33
30
  const parsedItem = rceLti13ContentItemFromJson(inputItem, {
34
31
  ltiEndpoint: ltiEndpoint !== null && ltiEndpoint !== void 0 ? ltiEndpoint : null,
@@ -36,18 +33,14 @@ export default function processEditorContentItems(event, env, dialog) {
36
33
  containingCanvasLtiToolId: env.containingCanvasLtiToolId,
37
34
  ltiIframeAllowPolicy: env.ltiIframeAllowPolicy
38
35
  });
39
-
40
36
  if (parsedItem != null) {
41
- var _event$data3;
42
-
43
- if ((_event$data3 = event.data) !== null && _event$data3 !== void 0 && _event$data3.replaceEditorContents) {
37
+ if (event.data?.replaceEditorContents) {
44
38
  env.replaceCode(parsedItem.toHtmlString());
45
39
  } else {
46
40
  env.insertCode(parsedItem.toHtmlString());
47
41
  }
48
42
  } else if (!unsupportedItemWarningShown) {
49
43
  var _inputItem$type;
50
-
51
44
  showFlashAlert({
52
45
  message: formatMessage('Could not insert content: "{itemType}" items are not currently supported in Canvas.', {
53
46
  itemType: (_inputItem$type = inputItem.type) !== null && _inputItem$type !== void 0 ? _inputItem$type : 'unknown'
@@ -57,11 +50,25 @@ export default function processEditorContentItems(event, env, dialog) {
57
50
  });
58
51
  unsupportedItemWarningShown = true;
59
52
  }
60
- } // Remove "unsaved changes" warnings and close modal
61
-
53
+ }
62
54
 
63
- if ((_event$data4 = event.data) !== null && _event$data4 !== void 0 && _event$data4.content_items) {
64
- dialog === null || dialog === void 0 ? void 0 : dialog.close();
55
+ // Remove "unsaved changes" warnings and close modal
56
+ if (event.data?.content_items) {
57
+ dialog?.close();
58
+ }
59
+ if (event.data?.msg !== undefined) {
60
+ // @ts-expect-error
61
+ showFlashAlert({
62
+ message: event.data.msg.toString()
63
+ });
64
+ }
65
+ // @ts-expect-error
66
+ if (event.data?.errormsg !== undefined) {
67
+ // @ts-expect-error
68
+ showFlashAlert({
69
+ message: event.data.errormsg.toString(),
70
+ type: 'error'
71
+ });
65
72
  }
66
73
  } catch (e) {
67
74
  showFlashAlert({
@@ -15,11 +15,11 @@
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 HtmlFragmentContentItem from './models/HtmlFragmentContentItem';
19
20
  import ImageContentItem from './models/ImageContentItem';
20
21
  import LinkContentItem from './models/LinkContentItem';
21
22
  import ResourceLinkContentItem from './models/ResourceLinkContentItem';
22
-
23
23
  /**
24
24
  * Creates an RceLti13ContentItem from the given JSON, or null if the type isn't supported.
25
25
  *
@@ -31,15 +31,14 @@ import ResourceLinkContentItem from './models/ResourceLinkContentItem';
31
31
  */
32
32
  export function rceLti13ContentItemFromJson(itemJson, context) {
33
33
  if (!itemJson.type) return null;
34
- const clazz = typeRegistry[itemJson.type]; // eslint-disable-next-line new-cap
35
-
34
+ const clazz = typeRegistry[itemJson.type];
36
35
  return clazz ? new clazz(itemJson, context) : null;
37
36
  }
37
+
38
38
  /*
39
39
  * Type safe registry of implementation of RceLti13ContentItem. Adding additional types to the Lti13ContentItemJson
40
40
  * union will cause a compiler error if the implementations aren't added here as well.
41
41
  */
42
-
43
42
  const typeRegistry = {
44
43
  html: HtmlFragmentContentItem,
45
44
  image: ImageContentItem,
@@ -15,16 +15,19 @@
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 tinymce from 'tinymce';
19
20
  import React from 'react';
20
21
  import ReactDOM from 'react-dom';
21
- import { RceToolWrapper, buildToolMenuItems, externalToolsForToolbar } from './RceToolWrapper';
22
+ import { RceToolWrapper, buildToolMenuItems } from './RceToolWrapper';
22
23
  import formatMessage from '../../../format-message';
23
24
  import { ExternalToolSelectionDialog } from './components/ExternalToolSelectionDialog/ExternalToolSelectionDialog';
24
25
  import { ensureToolDialogContainerElem } from './dialog-helper';
25
- import { externalToolsEnvFor } from './ExternalToolsEnv'; // Register plugin
26
-
26
+ import { externalToolsEnvFor } from './ExternalToolsEnv';
27
+ import { externalToolsForToolbar } from './util/externalToolsForToolbar';
28
+ // Register plugin
27
29
  tinymce.PluginManager.add('instructure_rce_external_tools', initExternalToolsLocalPlugin);
30
+
28
31
  /**
29
32
  * This plugin adds the "Apps" toolbar button and the "Apps" menu item. It is a rewrite of 'instructure_external_tools'
30
33
  * to live fully in the canvas-rce package. It supports running in an iframe as part of an LTI tool, such as
@@ -32,20 +35,18 @@ tinymce.PluginManager.add('instructure_rce_external_tools', initExternalToolsLoc
32
35
  *
33
36
  * @param editor
34
37
  */
35
-
36
38
  export function initExternalToolsLocalPlugin(editor) {
37
39
  if (RceToolWrapper.forEditorEnv(externalToolsEnvFor(editor)).length === 0) {
38
40
  return;
39
41
  }
40
-
41
42
  registerFavoriteAppsToolbarButtons(editor);
42
43
  registerAppsToolbarButton(editor);
43
44
  registerAppsMenu(editor);
44
45
  }
46
+
45
47
  /**
46
48
  * Add the "Apps" toolbar button with "View all" and MRU buttons
47
49
  */
48
-
49
50
  function registerAppsMenu(editor) {
50
51
  editor.ui.registry.addNestedMenuItem('lti_tools_menuitem', {
51
52
  text: formatMessage('Apps'),
@@ -57,16 +58,14 @@ function registerAppsMenu(editor) {
57
58
  }
58
59
  });
59
60
  }
61
+
60
62
  /**
61
63
  * Registers toolbar buttons for favorite apps
62
64
  */
63
-
64
-
65
65
  function registerFavoriteAppsToolbarButtons(editor) {
66
66
  const allTools = RceToolWrapper.forEditorEnv(externalToolsEnvFor(editor));
67
67
  externalToolsForToolbar(allTools).forEach(toolInfo => editor.ui.registry.addButton(`instructure_external_button_${toolInfo.id}`, toolInfo.asToolbarButton()));
68
68
  }
69
-
70
69
  function registerAppsToolbarButton(editor) {
71
70
  const tooltip = 'apps-temp';
72
71
  editor.ui.registry.addMenuButton('lti_mru_button', {
@@ -77,40 +76,32 @@ function registerAppsToolbarButton(editor) {
77
76
  const toolMenuItems = buildToolMenuItems(availableTools, makeViewAllItem(editor));
78
77
  callback(toolMenuItems);
79
78
  },
80
-
81
79
  onSetup(_api) {
82
80
  const e = document.querySelector("button[title='apps-temp']");
83
- e === null || e === void 0 ? void 0 : e.setAttribute('title', formatMessage('Apps'));
84
- e === null || e === void 0 ? void 0 : e.setAttribute('id', 'plug-apps-button');
81
+ e?.setAttribute('title', formatMessage('Apps'));
82
+ e?.setAttribute('id', 'plug-apps-button');
85
83
  return () => undefined;
86
84
  }
87
-
88
85
  });
89
86
  }
90
-
91
87
  function openToolSelectionDialog(editor) {
92
88
  const availableTools = RceToolWrapper.forEditorEnv(externalToolsEnvFor(editor));
93
89
  const container = ensureToolDialogContainerElem();
94
-
95
90
  const handleDismiss = () => {
96
91
  ReactDOM.unmountComponentAtNode(container);
97
92
  editor.focus();
98
93
  };
99
-
100
- ReactDOM.render( /*#__PURE__*/React.createElement(ExternalToolSelectionDialog, {
94
+ ReactDOM.render(/*#__PURE__*/React.createElement(ExternalToolSelectionDialog, {
101
95
  onDismiss: handleDismiss,
102
96
  ltiButtons: availableTools
103
97
  }), ensureToolDialogContainerElem());
104
98
  }
105
-
106
99
  function makeViewAllItem(editor) {
107
100
  return {
108
101
  type: 'menuitem',
109
102
  text: formatMessage('View All'),
110
-
111
103
  onAction() {
112
104
  openToolSelectionDialog(editor);
113
105
  }
114
-
115
106
  };
116
107
  }
@@ -15,12 +15,12 @@
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 { addQueryParamsToUrl } from '../../../../util/url-util';
19
20
  export function addParentFrameContextToUrl(inputUrlStr, containingCanvasLtiToolId) {
20
21
  if (containingCanvasLtiToolId == null || containingCanvasLtiToolId.length === 0) {
21
22
  return inputUrlStr !== null && inputUrlStr !== void 0 ? inputUrlStr : null;
22
23
  }
23
-
24
24
  return addQueryParamsToUrl(inputUrlStr, {
25
25
  parent_frame_context: containingCanvasLtiToolId
26
26
  });
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Copyright (C) 2025 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+
19
+ export function externalToolsForToolbar(tools) {
20
+ // Limit of not on_by_default but favorited tools is 2
21
+ const favorited = tools.filter(it => it.favorite && !it.on_by_default).slice(0, 2) || [];
22
+ const onByDefault = tools.filter(it => it.on_by_default && it.favorite) || [];
23
+ const set = new Map();
24
+ // Remove possible overlaps between favorited and onByDefault, otherwise
25
+ // we'd have duplicate buttons in the toolbar.
26
+ for (const toolInfo of favorited.concat(onByDefault)) {
27
+ set.set(toolInfo.id, toolInfo);
28
+ }
29
+ return Array.from(set.values()).sort((a, b) => {
30
+ if (a.on_by_default && !b.on_by_default) {
31
+ return -1;
32
+ } else if (!a.on_by_default && b.on_by_default) {
33
+ return 1;
34
+ } else {
35
+ // This *should* always be a string, but there might be cases where it isn't,
36
+ // especially when this method is used outside of TypeScript files.
37
+ return a.id.toString().localeCompare(b.id.toString(), undefined, {
38
+ numeric: true
39
+ });
40
+ }
41
+ });
42
+ }