@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,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
+
18
19
  import React from 'react';
19
20
  import PropTypes from 'prop-types';
20
21
  import formatMessage from '../../../../format-message';
21
22
  import { SimpleSelect } from '@instructure/ui-simple-select';
22
23
  import { View } from '@instructure/ui-view';
23
24
  import { TextInput } from '@instructure/ui-text-input';
24
-
25
25
  const ShowCreativeCommonsOptions = _ref => {
26
26
  let {
27
27
  ccLicense,
@@ -48,7 +48,6 @@ const ShowCreativeCommonsOptions = _ref => {
48
48
  value: license.id
49
49
  }, license.name))));
50
50
  };
51
-
52
51
  const ShowMessage = () => {
53
52
  return /*#__PURE__*/React.createElement("div", {
54
53
  className: "alert"
@@ -60,7 +59,6 @@ const ShowMessage = () => {
60
59
  }
61
60
  }, formatMessage("If you do not select usage rights now, this file will be unpublished after it's uploaded."))));
62
61
  };
63
-
64
62
  const UsageRightsSelectBox = _ref3 => {
65
63
  let {
66
64
  contextType,
@@ -100,23 +98,19 @@ const UsageRightsSelectBox = _ref3 => {
100
98
  function getUsageRightsOptions() {
101
99
  fetch(apiUrl()).then(res => res.text()).then(res => setLicenseOptions(JSON.parse(res))).catch(() => {});
102
100
  }
103
-
104
101
  function apiUrl() {
105
102
  const context = contextType.replace(/([^s])$/, '$1s'); // pluralize
106
-
107
103
  return `/api/v1/${context}/${contextId}/content_licenses`;
108
104
  }
109
-
110
105
  getUsageRightsOptions();
111
106
  }, [contextType, contextId]);
112
-
113
107
  function handleChange(value) {
114
- setUsageRightsState(state => ({ ...state,
108
+ setUsageRightsState(state => ({
109
+ ...state,
115
110
  usageRight: value
116
111
  }));
117
112
  setShowMessage(showMessageProp && value === 'choose');
118
113
  }
119
-
120
114
  return /*#__PURE__*/React.createElement(View, {
121
115
  as: "div"
122
116
  }, /*#__PURE__*/React.createElement(View, {
@@ -138,7 +132,8 @@ const UsageRightsSelectBox = _ref3 => {
138
132
  value: contentOption.value
139
133
  }, contentOption.display)))), showCreativeCommonsOptions && /*#__PURE__*/React.createElement(ShowCreativeCommonsOptions, {
140
134
  ccLicese: ccLicense,
141
- setCCLicense: license => setUsageRightsState(state => ({ ...state,
135
+ setCCLicense: license => setUsageRightsState(state => ({
136
+ ...state,
142
137
  ccLicense: license
143
138
  })),
144
139
  licenseOptions: licenseOptions
@@ -148,7 +143,8 @@ const UsageRightsSelectBox = _ref3 => {
148
143
  }, /*#__PURE__*/React.createElement(TextInput, {
149
144
  renderLabel: formatMessage('Copyright Holder:'),
150
145
  value: copyrightHolder,
151
- onChange: (e, value) => setUsageRightsState(state => ({ ...state,
146
+ onChange: (e, value) => setUsageRightsState(state => ({
147
+ ...state,
152
148
  copyrightHolder: value
153
149
  })),
154
150
  placeholder: formatMessage('(c) 2001 Acme Inc.')
@@ -157,7 +153,6 @@ const UsageRightsSelectBox = _ref3 => {
157
153
  margin: "medium 0"
158
154
  }, showMessage && /*#__PURE__*/React.createElement(ShowMessage, null)));
159
155
  };
160
-
161
156
  UsageRightsSelectBox.propTypes = {
162
157
  usageRightsState: PropTypes.shape({
163
158
  ccLicense: PropTypes.string,
@@ -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 ReactDOM from 'react-dom';
19
20
  import formatMessage from '../../../../format-message';
20
21
  import React from 'react';
@@ -25,7 +26,8 @@ export default function doFileUpload(ed, document, opts) {
25
26
  accept,
26
27
  panels,
27
28
  preselectedFile
28
- } = { ...opts
29
+ } = {
30
+ ...opts
29
31
  };
30
32
  const title = accept !== null && accept !== void 0 && accept.startsWith('image/') ? formatMessage('Upload Image') : formatMessage('Upload File');
31
33
  let shownResolve;
@@ -34,21 +36,18 @@ export default function doFileUpload(ed, document, opts) {
34
36
  let {
35
37
  UploadFile
36
38
  } = _ref;
37
-
38
39
  const container = document.querySelector('.canvas-rce-upload-container') || (() => {
39
40
  const elem = document.createElement('div');
40
41
  elem.className = 'canvas-rce-upload-container';
41
42
  document.body.appendChild(elem);
42
43
  return elem;
43
44
  })();
44
-
45
45
  return new Promise(resolve => {
46
46
  const handleDismiss = () => {
47
47
  ReactDOM.unmountComponentAtNode(container);
48
48
  ed.focus(false);
49
49
  resolve('dismissed');
50
50
  };
51
-
52
51
  const wrappedSubmit = function () {
53
52
  try {
54
53
  return handleSubmit(...arguments);
@@ -56,8 +55,7 @@ export default function doFileUpload(ed, document, opts) {
56
55
  resolve('submitted');
57
56
  }
58
57
  };
59
-
60
- ReactDOM.render( /*#__PURE__*/React.createElement(UploadFile, {
58
+ ReactDOM.render(/*#__PURE__*/React.createElement(UploadFile, {
61
59
  preselectedFile: preselectedFile,
62
60
  accept: accept,
63
61
  editor: ed,
@@ -15,5 +15,6 @@
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 { UploadFilePanelIds, handleSubmit, UploadFile } from './UploadFile';
19
20
  export { UploadFilePanelIds, handleSubmit, UploadFile };
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2024 - present Instructure, Inc.
5
4
  *
@@ -17,12 +16,12 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import React from 'react';
21
21
  import formatMessage from '../../../../format-message';
22
22
  import { Button, CloseButton } from '@instructure/ui-buttons';
23
23
  import { Heading } from '@instructure/ui-heading';
24
24
  import { Modal } from '@instructure/ui-modal';
25
-
26
25
  const AIResponseModal = _ref => {
27
26
  let {
28
27
  open,
@@ -59,7 +58,6 @@ const AIResponseModal = _ref => {
59
58
  margin: "medium 0 0 medium"
60
59
  }, formatMessage('Insert'))));
61
60
  };
62
-
63
61
  AIResponseModal.propTypes = {
64
62
  open: _pt.bool.isRequired,
65
63
  html: _pt.string.isRequired,
@@ -1,5 +1,4 @@
1
1
  import _pt from "prop-types";
2
-
3
2
  /*
4
3
  * Copyright (C) 2024 - present Instructure, Inc.
5
4
  *
@@ -17,6 +16,7 @@ import _pt from "prop-types";
17
16
  * You should have received a copy of the GNU Affero General Public License along
18
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
19
18
  */
19
+
20
20
  import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
21
21
  import formatMessage from '../../../../format-message';
22
22
  import { Button, CloseButton, CondensedButton, IconButton } from '@instructure/ui-buttons';
@@ -35,9 +35,7 @@ import { showFlashAlert } from '../../../../common/FlashAlert';
35
35
  import doFetchApi from '../do-fetch-api-effect';
36
36
  import { AIWandSVG, AIAvatarSVG, InsertSVG, CopySVG, RefreshSVG, DislikeSVG } from './aiicons';
37
37
  import { AIResponseModal } from './AIResponseModal';
38
-
39
38
  const msgid = () => uid('msg', 3);
40
-
41
39
  const modifyAllTaskMessage = formatMessage('Hello. Please describe the modifications you would like to make to your composition.');
42
40
  const modifySelectionTaskMessage = formatMessage('Hello. Please describe the modifications you would like to make to your selection.');
43
41
  const generateTaskMessage = formatMessage('Please decribe what you would like to compose.');
@@ -62,7 +60,6 @@ export const AIToolsTray = _ref => {
62
60
  transition: container.style.transition
63
61
  };
64
62
  }
65
-
66
63
  return {};
67
64
  });
68
65
  const [isOpen, setIsOpen] = useState(open);
@@ -95,7 +92,6 @@ export const AIToolsTray = _ref => {
95
92
  }, [initChatMessages]);
96
93
  useLayoutEffect(() => {
97
94
  var _chatContainerRef$cur;
98
-
99
95
  const lastbox = (_chatContainerRef$cur = chatContainerRef.current) === null || _chatContainerRef$cur === void 0 ? void 0 : _chatContainerRef$cur.querySelector('.ai-chat-box:last-child');
100
96
  lastbox === null || lastbox === void 0 ? void 0 : lastbox.scrollIntoView({
101
97
  behavior: 'smooth',
@@ -121,7 +117,6 @@ export const AIToolsTray = _ref => {
121
117
  const ed_rect = ed.getBoundingClientRect();
122
118
  const padding = parseInt(edstyle.paddingRight, 10);
123
119
  const tray_left = window.innerWidth - trayRef.offsetWidth;
124
-
125
120
  if (ed_rect.right > tray_left) {
126
121
  ed.style.boxSizing = 'border-box';
127
122
  ed.style.width = `${ed_rect.width - (ed_rect.right - tray_left - padding)}px`;
@@ -135,9 +130,10 @@ export const AIToolsTray = _ref => {
135
130
  }
136
131
  }, [containerStyle, open, trayRef]);
137
132
  const getResponse = useCallback(prompt => {
138
- setWaitingForResponse(true); // the .finally triggered the error even though there is a .catch
139
- // eslint-disable-next-line promise/catch-or-return
133
+ setWaitingForResponse(true);
140
134
 
135
+ // the .finally triggered the error even though there is a .catch
136
+ // eslint-disable-next-line promise/catch-or-return
141
137
  doFetchApi({
142
138
  path: '/api/v1/rich_content/generate',
143
139
  method: 'POST',
@@ -156,7 +152,6 @@ export const AIToolsTray = _ref => {
156
152
  const {
157
153
  json
158
154
  } = result;
159
-
160
155
  if (json.error) {
161
156
  chatMessagesRef.current.push({
162
157
  id: msgid(),
@@ -217,7 +212,6 @@ export const AIToolsTray = _ref => {
217
212
  }, [onInsertContent]);
218
213
  const handleCopyResponse = useCallback(async responseText => {
219
214
  try {
220
- // @ts-expect-error ClipboardItem.supports really does exist
221
215
  if (ClipboardItem.supports('text/html')) {
222
216
  const htmlBlob = new Blob([responseText], {
223
217
  type: 'text/html'
@@ -230,7 +224,6 @@ export const AIToolsTray = _ref => {
230
224
  div.innerHTML = responseText;
231
225
  await navigator.clipboard.writeText(div.textContent || '');
232
226
  }
233
-
234
227
  showFlashAlert({
235
228
  message: formatMessage('Response copied to clipboard'),
236
229
  type: 'success',
@@ -254,7 +247,6 @@ export const AIToolsTray = _ref => {
254
247
  const handleShowWholeResponse = useCallback(event => {
255
248
  const msgId = event.target.dataset.messageId;
256
249
  const message = chatMessagesRef.current.find(msg => msg.id === msgId);
257
-
258
250
  if (message) {
259
251
  setResponseHtml(message.message);
260
252
  }
@@ -270,7 +262,6 @@ export const AIToolsTray = _ref => {
270
262
  onReplaceContent(responseHtml);
271
263
  handleCloseResponseModal();
272
264
  }, [handleCloseResponseModal, onReplaceContent, responseHtml]);
273
-
274
265
  const sharkfin = () => {
275
266
  return /*#__PURE__*/React.createElement("svg", {
276
267
  width: "14",
@@ -288,14 +279,11 @@ export const AIToolsTray = _ref => {
288
279
  strokeWidth: "2"
289
280
  }));
290
281
  };
291
-
292
282
  const renderResponse = msgId => {
293
283
  const message = chatMessagesRef.current.find(msg => msg.id === msgId);
294
-
295
284
  if (!message) {
296
285
  return /*#__PURE__*/React.createElement("span", null, formatMessage("I'm sorry, but I cannot find the AI's answer"));
297
286
  }
298
-
299
287
  const div = document.createElement('div');
300
288
  div.innerHTML = message.message;
301
289
  return /*#__PURE__*/React.createElement("div", {
@@ -313,9 +301,9 @@ export const AIToolsTray = _ref => {
313
301
  onClick: handleShowWholeResponse,
314
302
  "data-message-id": msgId
315
303
  }, formatMessage('Show all'))));
316
- }; // TODO: should the response box get truncated?
317
-
304
+ };
318
305
 
306
+ // TODO: should the response box get truncated?
319
307
  const renderChatBox = (message, key) => {
320
308
  return /*#__PURE__*/React.createElement("div", {
321
309
  id: message.id,
@@ -346,11 +334,9 @@ export const AIToolsTray = _ref => {
346
334
  top: '-18px',
347
335
  // Adjust this value to position the sharkfin
348
336
  left: '40px' // Adjust this value to align the sharkfin horizontally
349
-
350
337
  }
351
338
  }, sharkfin())), message.type === 'response' ?
352
339
  /*#__PURE__*/
353
-
354
340
  /* TODO: why is it to wide w/o maxWidth? */
355
341
  React.createElement("div", {
356
342
  style: {
@@ -394,12 +380,10 @@ export const AIToolsTray = _ref => {
394
380
  size: "x-small"
395
381
  }))) : null);
396
382
  };
397
-
398
383
  const renderChatMessages = () => {
399
384
  const messages = chatMessagesRef.current.map(message => {
400
385
  return renderChatBox(message, message.id);
401
386
  });
402
-
403
387
  if (waitingForResponse) {
404
388
  messages.push(renderChatBox({
405
389
  id: msgid(),
@@ -407,10 +391,8 @@ export const AIToolsTray = _ref => {
407
391
  message: formatMessage('Waiting for response')
408
392
  }, 'ai-waiting-message'));
409
393
  }
410
-
411
394
  return messages;
412
395
  };
413
-
414
396
  return /*#__PURE__*/React.createElement(Tray, {
415
397
  contentRef: el => setTrayRef(el),
416
398
  label: "AIToolsTray",
@@ -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
  // @ts-expect-error
19
20
  import { IconCopyLine, IconRefreshLine } from '@instructure/ui-icons/es/svg';
20
21
  const AIWandSVG = `<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -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
  export * from './aiicons';
19
20
  export * from './AIToolsTray';
20
21
  export * from './AIResponseModal';
@@ -18,14 +18,12 @@
18
18
  import { ICON_MAKER_PARAM } from '../instructure_icon_maker/svg/constants';
19
19
  export default function buildDownloadUrl(url) {
20
20
  let downloadUrl;
21
-
22
21
  try {
23
22
  downloadUrl = new URL(url);
24
23
  } catch (e) {
25
24
  // eslint-disable-next-line no-throw-literal
26
25
  throw `Error parsing ${url}. 'buildDownloadUrl' only supports absolute URLs.`;
27
26
  }
28
-
29
27
  downloadUrl.searchParams.append(ICON_MAKER_PARAM, 1);
30
28
  return downloadUrl.toString();
31
29
  }
@@ -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, { Suspense } from 'react';
19
20
  import { Spinner } from '@instructure/ui-spinner';
20
21
  import formatMessage from '../../../format-message';
@@ -27,19 +28,18 @@ const thePanels = {
27
28
  media: /*#__PURE__*/React.lazy(() => import('../instructure_record/MediaPanel')),
28
29
  all: /*#__PURE__*/React.lazy(() => import('./RceFileBrowser')),
29
30
  unknown: /*#__PURE__*/React.lazy(() => import('./UnknownFileTypePanel'))
30
- }; // Returns a Suspense wrapped lazy loaded component
31
- // pulled from useLazy's cache
31
+ };
32
32
 
33
+ // Returns a Suspense wrapped lazy loaded component
34
+ // pulled from useLazy's cache
33
35
  export function DynamicPanel(props) {
34
36
  let key = '';
35
-
36
37
  if (props.contentType === 'links') {
37
38
  key = 'links';
38
39
  } else {
39
40
  key = props.contentSubtype in thePanels ? props.contentSubtype : 'unknown';
40
- } // @ts-expect-error
41
-
42
-
41
+ }
42
+ // @ts-expect-error
43
43
  const Component = thePanels[key];
44
44
  return /*#__PURE__*/React.createElement(Suspense, {
45
45
  fallback: /*#__PURE__*/React.createElement(Spinner, {
@@ -164,14 +164,11 @@ export const FILTER_SETTINGS_BY_PLUGIN = {
164
164
  };
165
165
  export function isLoading(sprops) {
166
166
  var _sprops$collections$a, _sprops$collections$a2, _sprops$collections$d, _sprops$collections$m, _sprops$collections$q, _sprops$collections$w, _sprops$documents$cou, _sprops$documents$use, _sprops$documents$gro, _sprops$media$course, _sprops$media$user, _sprops$media$group, _sprops$all_files;
167
-
168
167
  return ((_sprops$collections$a = sprops.collections.announcements) === null || _sprops$collections$a === void 0 ? void 0 : _sprops$collections$a.isLoading) || ((_sprops$collections$a2 = sprops.collections.assignments) === null || _sprops$collections$a2 === void 0 ? void 0 : _sprops$collections$a2.isLoading) || ((_sprops$collections$d = sprops.collections.discussions) === null || _sprops$collections$d === void 0 ? void 0 : _sprops$collections$d.isLoading) || ((_sprops$collections$m = sprops.collections.modules) === null || _sprops$collections$m === void 0 ? void 0 : _sprops$collections$m.isLoading) || ((_sprops$collections$q = sprops.collections.quizzes) === null || _sprops$collections$q === void 0 ? void 0 : _sprops$collections$q.isLoading) || ((_sprops$collections$w = sprops.collections.wikiPages) === null || _sprops$collections$w === void 0 ? void 0 : _sprops$collections$w.isLoading) || ((_sprops$documents$cou = sprops.documents.course) === null || _sprops$documents$cou === void 0 ? void 0 : _sprops$documents$cou.isLoading) || ((_sprops$documents$use = sprops.documents.user) === null || _sprops$documents$use === void 0 ? void 0 : _sprops$documents$use.isLoading) || ((_sprops$documents$gro = sprops.documents.group) === null || _sprops$documents$gro === void 0 ? void 0 : _sprops$documents$gro.isLoading) || ((_sprops$media$course = sprops.media.course) === null || _sprops$media$course === void 0 ? void 0 : _sprops$media$course.isLoading) || ((_sprops$media$user = sprops.media.user) === null || _sprops$media$user === void 0 ? void 0 : _sprops$media$user.isLoading) || ((_sprops$media$group = sprops.media.group) === null || _sprops$media$group === void 0 ? void 0 : _sprops$media$group.isLoading) || ((_sprops$all_files = sprops.all_files) === null || _sprops$all_files === void 0 ? void 0 : _sprops$all_files.isLoading);
169
168
  }
170
-
171
169
  function renderLoading() {
172
170
  return formatMessage('Loading');
173
171
  }
174
-
175
172
  export const UploadCanvasPanelIds = ['user_documents', 'course_documents', 'group_documents', 'user_images', 'course_images', 'group_images', 'user_media', 'course_media', 'group_media', 'course_links', 'group_links', 'list_icon_maker_icons', 'all'];
176
173
  export const CanvasPanelTitles = {
177
174
  user_documents: formatMessage('User Documents'),
@@ -15,19 +15,16 @@
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 DEFAULT_TARGET_QUALITY = 0.75;
19
20
  export const MAX_IMAGE_SIZE_BYTES = 500 * 1024;
20
-
21
21
  function blobToBase64(blob) {
22
22
  return new Promise(resolve => {
23
23
  const reader = new FileReader();
24
-
25
24
  reader.onloadend = () => resolve(reader.result);
26
-
27
25
  reader.readAsDataURL(blob);
28
26
  });
29
27
  }
30
-
31
28
  function drawImageOnCanvasElement(_ref) {
32
29
  let {
33
30
  image,
@@ -42,7 +39,6 @@ function drawImageOnCanvasElement(_ref) {
42
39
  height
43
40
  } = image;
44
41
  let compressedImageWidth, compressedImageHeight;
45
-
46
42
  if (width > previewWidth || height > previewHeight) {
47
43
  if (width > height) {
48
44
  compressedImageWidth = previewWidth;
@@ -54,7 +50,6 @@ function drawImageOnCanvasElement(_ref) {
54
50
  compressedImageWidth = compressedImageHeight = previewHeight;
55
51
  }
56
52
  }
57
-
58
53
  const canvas = document.createElement('canvas');
59
54
  canvas.width = compressedImageWidth;
60
55
  canvas.height = compressedImageHeight;
@@ -62,7 +57,6 @@ function drawImageOnCanvasElement(_ref) {
62
57
  ctx.drawImage(image, 0, 0, compressedImageWidth, compressedImageHeight);
63
58
  canvas.toBlob(blob => blob ? resolve(blob) : reject(blob), 'image/jpeg', quality);
64
59
  }
65
-
66
60
  export function canCompressImage() {
67
61
  // Some old browsers don't support toBlob
68
62
  return Boolean(document.createElement('canvas').toBlob);
@@ -83,7 +77,6 @@ export function compressImage(_ref3) {
83
77
  return new Promise((resolve, reject) => {
84
78
  const image = new Image();
85
79
  image.src = encodedImage;
86
-
87
80
  image.onload = function () {
88
81
  drawImageOnCanvasElement({
89
82
  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 moment from 'moment-timezone';
19
20
  export const applyTimezoneOffsetToDate = (date, targetTimezone) => {
20
21
  if (!targetTimezone) {
21
22
  return moment(date).toDate();
22
23
  }
23
-
24
24
  const currentTimezoneOffset = moment(date).utcOffset();
25
25
  const expectedTimezoneOffset = moment.tz(date, targetTimezone).utcOffset();
26
26
  const totalOffset = expectedTimezoneOffset - currentTimezoneOffset;
@@ -15,12 +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 getCookie from './get-cookie';
19
- const csrfToken = getCookie('_csrf_token'); // these are duplicated in application_helper.rb#prefetch_xhr
20
+ const csrfToken = getCookie('_csrf_token');
21
+
22
+ // these are duplicated in application_helper.rb#prefetch_xhr
20
23
  // because we don't have a good pattern for sharing them yet.
21
24
  // If you change these defaults, you should probably cascade that change
22
25
  // to that ruby location
23
-
24
26
  export const defaultFetchOptions = () => ({
25
27
  credentials: 'same-origin',
26
28
  headers: {
@@ -1,5 +1,3 @@
1
- // @ts-nocheck
2
-
3
1
  /*
4
2
  * Copyright (C) 2019 - present Instructure, Inc.
5
3
  *
@@ -17,10 +15,11 @@
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
+
19
+ // @ts-expect-error
20
20
  import parseLinkHeader from './parse-link-header';
21
21
  import { defaultFetchOptions } from './defaultFetchOptions';
22
22
  import { toQueryString } from './query-string-encoding';
23
-
24
23
  function constructRelativeUrl(_ref) {
25
24
  let {
26
25
  path,
@@ -29,8 +28,9 @@ function constructRelativeUrl(_ref) {
29
28
  const queryString = toQueryString(params);
30
29
  if (queryString.length === 0) return path;
31
30
  return path + '?' + queryString;
32
- } // https://fetch.spec.whatwg.org/#requestinit
31
+ }
33
32
 
33
+ // https://fetch.spec.whatwg.org/#requestinit
34
34
 
35
35
  // NOTE: we do NOT deep-merge customFetchOptions.headers, they should be passed
36
36
  // in the headers arg instead.
@@ -43,14 +43,13 @@ export default async function doFetchApi(_ref2) {
43
43
  body,
44
44
  fetchOpts = {}
45
45
  } = _ref2;
46
- const finalFetchOptions = { ...defaultFetchOptions()
46
+ const finalFetchOptions = {
47
+ ...defaultFetchOptions()
47
48
  };
48
-
49
49
  if (body && typeof body !== 'string') {
50
50
  body = JSON.stringify(body);
51
51
  finalFetchOptions.headers['Content-Type'] = 'application/json';
52
52
  }
53
-
54
53
  Object.assign(finalFetchOptions.headers, headers);
55
54
  Object.assign(finalFetchOptions, fetchOpts);
56
55
  const url = constructRelativeUrl({
@@ -61,18 +60,16 @@ export default async function doFetchApi(_ref2) {
61
60
  body,
62
61
  method,
63
62
  ...finalFetchOptions,
63
+ // eslint-disable-next-line no-undef
64
64
  credentials: finalFetchOptions.credentials
65
65
  });
66
-
67
66
  if (!response.ok) {
68
67
  const err = new Error(`doFetchApi received a bad response: ${response.status} ${response.statusText}`);
69
68
  Object.assign(err, {
70
69
  response
71
70
  }); // in case anyone wants to check it for something
72
-
73
71
  throw err;
74
72
  }
75
-
76
73
  const linkHeader = response.headers.get('Link');
77
74
  const link = linkHeader && parseLinkHeader(linkHeader) || undefined;
78
75
  const text = await response.text();
@@ -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 doFetchApi from './doFetchApi';
19
20
  export * from './get-cookie';
20
21
  export * from './parse-link-header';
@@ -15,29 +15,26 @@
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
  // based on https://github.com/thlorenz/parse-link-header/blob/master/index.js (MIT)
20
+
19
21
  function parseQueryParams(linkUrl) {
20
22
  const queryParams = {};
21
23
  const urlParts = linkUrl.split('?');
22
-
23
24
  if (urlParts.length > 1) {
24
25
  urlParts[1].split('&').forEach(param => {
25
26
  const [key, value] = param.split('=');
26
27
  queryParams[key] = decodeURIComponent(value);
27
28
  });
28
29
  }
29
-
30
30
  return queryParams;
31
31
  }
32
-
33
32
  function parseLink(link) {
34
33
  try {
35
34
  const linkMatch = link.match(/<([^>]*)>\s*(.*)/);
36
-
37
35
  if (!linkMatch) {
38
36
  return null;
39
37
  }
40
-
41
38
  const [, linkUrl, partsString] = linkMatch;
42
39
  const parts = partsString.split(';').map(part => part.trim());
43
40
  const info = {
@@ -45,46 +42,40 @@ function parseLink(link) {
45
42
  };
46
43
  parts.forEach(part => {
47
44
  const partMatch = part.match(/(.+)\s*=\s*"?([^"]+)"?/);
48
-
49
45
  if (partMatch) {
50
46
  const [, key, value] = partMatch;
51
47
  info[key.trim()] = value.trim();
52
48
  }
53
49
  });
54
- return { ...parseQueryParams(linkUrl),
50
+ return {
51
+ ...parseQueryParams(linkUrl),
55
52
  ...info
56
53
  };
57
54
  } catch (e) {
58
55
  return null;
59
56
  }
60
57
  }
61
-
62
58
  function hasRel(x) {
63
59
  return x !== null && 'rel' in x;
64
60
  }
65
-
66
61
  function intoRels(acc, x) {
67
62
  x.rel.split(/\s+/).forEach(rel => {
68
- const { ...rest
63
+ const {
64
+ ...rest
69
65
  } = x;
70
-
71
66
  switch (rel) {
72
67
  case 'first':
73
68
  acc.first = rest;
74
69
  break;
75
-
76
70
  case 'prev':
77
71
  acc.prev = rest;
78
72
  break;
79
-
80
73
  case 'current':
81
74
  acc.current = rest;
82
75
  break;
83
-
84
76
  case 'next':
85
77
  acc.next = rest;
86
78
  break;
87
-
88
79
  case 'last':
89
80
  acc.last = rest;
90
81
  break;
@@ -92,13 +83,10 @@ function intoRels(acc, x) {
92
83
  });
93
84
  return acc;
94
85
  }
95
-
96
86
  const PARSE_LINK_HEADER_MAXLEN = 2000;
97
87
  const PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED = process.env.PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED != null;
98
-
99
88
  function checkHeader(linkHeader) {
100
89
  if (!linkHeader) return false;
101
-
102
90
  if (linkHeader.length > PARSE_LINK_HEADER_MAXLEN) {
103
91
  if (PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED) {
104
92
  throw new Error(`Input string too long, it should be under ${PARSE_LINK_HEADER_MAXLEN} characters.`);
@@ -106,10 +94,8 @@ function checkHeader(linkHeader) {
106
94
  return false;
107
95
  }
108
96
  }
109
-
110
97
  return true;
111
98
  }
112
-
113
99
  export default function parseLinkHeader(linkHeader) {
114
100
  if (!checkHeader(linkHeader)) return null;
115
101
  return linkHeader.split(/,\s*(?=<)/).map(parseLink).filter(hasRel).reduce(intoRels, {});