@instructure/canvas-rce 5.14.1 → 5.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +8 -56
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +7 -28
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +104 -59
  25. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +15 -8
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +17 -28
  36. package/es/enhance-user-content/enhance_user_content.js +28 -60
  37. package/es/enhance-user-content/external_links.js +5 -8
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +12 -34
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +35 -82
  42. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  43. package/es/format-message.js +3 -4
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.js +3 -1
  47. package/es/rce/AlertMessageArea.js +1 -1
  48. package/es/rce/DraggingBlocker.js +4 -2
  49. package/es/rce/KeyboardShortcutModal.js +1 -0
  50. package/es/rce/RCE.js +12 -11
  51. package/es/rce/RCEGlobals.js +12 -10
  52. package/es/rce/RCEVariants.js +27 -10
  53. package/es/rce/RCEWrapper.js +167 -386
  54. package/es/rce/RCEWrapperProps.js +8 -3
  55. package/es/rce/RceHtmlEditor.js +5 -8
  56. package/es/rce/ResizeHandle.js +3 -8
  57. package/es/rce/RestoreAutoSaveModal.js +1 -2
  58. package/es/rce/ShowOnFocusButton/index.js +0 -6
  59. package/es/rce/StatusBar.js +8 -37
  60. package/es/rce/alertHandler.js +1 -4
  61. package/es/rce/contentInsertion.js +35 -57
  62. package/es/rce/contentInsertionUtils.js +6 -8
  63. package/es/rce/contentRendering.js +7 -12
  64. package/es/rce/customEvents.js +1 -0
  65. package/es/rce/editorLanguage.js +22 -10
  66. package/es/rce/indicatorRegion.js +6 -5
  67. package/es/rce/normalizeLocale.js +5 -3
  68. package/es/rce/normalizeProps.js +3 -1
  69. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  70. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  71. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  73. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  74. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  75. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  76. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  82. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  83. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  84. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  85. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  86. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  92. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  94. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  95. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  96. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  97. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  98. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  99. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  100. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  101. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  102. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  103. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  126. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  127. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  128. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  129. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  130. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  131. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  132. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  134. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  135. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  136. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  137. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  138. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  139. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  140. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  141. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  143. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  144. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  146. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  147. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  148. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  149. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  150. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  152. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  153. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  154. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  155. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  158. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  159. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  163. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  164. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  165. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  166. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  167. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  168. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  169. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  170. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  171. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  172. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  173. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  174. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  175. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  176. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  181. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  183. package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
  184. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  185. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  186. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  187. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  188. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  197. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  199. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  201. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  202. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  204. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  205. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  206. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  207. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  208. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  210. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  211. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  212. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  213. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  214. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  215. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  216. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  217. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  218. package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
  219. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  220. package/es/rce/plugins/shared/ColorInput.js +5 -14
  221. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  222. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  223. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  224. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  225. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  226. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  227. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  228. package/es/rce/plugins/shared/EventUtils.js +1 -3
  229. package/es/rce/plugins/shared/Filter.js +8 -38
  230. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  231. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  232. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  233. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  234. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  235. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  236. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  237. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  238. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  239. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  240. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  241. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  242. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  243. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  244. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  245. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  247. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  249. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  250. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  252. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  253. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  254. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  255. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  256. package/es/rce/plugins/shared/Previewable.js +1 -0
  257. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  258. package/es/rce/plugins/shared/StoreContext.js +1 -2
  259. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  260. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  261. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  262. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  263. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  264. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  265. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  266. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  267. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  268. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  269. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  270. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  271. package/es/rce/plugins/shared/Upload/index.js +1 -0
  272. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  273. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  274. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  276. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  277. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  278. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  279. package/es/rce/plugins/shared/dateUtils.js +1 -1
  280. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  281. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  282. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  283. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  284. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  285. package/es/rce/plugins/shared/fileShape.js +4 -9
  286. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  287. package/es/rce/plugins/shared/fileUtils.js +1 -2
  288. package/es/rce/plugins/shared/linkUtils.js +1 -16
  289. package/es/rce/plugins/shared/round.js +1 -0
  290. package/es/rce/plugins/shared/trayUtils.js +4 -3
  291. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  292. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  293. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  294. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  295. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  296. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  297. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  299. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  300. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  314. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  320. package/es/rce/root.js +9 -8
  321. package/es/rce/sanitizePlugins.js +1 -3
  322. package/es/rce/style.js +1 -4
  323. package/es/rce/tinyRCE.js +13 -9
  324. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  325. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  326. package/es/rce/transformContent.js +8 -10
  327. package/es/rce/types.js +1 -0
  328. package/es/rce/userOS.js +1 -1
  329. package/es/rce/wrapInitCb.js +50 -43
  330. package/es/rcs/api.js +61 -116
  331. package/es/rcs/buildError.js +5 -17
  332. package/es/rcs/fake.js +4 -13
  333. package/es/sidebar/actions/all_files.js +2 -0
  334. package/es/sidebar/actions/data.js +4 -7
  335. package/es/sidebar/actions/documents.js +9 -6
  336. package/es/sidebar/actions/files.js +3 -6
  337. package/es/sidebar/actions/filter.js +1 -0
  338. package/es/sidebar/actions/flickr.js +1 -1
  339. package/es/sidebar/actions/images.js +12 -11
  340. package/es/sidebar/actions/links.js +1 -0
  341. package/es/sidebar/actions/media.js +12 -10
  342. package/es/sidebar/actions/session.js +1 -3
  343. package/es/sidebar/actions/ui.js +1 -0
  344. package/es/sidebar/actions/upload.js +14 -39
  345. package/es/sidebar/containers/Sidebar.js +1 -2
  346. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  347. package/es/sidebar/dragHtml.js +5 -3
  348. package/es/sidebar/reducers/all_files.js +4 -3
  349. package/es/sidebar/reducers/collection.js +12 -13
  350. package/es/sidebar/reducers/collections.js +5 -5
  351. package/es/sidebar/reducers/documents.js +6 -13
  352. package/es/sidebar/reducers/files.js +3 -3
  353. package/es/sidebar/reducers/filter.js +1 -8
  354. package/es/sidebar/reducers/flickr.js +9 -9
  355. package/es/sidebar/reducers/folder.js +15 -15
  356. package/es/sidebar/reducers/folders.js +3 -3
  357. package/es/sidebar/reducers/images.js +3 -13
  358. package/es/sidebar/reducers/index.js +3 -1
  359. package/es/sidebar/reducers/media.js +6 -13
  360. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  361. package/es/sidebar/reducers/noop.js +1 -0
  362. package/es/sidebar/reducers/rootFolderId.js +1 -2
  363. package/es/sidebar/reducers/session.js +3 -3
  364. package/es/sidebar/reducers/ui.js +3 -16
  365. package/es/sidebar/reducers/upload.js +8 -40
  366. package/es/sidebar/store/configureStore.js +1 -0
  367. package/es/sidebar/store/initialState.js +13 -24
  368. package/es/translations/locales/ab.js +1 -0
  369. package/es/translations/locales/ar.js +67 -9
  370. package/es/translations/locales/ca.js +67 -9
  371. package/es/translations/locales/cs.js +1 -0
  372. package/es/translations/locales/cs_CZ.js +1 -0
  373. package/es/translations/locales/cy.js +67 -9
  374. package/es/translations/locales/da-x-k12.js +67 -9
  375. package/es/translations/locales/da.js +67 -9
  376. package/es/translations/locales/da_DK.js +1 -0
  377. package/es/translations/locales/de.js +67 -9
  378. package/es/translations/locales/el.js +4 -0
  379. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  380. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  381. package/es/translations/locales/en.js +72 -8
  382. package/es/translations/locales/en_AU.js +67 -9
  383. package/es/translations/locales/en_CA.js +67 -9
  384. package/es/translations/locales/en_CY.js +67 -9
  385. package/es/translations/locales/en_GB.js +67 -9
  386. package/es/translations/locales/en_NZ.js +1 -0
  387. package/es/translations/locales/en_SE.js +1 -0
  388. package/es/translations/locales/en_US.js +1 -0
  389. package/es/translations/locales/es.js +67 -9
  390. package/es/translations/locales/es_ES.js +67 -9
  391. package/es/translations/locales/es_GT.js +1 -0
  392. package/es/translations/locales/fa_IR.js +7 -0
  393. package/es/translations/locales/fi.js +67 -9
  394. package/es/translations/locales/fr.js +67 -9
  395. package/es/translations/locales/fr_CA.js +68 -10
  396. package/es/translations/locales/ga.js +5 -13
  397. package/es/translations/locales/he.js +7 -0
  398. package/es/translations/locales/hi.js +67 -9
  399. package/es/translations/locales/ht.js +67 -9
  400. package/es/translations/locales/hu.js +7 -6
  401. package/es/translations/locales/hu_HU.js +1 -0
  402. package/es/translations/locales/hy.js +1 -0
  403. package/es/translations/locales/id.js +67 -9
  404. package/es/translations/locales/id_ID.js +1 -0
  405. package/es/translations/locales/is.js +67 -9
  406. package/es/translations/locales/it.js +67 -9
  407. package/es/translations/locales/ja.js +67 -9
  408. package/es/translations/locales/ko.js +1 -0
  409. package/es/translations/locales/ko_KR.js +1 -0
  410. package/es/translations/locales/lt.js +1 -0
  411. package/es/translations/locales/lt_LT.js +1 -0
  412. package/es/translations/locales/mi.js +67 -9
  413. package/es/translations/locales/mn_MN.js +1 -0
  414. package/es/translations/locales/ms.js +67 -9
  415. package/es/translations/locales/nb-x-k12.js +67 -9
  416. package/es/translations/locales/nb.js +67 -9
  417. package/es/translations/locales/nl.js +67 -9
  418. package/es/translations/locales/nl_NL.js +1 -0
  419. package/es/translations/locales/nn.js +7 -6
  420. package/es/translations/locales/pl.js +67 -9
  421. package/es/translations/locales/pt.js +67 -9
  422. package/es/translations/locales/pt_BR.js +67 -9
  423. package/es/translations/locales/ro.js +1 -0
  424. package/es/translations/locales/ru.js +67 -9
  425. package/es/translations/locales/se.js +1 -0
  426. package/es/translations/locales/sl.js +67 -9
  427. package/es/translations/locales/sv-x-k12.js +67 -9
  428. package/es/translations/locales/sv.js +67 -9
  429. package/es/translations/locales/sv_SE.js +1 -0
  430. package/es/translations/locales/tg.js +1 -0
  431. package/es/translations/locales/th.js +67 -9
  432. package/es/translations/locales/th_TH.js +1 -0
  433. package/es/translations/locales/tl_PH.js +1 -0
  434. package/es/translations/locales/tr.js +7 -0
  435. package/es/translations/locales/uk_UA.js +7 -0
  436. package/es/translations/locales/vi.js +67 -9
  437. package/es/translations/locales/vi_VN.js +1 -0
  438. package/es/translations/locales/zh-Hans.js +67 -9
  439. package/es/translations/locales/zh-Hant.js +67 -9
  440. package/es/translations/locales/zh.js +67 -9
  441. package/es/translations/locales/zh_HK.js +67 -9
  442. package/es/translations/locales/zh_TW.Big5.js +1 -0
  443. package/es/translations/locales/zh_TW.js +1 -0
  444. package/es/translations/tinymce/ar_SA.js +1 -0
  445. package/es/translations/tinymce/fi.js +1 -0
  446. package/es/translations/tinymce/ga.js +1 -0
  447. package/es/translations/tinymce/id.js +1 -0
  448. package/es/translations/tinymce/ru.js +1 -0
  449. package/es/translations/tinymce/ru_RU.js +1 -0
  450. package/es/translations/tinymce/sl.js +1 -0
  451. package/es/translations/tinymce/sr.js +1 -0
  452. package/es/translations/tinymce/th.js +1 -0
  453. package/es/translations/tinymce/uk_UA.js +1 -0
  454. package/es/translations/tinymce/vi_VN.js +1 -0
  455. package/es/util/TypedDict.js +4 -2
  456. package/es/util/encrypted-storage.js +3 -13
  457. package/es/util/file-url-util.js +1 -6
  458. package/es/util/fullscreenHelpers.js +4 -1
  459. package/es/util/instui-icon-helper.js +4 -3
  460. package/es/util/loadingPlaceholder.js +38 -39
  461. package/es/util/simpleCache.js +0 -3
  462. package/es/util/string-util.js +1 -1
  463. package/es/util/textarea-editing-util.js +3 -7
  464. package/es/util/tinymce-plugin-util.js +0 -5
  465. package/es/util/url-util.js +16 -25
  466. package/eslint.config.js +239 -0
  467. package/jest.config.js +1 -1
  468. package/package.json +76 -81
  469. package/scripts/build-canvas +2 -1
  470. package/scripts/build.js +4 -4
  471. package/testcafe/RCEWrapper.test.js +0 -1
  472. package/testcafe/StatusBar.test.js +0 -1
  473. package/testcafe/axe.test.js +3 -4
  474. package/testcafe/enhanceUserContent.test.js +0 -1
  475. package/tsconfig.json +20 -15
  476. package/.eslintrc +0 -45
  477. package/.prettierignore +0 -6
  478. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  479. package/es/rce/__mocks__/styleMock.js +0 -18
  480. package/es/rce/__mocks__/tinymceReact.js +0 -55
  481. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -15,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 React, { useCallback, useEffect, useRef, useState } from 'react';
19
20
  import { bool, element, func, instanceOf, oneOfType, shape, string } from 'prop-types';
20
21
  import { Tray } from '@instructure/ui-tray';
@@ -33,6 +34,7 @@ import { getLinkContentFromEditor } from './ContentSelection';
33
34
  import { LinkDisplay } from './LinkDisplay';
34
35
  import { showFlashAlert } from '../../../common/FlashAlert';
35
36
  import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasContentUtils';
37
+
36
38
  /**
37
39
  * Returns the translated tray label
38
40
  * @param {string} contentType - The type of content showing on tray
@@ -40,51 +42,44 @@ import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasCont
40
42
  * @param {string} contextType - The user's context
41
43
  * @returns {string}
42
44
  */
43
-
44
45
  function getTrayLabel(contentType, contentSubtype, contextType) {
45
46
  if (contentType === 'links' && contextType === 'course') {
46
47
  return formatMessage('Course Links');
47
48
  } else if (contentType === 'links' && contextType === 'group') {
48
49
  return formatMessage('Group Links');
49
50
  }
50
-
51
51
  switch (contentSubtype) {
52
52
  case ICON_MAKER_ICONS:
53
53
  return formatMessage('Icon Maker Icons');
54
-
55
54
  case 'images':
56
55
  if (contentType === 'course_files') return formatMessage('Course Images');
57
56
  if (contentType === 'group_files') return formatMessage('Group Images');
58
57
  return formatMessage('User Images');
59
-
60
58
  case 'media':
61
59
  if (contentType === 'course_files') return formatMessage('Course Media');
62
60
  if (contentType === 'group_files') return formatMessage('Group Media');
63
61
  return formatMessage('User Media');
64
-
65
62
  case 'documents':
66
63
  if (contentType === 'course_files') return formatMessage('Course Documents');
67
64
  if (contentType === 'group_files') return formatMessage('Group Documents');
68
65
  return formatMessage('User Documents');
69
-
70
66
  default:
71
67
  return formatMessage('Tray');
72
68
  // Shouldn't ever get here
73
69
  }
74
70
  }
71
+
75
72
  /**
76
73
  * This component is used within various plugins to handle loading in content
77
74
  * from Canvas. It is essentially the main component.
78
75
  */
79
-
80
-
81
76
  export default function CanvasContentTray(props) {
82
77
  // should the tray be rendered open?
83
- const [isOpen, setIsOpen] = useState(false); // has the tray fully opened. we use this to defer rendering the content
78
+ const [isOpen, setIsOpen] = useState(false);
79
+ // has the tray fully opened. we use this to defer rendering the content
84
80
  // until the tray is open.
85
-
86
- const [hasOpened, setHasOpened] = useState(false); // should we close the tray after the user clicks on something in it?
87
-
81
+ const [hasOpened, setHasOpened] = useState(false);
82
+ // should we close the tray after the user clicks on something in it?
88
83
  const [hidingTrayOnAction, setHidingTrayOnAction] = useState(true);
89
84
  const trayRef = useRef(null);
90
85
  const scrollingAreaRef = useRef(null);
@@ -100,20 +95,20 @@ export default function CanvasContentTray(props) {
100
95
  mountNode,
101
96
  onTrayClosing,
102
97
  storeProps
103
- } = { ...props
98
+ } = {
99
+ ...props
104
100
  };
105
101
  const handleDismissTray = useCallback(() => {
106
102
  // return focus to the RCE if focus was on this tray
107
103
  if (trayRef.current && trayRef.current.contains(document.activeElement)) {
108
104
  bridge.focusActiveEditor(false);
109
105
  }
110
-
111
106
  onTrayClosing && onTrayClosing(CanvasContentTray.globalOpenCount); // tell RCEWrapper we're closing if we're open
112
-
113
107
  setIsOpen(false);
114
- }, [bridge, onTrayClosing]); // this shouldn't be necessary, but INSTUI isn't focusing the close button
115
- // like it should.
108
+ }, [bridge, onTrayClosing]);
116
109
 
110
+ // this shouldn't be necessary, but INSTUI isn't focusing the close button
111
+ // like it should.
117
112
  useEffect(() => {
118
113
  if (isOpen && closeButtonRef) {
119
114
  closeButtonRef.focus();
@@ -128,7 +123,6 @@ export default function CanvasContentTray(props) {
128
123
  ++CanvasContentTray.globalOpenCount;
129
124
  setFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
130
125
  setIsOpen(true);
131
-
132
126
  if (plugin === 'course_link_edit') {
133
127
  setIsEditTray(true);
134
128
  const {
@@ -150,18 +144,17 @@ export default function CanvasContentTray(props) {
150
144
  setIsEditTray(false);
151
145
  }
152
146
  },
153
-
154
147
  hideTray(forceClose) {
155
148
  if (forceClose || hidingTrayOnAction) {
156
149
  handleDismissTray();
157
150
  }
158
151
  }
159
-
160
152
  };
161
153
  bridge.attachController(controller, editor.id);
162
154
  return () => {
163
155
  bridge.detachController(editor.id);
164
- }; // it's OK the setFilterSettings is not a dependency
156
+ };
157
+ // it's OK the setFilterSettings is not a dependency
165
158
  // eslint-disable-next-line react-hooks/exhaustive-deps
166
159
  }, [editor.id, bridge, handleDismissTray, hidingTrayOnAction]);
167
160
  useEffect(() => {
@@ -171,19 +164,16 @@ export default function CanvasContentTray(props) {
171
164
  }, [hasOpened]);
172
165
  useEffect(() => {
173
166
  var _trayRef$current;
174
-
175
167
  if (!hasOpened) return;
176
168
  let c = document.querySelector('[role="main"]');
177
169
  let target_w = 0;
178
170
  if (!c) return;
179
171
  const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
180
172
  target_w = c.offsetWidth - ((_trayRef$current = trayRef.current) === null || _trayRef$current === void 0 ? void 0 : _trayRef$current.offsetWidth) + margin;
181
-
182
173
  if (target_w >= 320 && target_w < c.offsetWidth) {
183
174
  c.style.boxSizing = 'border-box';
184
175
  c.style.width = `${target_w}px`;
185
176
  }
186
-
187
177
  setHidingTrayOnAction(target_w < 320);
188
178
  return () => {
189
179
  c = document.querySelector('[role="main"]');
@@ -191,16 +181,13 @@ export default function CanvasContentTray(props) {
191
181
  c.style.width = '';
192
182
  };
193
183
  }, [hasOpened]);
194
-
195
184
  function handleOpenTray() {
196
185
  bridge.focusEditor(editor);
197
186
  setHasOpened(true);
198
187
  }
199
-
200
188
  function handleExitTray() {
201
189
  onTrayClosing && onTrayClosing(true); // tell RCEWrapper we're closing
202
190
  }
203
-
204
191
  function handleCloseTray() {
205
192
  // clear the store's saved search string so the tray doesn't
206
193
  // reopen with a previous tray instance's search results
@@ -208,10 +195,10 @@ export default function CanvasContentTray(props) {
208
195
  setHasOpened(false);
209
196
  onTrayClosing && onTrayClosing(false); // tell RCEWrapper we're closed
210
197
  }
211
-
212
198
  function handleReplaceButton() {
213
199
  handleDismissTray();
214
- const newLink = { ...link,
200
+ const newLink = {
201
+ ...link,
215
202
  forceRename: true,
216
203
  text: linkText
217
204
  };
@@ -222,7 +209,6 @@ export default function CanvasContentTray(props) {
222
209
  srOnly: true
223
210
  });
224
211
  }
225
-
226
212
  function renderFooter() {
227
213
  return /*#__PURE__*/React.createElement(Flex.Item, {
228
214
  background: "secondary",
@@ -239,11 +225,10 @@ export default function CanvasContentTray(props) {
239
225
  "data-testid": "replace-link-button"
240
226
  }, formatMessage('Replace')));
241
227
  }
242
-
243
228
  function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
244
- const newFilterSettings = { ...newFilter
229
+ const newFilterSettings = {
230
+ ...newFilter
245
231
  };
246
-
247
232
  if (newFilterSettings.sortValue) {
248
233
  newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
249
234
  onChangeSortBy({
@@ -251,48 +236,38 @@ export default function CanvasContentTray(props) {
251
236
  dir: newFilterSettings.sortDir
252
237
  });
253
238
  }
254
-
255
239
  if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
256
240
  onChangeSearchString(newFilterSettings.searchString);
257
241
  }
258
-
259
242
  setFilterSettings(newFilterSettings);
260
-
261
243
  if (newFilterSettings.contentType) {
262
244
  let contextType, contextId;
263
-
264
245
  switch (newFilterSettings.contentType) {
265
246
  case 'user_files':
266
247
  contextType = 'user';
267
248
  contextId = props.containingContext.userId;
268
249
  break;
269
-
270
250
  case 'group_files':
271
251
  contextType = 'group';
272
252
  contextId = props.containingContext.contextId;
273
253
  break;
274
-
275
254
  case 'course_files':
276
255
  contextType = props.contextType;
277
256
  contextId = props.containingContext.contextId;
278
257
  break;
279
-
280
258
  case 'links':
281
259
  contextType = props.containingContext.contextType;
282
260
  contextId = props.containingContext.contextId;
283
261
  }
284
-
285
262
  onChangeContext({
286
263
  contextType,
287
264
  contextId
288
265
  });
289
266
  }
290
267
  }
291
-
292
268
  function getHeader() {
293
269
  return isEditTray ? formatMessage('Edit Course Link') : formatMessage('Add');
294
270
  }
295
-
296
271
  function renderLinkDisplay() {
297
272
  return isEditTray && /*#__PURE__*/React.createElement(LinkDisplay, {
298
273
  linkText: linkText,
@@ -303,7 +278,6 @@ export default function CanvasContentTray(props) {
303
278
  linkType: link === null || link === void 0 ? void 0 : link.type
304
279
  });
305
280
  }
306
-
307
281
  return /*#__PURE__*/React.createElement(Tray, {
308
282
  "data-mce-component": true,
309
283
  "data-testid": "CanvasContentTray",
@@ -382,14 +356,13 @@ export default function CanvasContentTray(props) {
382
356
  }, storeProps)))), isEditTray && renderFooter())) : null));
383
357
  }
384
358
  CanvasContentTray.globalOpenCount = 0;
385
-
386
359
  function requiredWithoutSource(props, propName, componentName) {
387
360
  if (props.source == null && props[propName] == null) {
388
361
  throw new Error(`The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`${props[propName]}\`.`);
389
362
  }
390
- } // Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
391
-
363
+ }
392
364
 
365
+ // Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
393
366
  const trayPropsMap = {
394
367
  canUploadFiles: bool.isRequired,
395
368
  contextId: string.isRequired,
@@ -421,10 +394,10 @@ CanvasContentTray.propTypes = {
421
394
  // called with true when the tray starts closing, false once closed
422
395
  onEditClick: func,
423
396
  ...trayPropsMap
424
- }; // the way we define trayProps, eslint doesn't recognize the following as props
397
+ };
425
398
 
399
+ // the way we define trayProps, eslint doesn't recognize the following as props
426
400
  /* eslint-disable react/default-props-match-prop-types */
427
-
428
401
  CanvasContentTray.defaultProps = {
429
402
  canUploadFiles: false,
430
403
  filesTabDisabled: false,
@@ -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
  const checkerboardStyle = squareSize => {
19
20
  return {
20
21
  backgroundImage: `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" fill-opacity=".15"><rect x="200" width="200" height="200"/><rect y="200" width="200" height="200"/></svg>')`,
21
22
  backgroundSize: `${squareSize}px ${squareSize}px`
22
23
  };
23
24
  };
24
-
25
25
  export default checkerboardStyle;
@@ -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 React, { useEffect, useState } from 'react';
19
20
  import { View } from '@instructure/ui-view';
20
21
  import { Flex } from '@instructure/ui-flex';
@@ -85,7 +86,6 @@ const NAMED_COLORS = [{
85
86
  }, null];
86
87
  export const ColorInput = _ref => {
87
88
  var _NAMED_COLORS$find;
88
-
89
89
  let {
90
90
  color,
91
91
  label,
@@ -101,27 +101,25 @@ export const ColorInput = _ref => {
101
101
  const colorName = (_NAMED_COLORS$find = NAMED_COLORS.find(c => (c === null || c === void 0 ? void 0 : c.color) === color)) === null || _NAMED_COLORS$find === void 0 ? void 0 : _NAMED_COLORS$find.name;
102
102
  useEffect(() => {
103
103
  setInputValue(color);
104
- }, [color]); // fire onChange in case value is valid
104
+ }, [color]);
105
105
 
106
+ // fire onChange in case value is valid
106
107
  const handleColorChange = hex => {
107
108
  if (isValidHex(hex)) {
108
109
  onChange(hex);
109
110
  }
110
-
111
111
  if (!hex || !hex.length) {
112
112
  onChange(null);
113
113
  }
114
-
115
114
  setInputValue(hex);
116
- }; // reset the input value on blur if invalid
117
-
115
+ };
118
116
 
117
+ // reset the input value on blur if invalid
119
118
  const handleInputBlur = () => {
120
119
  if (!inputValue || inputValue.length > 0 && !isValidHex(inputValue)) {
121
120
  setInputValue(color);
122
121
  }
123
122
  };
124
-
125
123
  const colorPreviews = NAMED_COLORS.map(c => /*#__PURE__*/React.createElement(ColorPreview, {
126
124
  key: `${name}-${c === null || c === void 0 ? void 0 : c.color}`,
127
125
  color: c === null || c === void 0 ? void 0 : c.color,
@@ -132,7 +130,6 @@ export const ColorInput = _ref => {
132
130
  setIsOpen(false);
133
131
  }
134
132
  }));
135
-
136
133
  function renderPopover() {
137
134
  const pickerLabel = colorName ? formatMessage('Color Picker ({colorName} selected)', {
138
135
  colorName
@@ -167,7 +164,6 @@ export const ColorInput = _ref => {
167
164
  "data-testid": `${name}-popover`
168
165
  }, requireColor ? colorPreviews.slice(0, -1) : colorPreviews));
169
166
  }
170
-
171
167
  return /*#__PURE__*/React.createElement(View, {
172
168
  as: "div"
173
169
  }, /*#__PURE__*/React.createElement(TextInput, {
@@ -190,7 +186,6 @@ export const ColorInput = _ref => {
190
186
  interaction: readonly ? 'readonly' : undefined
191
187
  }));
192
188
  };
193
-
194
189
  function ColorPreview(_ref2) {
195
190
  let {
196
191
  color,
@@ -216,17 +211,13 @@ function ColorPreview(_ref2) {
216
211
  testId: `colorPreview-${color || 'none'}`
217
212
  }));
218
213
  }
219
-
220
214
  function isValidHex(color) {
221
215
  if (!color) return false;
222
-
223
216
  switch (color.length) {
224
217
  case 4:
225
218
  return /^#[0-9A-F]{3}$/i.test(color);
226
-
227
219
  case 7:
228
220
  return /^#[0-9A-F]{6}$/i.test(color);
229
-
230
221
  default:
231
222
  return false;
232
223
  }
@@ -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 React from 'react';
19
20
  import { bool, element, oneOfType, arrayOf } from 'prop-types';
20
21
  import { Tooltip } from '@instructure/ui-tooltip';
@@ -15,13 +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
- import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
19
- import { isOnlyTextSelected } from '../../contentInsertionUtils'; // eslint-disable-next-line import/no-nodejs-modules
20
18
 
21
- import * as url from 'url';
19
+ import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
20
+ import { isOnlyTextSelected } from '../../contentInsertionUtils';
22
21
  import formatMessage from '../../../format-message';
23
22
  import { isStudioEmbeddedMedia } from './StudioLtiSupportUtils';
24
23
  import RCEGlobals from '../../RCEGlobals';
24
+ import { parseUrlPath } from '../../../util/url-util';
25
25
  const FILE_DOWNLOAD_PATH_REGEX = /^\/(courses\/\d+\/)?files\/\d+\/download$/;
26
26
  export const LINK_TYPE = 'link';
27
27
  export const FILE_LINK_TYPE = 'file-link';
@@ -35,37 +35,29 @@ export const DISPLAY_AS_EMBED_DISABLED = 'embed-disabled';
35
35
  export const DISPLAY_AS_DOWNLOAD_LINK = 'download-link';
36
36
  export function asImageEmbed($element) {
37
37
  const nodeName = $element === null || $element === void 0 ? void 0 : $element.nodeName.toLowerCase();
38
-
39
38
  if (nodeName !== 'img') {
40
39
  return null;
41
40
  }
42
-
43
- return { ...fromImageEmbed($element),
41
+ return {
42
+ ...fromImageEmbed($element),
44
43
  $element,
45
44
  type: IMAGE_EMBED_TYPE
46
45
  };
47
46
  }
48
47
  export function asLink($element, editor) {
49
48
  var _$link;
50
-
51
49
  let $link = $element;
52
-
53
50
  if (((_$link = $link) === null || _$link === void 0 ? void 0 : _$link.tagName) !== 'A') {
54
51
  // the user may have selected some text that is w/in a link
55
52
  // but didn't include the <a>. Let's see if that's true
56
- $link = editor.dom.getParent($link, 'a[href]');
53
+ $link = editor && editor.dom.getParent($link, 'a[href]');
57
54
  }
58
-
59
55
  if (!$link || $link.tagName !== 'A' || !$link.href) {
60
56
  return null;
61
57
  }
62
-
63
- const {
64
- pathname
65
- } = url.parse($link.href);
58
+ const pathname = parseUrlPath($link.href);
66
59
  const type = FILE_DOWNLOAD_PATH_REGEX.test(pathname) ? FILE_LINK_TYPE : LINK_TYPE;
67
60
  let displayAs = DISPLAY_AS_LINK;
68
-
69
61
  if ($link.classList.contains('no_preview')) {
70
62
  displayAs = DISPLAY_AS_DOWNLOAD_LINK;
71
63
  } else if ($link.classList.contains('auto_open')) {
@@ -73,7 +65,6 @@ export function asLink($element, editor) {
73
65
  } else if ($link.classList.contains('inline_disabled')) {
74
66
  displayAs = DISPLAY_AS_EMBED_DISABLED;
75
67
  }
76
-
77
68
  const contentType = $link.getAttribute('data-course-type');
78
69
  const fileName = $link.getAttribute('title');
79
70
  const published = $link.getAttribute('data-published') === 'true';
@@ -91,7 +82,9 @@ export function asLink($element, editor) {
91
82
  fileName,
92
83
  published
93
84
  };
94
- } // the video element is a bit tricky.
85
+ }
86
+
87
+ // the video element is a bit tricky.
95
88
  // tinymce won't let me add many attributes to the iframe,
96
89
  // even though I've listed them in tinymce.config.js
97
90
  // extended_valid_elements.
@@ -99,17 +92,14 @@ export function asLink($element, editor) {
99
92
  // and it's attributes, even though this could change with future
100
93
  // tinymce releases.
101
94
  // see https://github.com/tinymce/tinymce/issues/5181
102
-
103
95
  export function asVideoElement($element) {
104
96
  var _$videoElem$parentEle;
105
-
106
97
  const $videoElem = findMediaPlayerIframe($element);
107
-
108
98
  if (!isVideoElement($videoElem) && !isStudioEmbeddedMedia($videoElem)) {
109
99
  return null;
110
100
  }
111
-
112
- return { ...fromVideoEmbed($videoElem),
101
+ return {
102
+ ...fromVideoEmbed($videoElem),
113
103
  $element,
114
104
  type: VIDEO_EMBED_TYPE,
115
105
  id: ((_$videoElem$parentEle = $videoElem.parentElement) === null || _$videoElem$parentEle === void 0 ? void 0 : _$videoElem$parentEle.getAttribute('data-mce-p-data-media-id')) || $videoElem.getAttribute('data-mce-p-data-media-id')
@@ -117,11 +107,9 @@ export function asVideoElement($element) {
117
107
  }
118
108
  export function asAudioElement($element) {
119
109
  var _$element$parentEleme;
120
-
121
110
  if (!$element) {
122
111
  return null;
123
112
  }
124
-
125
113
  const $audioIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
126
114
  const $tinymceIframeShim = $audioIframe.parentElement;
127
115
  const title = ($audioIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
@@ -129,69 +117,55 @@ export function asAudioElement($element) {
129
117
  titleText: title,
130
118
  id: ((_$element$parentEleme = $element.parentElement) === null || _$element$parentEleme === void 0 ? void 0 : _$element$parentEleme.getAttribute('data-mce-p-data-media-id')) || $element.getAttribute('data-mce-p-data-media-id')
131
119
  };
132
-
133
120
  if ($audioIframe.tagName === 'IFRAME') {
134
121
  const audioDoc = $audioIframe.contentDocument;
135
-
136
122
  try {
137
123
  var _audioDoc$querySelect;
138
-
139
124
  const trackSJson = (_audioDoc$querySelect = audioDoc.querySelector('[data-tracks]')) === null || _audioDoc$querySelect === void 0 ? void 0 : _audioDoc$querySelect.getAttribute('data-tracks');
140
-
141
125
  if (trackSJson) {
142
126
  audioOptions.tracks = JSON.parse(trackSJson);
143
- } // eslint-disable-next-line no-empty
144
-
127
+ }
128
+ // eslint-disable-next-line no-empty
145
129
  } catch (e) {}
146
130
  }
147
-
148
131
  if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
149
132
  const source = $audioIframe.getAttribute('src');
150
133
  const matches = source === null || source === void 0 ? void 0 : source.match(/\/media_attachments_iframe\/(\d+)/);
151
-
152
134
  if (matches) {
153
135
  audioOptions.attachmentId = matches[1];
154
136
  }
155
137
  }
156
-
157
138
  return audioOptions;
158
139
  }
159
-
160
140
  function asText($element, editor) {
161
141
  const text = editor && editor.selection.getContent({
162
142
  format: 'text'
163
143
  });
164
-
165
144
  if (!text) {
166
145
  return null;
167
146
  }
168
-
169
147
  return {
170
148
  $element,
171
149
  text,
172
150
  type: TEXT_TYPE
173
151
  };
174
152
  }
175
-
176
153
  function asNone($element) {
177
154
  return {
178
155
  $element: $element || null,
179
156
  type: NONE_TYPE
180
157
  };
181
158
  }
182
-
183
159
  export function getContentFromElement($element, editor) {
184
160
  if (!($element && $element.nodeName)) {
185
161
  return asNone();
186
162
  }
187
-
188
163
  const content = asLink($element, editor) || asImageEmbed($element) || asVideoElement($element) || asText($element, editor) || asNone($element);
189
164
  return content;
190
165
  }
191
166
  export function getContentFromEditor(editor) {
192
167
  let expandSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
193
168
  let $element;
194
-
195
169
  if (editor && editor.selection) {
196
170
  // tinymce selects the element around the cursor, whether it's
197
171
  // content is selected in the copy/paste sense or not.
@@ -201,15 +175,14 @@ export function getContentFromEditor(editor) {
201
175
  $element = editor.selection.getNode();
202
176
  }
203
177
  }
204
-
205
178
  if ($element == null) {
206
179
  return asNone();
207
180
  }
208
-
209
181
  return getContentFromElement($element, editor);
210
- } // if the selection is somewhere w/in a <a>,
211
- // find the <a> and return it's info
182
+ }
212
183
 
184
+ // if the selection is somewhere w/in a <a>,
185
+ // find the <a> and return it's info
213
186
  export function getLinkContentFromEditor(editor) {
214
187
  const $element = editor.selection.getNode();
215
188
  return $element ? asLink($element, editor) : null;
@@ -220,33 +193,25 @@ export function isFileLink($element, editor) {
220
193
  export function isImageEmbed($element) {
221
194
  return !!asImageEmbed($element) && !$element.getAttribute('data-placeholder-for');
222
195
  }
223
-
224
196
  function isMediaElement($element, mediaType) {
225
197
  var _tinymceIframeShim$fi, _tinymceIframeShim$ge;
226
-
227
198
  // the video is hosted in an iframe, but tinymce
228
199
  // wraps it in a span with swizzled attribute names
229
200
  if (!($element !== null && $element !== void 0 && $element.getAttribute) || !$element) {
230
201
  return false;
231
202
  }
232
-
233
203
  const tinymceIframeShim = $element.tagName === 'IFRAME' ? $element.parentElement : $element;
234
-
235
204
  if (((_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
236
205
  return false;
237
206
  }
238
-
239
207
  const media_obj_id = tinymceIframeShim.getAttribute('data-mce-p-data-media-id');
240
208
  const is_media_attachment_iframe = (_tinymceIframeShim$ge = tinymceIframeShim.getAttribute('data-mce-p-src')) === null || _tinymceIframeShim$ge === void 0 ? void 0 : _tinymceIframeShim$ge.includes('media_attachments_iframe');
241
-
242
209
  if (!media_obj_id && !is_media_attachment_iframe) {
243
210
  return false;
244
211
  }
245
-
246
212
  const media_type = tinymceIframeShim.getAttribute('data-mce-p-data-media-type');
247
213
  return media_type === mediaType;
248
214
  }
249
-
250
215
  export function isVideoElement($element) {
251
216
  return isMediaElement($element, 'video');
252
217
  }
@@ -255,27 +220,21 @@ export function isAudioElement($element) {
255
220
  }
256
221
  export function findMediaPlayerIframe(elem) {
257
222
  var _elem$firstElementChi;
258
-
259
223
  if (!elem) return null;
260
-
261
224
  if (elem.tagName === 'IFRAME') {
262
225
  // we have the iframe
263
226
  return elem;
264
227
  }
265
-
266
228
  if (((_elem$firstElementChi = elem.firstElementChild) === null || _elem$firstElementChi === void 0 ? void 0 : _elem$firstElementChi.tagName) === 'IFRAME') {
267
229
  // we have the shim tinymce puts around the iframe
268
230
  return elem.firstElementChild;
269
231
  }
270
-
271
232
  if (elem.classList.contains('mce-shim')) {
272
233
  var _elem$previousSibling;
273
-
274
234
  // tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
275
235
  if (((_elem$previousSibling = elem.previousSibling) === null || _elem$previousSibling === void 0 ? void 0 : _elem$previousSibling.tagName) === 'IFRAME') {
276
236
  return elem.previousSibling;
277
237
  }
278
238
  }
279
-
280
239
  return null;
281
240
  }