@instructure/canvas-rce 5.14.1 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/DEVELOPMENT.md +2 -2
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +18 -73
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +21 -77
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +15 -39
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +105 -64
  25. package/es/common/incremental-loading/LoadMoreButton.js +4 -4
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +5 -13
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +16 -10
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +24 -35
  36. package/es/enhance-user-content/enhance_user_content.js +32 -67
  37. package/es/enhance-user-content/external_links.js +6 -9
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +22 -50
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +48 -107
  42. package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
  43. package/es/format-message.js +4 -5
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.d.ts +59 -0
  47. package/es/index.js +6 -6
  48. package/es/rce/AlertMessageArea.js +15 -16
  49. package/es/rce/DraggingBlocker.js +4 -2
  50. package/es/rce/KeyboardShortcutModal.js +3 -2
  51. package/es/rce/RCE.js +16 -17
  52. package/es/rce/RCEGlobals.js +12 -10
  53. package/es/rce/RCEVariants.js +29 -14
  54. package/es/rce/RCEWrapper.js +530 -641
  55. package/es/rce/RCEWrapper.utils.js +131 -0
  56. package/es/rce/RCEWrapperProps.js +9 -5
  57. package/es/rce/RceHtmlEditor.js +17 -19
  58. package/es/rce/ResizeHandle.js +4 -10
  59. package/es/rce/RestoreAutoSaveModal.js +1 -2
  60. package/es/rce/ShowOnFocusButton/index.js +2 -8
  61. package/es/rce/StatusBar.js +10 -44
  62. package/es/rce/alertHandler.js +1 -4
  63. package/es/rce/contentInsertion.js +36 -59
  64. package/es/rce/contentInsertionUtils.js +6 -8
  65. package/es/rce/contentRendering.js +13 -17
  66. package/es/rce/customEvents.js +1 -0
  67. package/es/rce/editorLanguage.js +23 -11
  68. package/es/rce/indicatorRegion.js +7 -7
  69. package/es/rce/normalizeLocale.js +5 -3
  70. package/es/rce/normalizeProps.js +7 -5
  71. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  72. package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
  73. package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
  74. package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
  75. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  76. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  78. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  82. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
  83. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
  84. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  85. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  86. package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
  87. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
  92. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
  93. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  94. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
  95. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
  96. package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
  97. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  98. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  99. package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
  100. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  101. package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
  102. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  103. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  104. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
  126. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
  127. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  128. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
  129. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  130. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  131. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  132. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  133. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
  134. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  135. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  136. package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
  137. package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
  138. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  139. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
  140. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
  141. package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
  142. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
  143. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
  144. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  145. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  146. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
  147. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  148. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  149. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
  150. package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
  151. package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
  152. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
  153. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
  154. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  155. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_image/plugin.js +14 -20
  157. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  158. package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
  159. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  160. package/es/rce/plugins/instructure_links/components/Link.js +68 -84
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
  163. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  164. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
  165. package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
  166. package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
  167. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  168. package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
  169. package/es/rce/plugins/instructure_links/plugin.js +23 -49
  170. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  171. package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
  172. package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
  173. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  174. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  175. package/es/rce/plugins/instructure_paste/plugin.js +29 -33
  176. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
  177. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  181. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
  182. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  183. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  184. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  185. package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
  186. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
  187. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  188. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
  189. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  197. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
  199. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
  200. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  201. package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
  202. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
  203. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
  204. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  205. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
  206. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
  207. package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
  208. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  209. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  210. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
  211. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
  212. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
  213. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  214. package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
  215. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  216. package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
  217. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
  218. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  219. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
  220. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
  221. package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
  222. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  223. package/es/rce/plugins/shared/ColorInput.js +27 -39
  224. package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
  225. package/es/rce/plugins/shared/ContentSelection.js +29 -78
  226. package/es/rce/plugins/shared/DimensionUtils.js +3 -12
  227. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  228. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  229. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  230. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  231. package/es/rce/plugins/shared/EventUtils.js +2 -4
  232. package/es/rce/plugins/shared/Filter.js +8 -38
  233. package/es/rce/plugins/shared/FixedContentTray.js +16 -17
  234. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
  235. package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
  236. package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
  237. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  238. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
  239. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
  240. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
  241. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
  242. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
  243. package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
  244. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
  245. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  246. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
  247. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  249. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  250. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  252. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
  253. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
  254. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
  255. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  256. package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
  257. package/es/rce/plugins/shared/LinkDisplay.js +9 -11
  258. package/es/rce/plugins/shared/PreviewIcon.js +9 -15
  259. package/es/rce/plugins/shared/Previewable.js +1 -0
  260. package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
  261. package/es/rce/plugins/shared/StoreContext.js +9 -12
  262. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
  263. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  264. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
  265. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
  266. package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
  267. package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
  268. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  269. package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
  270. package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
  271. package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
  272. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
  273. package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
  274. package/es/rce/plugins/shared/Upload/index.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
  276. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
  277. package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
  278. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  279. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  280. package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
  281. package/es/rce/plugins/shared/compressionUtils.js +18 -28
  282. package/es/rce/plugins/shared/dateUtils.js +1 -1
  283. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  284. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
  285. package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
  286. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  287. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  288. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  289. package/es/rce/plugins/shared/fileShape.js +4 -9
  290. package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
  291. package/es/rce/plugins/shared/fileUtils.js +1 -2
  292. package/es/rce/plugins/shared/linkUtils.js +1 -16
  293. package/es/rce/plugins/shared/round.js +2 -2
  294. package/es/rce/plugins/shared/trayUtils.js +7 -3
  295. package/es/rce/plugins/shared/useDataUrl.js +13 -14
  296. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  297. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
  298. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
  299. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  300. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  301. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  302. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
  303. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  314. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
  315. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  316. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  317. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  320. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
  321. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
  322. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
  323. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  324. package/es/rce/root.js +17 -16
  325. package/es/rce/sanitizePlugins.js +1 -3
  326. package/es/rce/style.js +1 -4
  327. package/es/rce/tinyRCE.js +14 -9
  328. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  329. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  330. package/es/rce/transformContent.js +9 -11
  331. package/es/rce/types.js +1 -0
  332. package/es/rce/userOS.js +1 -1
  333. package/es/rce/wrapInitCb.js +50 -43
  334. package/es/rcs/api.js +100 -171
  335. package/es/rcs/buildError.js +8 -20
  336. package/es/rcs/fake.js +9 -20
  337. package/es/sidebar/actions/all_files.js +2 -0
  338. package/es/sidebar/actions/data.js +4 -7
  339. package/es/sidebar/actions/documents.js +19 -18
  340. package/es/sidebar/actions/files.js +21 -28
  341. package/es/sidebar/actions/filter.js +5 -5
  342. package/es/sidebar/actions/flickr.js +1 -1
  343. package/es/sidebar/actions/images.js +32 -37
  344. package/es/sidebar/actions/links.js +1 -0
  345. package/es/sidebar/actions/media.js +27 -28
  346. package/es/sidebar/actions/session.js +2 -5
  347. package/es/sidebar/actions/ui.js +1 -0
  348. package/es/sidebar/actions/upload.js +38 -74
  349. package/es/sidebar/containers/Sidebar.js +1 -2
  350. package/es/sidebar/containers/sidebarHandlers.js +9 -13
  351. package/es/sidebar/dragHtml.js +11 -5
  352. package/es/sidebar/reducers/all_files.js +5 -6
  353. package/es/sidebar/reducers/collection.js +12 -15
  354. package/es/sidebar/reducers/collections.js +6 -8
  355. package/es/sidebar/reducers/documents.js +7 -16
  356. package/es/sidebar/reducers/files.js +4 -6
  357. package/es/sidebar/reducers/filter.js +8 -23
  358. package/es/sidebar/reducers/flickr.js +10 -12
  359. package/es/sidebar/reducers/folder.js +16 -18
  360. package/es/sidebar/reducers/folders.js +4 -6
  361. package/es/sidebar/reducers/images.js +4 -16
  362. package/es/sidebar/reducers/index.js +3 -1
  363. package/es/sidebar/reducers/media.js +7 -16
  364. package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
  365. package/es/sidebar/reducers/noop.js +2 -2
  366. package/es/sidebar/reducers/rootFolderId.js +2 -5
  367. package/es/sidebar/reducers/session.js +4 -6
  368. package/es/sidebar/reducers/ui.js +6 -25
  369. package/es/sidebar/reducers/upload.js +16 -64
  370. package/es/sidebar/store/configureStore.js +1 -0
  371. package/es/sidebar/store/initialState.js +14 -26
  372. package/es/translations/locales/ab.js +1 -0
  373. package/es/translations/locales/ar.js +72 -8
  374. package/es/translations/locales/ca.js +72 -8
  375. package/es/translations/locales/cs.js +1 -0
  376. package/es/translations/locales/cs_CZ.js +1 -0
  377. package/es/translations/locales/cy.js +72 -8
  378. package/es/translations/locales/da-x-k12.js +72 -8
  379. package/es/translations/locales/da.js +72 -8
  380. package/es/translations/locales/da_DK.js +1 -0
  381. package/es/translations/locales/de.js +72 -8
  382. package/es/translations/locales/el.js +4 -0
  383. package/es/translations/locales/en-AU-x-unimelb.js +72 -8
  384. package/es/translations/locales/en-GB-x-ukhe.js +72 -8
  385. package/es/translations/locales/en.js +72 -8
  386. package/es/translations/locales/en_AU.js +72 -8
  387. package/es/translations/locales/en_CA.js +72 -8
  388. package/es/translations/locales/en_CY.js +72 -8
  389. package/es/translations/locales/en_GB.js +72 -8
  390. package/es/translations/locales/en_NZ.js +1 -0
  391. package/es/translations/locales/en_SE.js +1 -0
  392. package/es/translations/locales/en_US.js +1 -0
  393. package/es/translations/locales/es.js +72 -8
  394. package/es/translations/locales/es_ES.js +72 -8
  395. package/es/translations/locales/es_GT.js +1 -0
  396. package/es/translations/locales/fa_IR.js +7 -0
  397. package/es/translations/locales/fi.js +72 -8
  398. package/es/translations/locales/fr.js +72 -8
  399. package/es/translations/locales/fr_CA.js +73 -9
  400. package/es/translations/locales/ga.js +5 -13
  401. package/es/translations/locales/he.js +7 -0
  402. package/es/translations/locales/hi.js +72 -8
  403. package/es/translations/locales/ht.js +72 -8
  404. package/es/translations/locales/hu.js +7 -6
  405. package/es/translations/locales/hu_HU.js +1 -0
  406. package/es/translations/locales/hy.js +1 -0
  407. package/es/translations/locales/id.js +72 -8
  408. package/es/translations/locales/id_ID.js +1 -0
  409. package/es/translations/locales/is.js +72 -8
  410. package/es/translations/locales/it.js +72 -8
  411. package/es/translations/locales/ja.js +72 -8
  412. package/es/translations/locales/ko.js +1 -0
  413. package/es/translations/locales/ko_KR.js +1 -0
  414. package/es/translations/locales/lt.js +1 -0
  415. package/es/translations/locales/lt_LT.js +1 -0
  416. package/es/translations/locales/mi.js +72 -8
  417. package/es/translations/locales/mn_MN.js +1 -0
  418. package/es/translations/locales/ms.js +72 -8
  419. package/es/translations/locales/nb-x-k12.js +72 -8
  420. package/es/translations/locales/nb.js +72 -8
  421. package/es/translations/locales/nl.js +72 -8
  422. package/es/translations/locales/nl_NL.js +1 -0
  423. package/es/translations/locales/nn.js +7 -6
  424. package/es/translations/locales/pl.js +72 -8
  425. package/es/translations/locales/pt.js +72 -8
  426. package/es/translations/locales/pt_BR.js +72 -8
  427. package/es/translations/locales/ro.js +1 -0
  428. package/es/translations/locales/ru.js +72 -8
  429. package/es/translations/locales/se.js +1 -0
  430. package/es/translations/locales/sl.js +72 -8
  431. package/es/translations/locales/sv-x-k12.js +72 -8
  432. package/es/translations/locales/sv.js +72 -8
  433. package/es/translations/locales/sv_SE.js +1 -0
  434. package/es/translations/locales/tg.js +1 -0
  435. package/es/translations/locales/th.js +72 -8
  436. package/es/translations/locales/th_TH.js +1 -0
  437. package/es/translations/locales/tl_PH.js +1 -0
  438. package/es/translations/locales/tr.js +7 -0
  439. package/es/translations/locales/uk_UA.js +7 -0
  440. package/es/translations/locales/vi.js +72 -8
  441. package/es/translations/locales/vi_VN.js +1 -0
  442. package/es/translations/locales/zh-Hans.js +72 -8
  443. package/es/translations/locales/zh-Hant.js +72 -8
  444. package/es/translations/locales/zh.js +72 -8
  445. package/es/translations/locales/zh_HK.js +72 -8
  446. package/es/translations/locales/zh_TW.Big5.js +1 -0
  447. package/es/translations/locales/zh_TW.js +1 -0
  448. package/es/translations/tinymce/ar_SA.js +1 -0
  449. package/es/translations/tinymce/fi.js +1 -0
  450. package/es/translations/tinymce/ga.js +1 -0
  451. package/es/translations/tinymce/id.js +1 -0
  452. package/es/translations/tinymce/ru.js +1 -0
  453. package/es/translations/tinymce/ru_RU.js +1 -0
  454. package/es/translations/tinymce/sl.js +1 -0
  455. package/es/translations/tinymce/sr.js +1 -0
  456. package/es/translations/tinymce/th.js +1 -0
  457. package/es/translations/tinymce/uk_UA.js +1 -0
  458. package/es/translations/tinymce/vi_VN.js +1 -0
  459. package/es/util/TypedDict.js +4 -2
  460. package/es/util/elem-util.js +1 -1
  461. package/es/util/encrypted-storage.js +3 -13
  462. package/es/util/file-url-util.js +2 -7
  463. package/es/util/fullscreenHelpers.js +9 -9
  464. package/es/util/instui-icon-helper.js +4 -3
  465. package/es/util/loadingPlaceholder.js +39 -41
  466. package/es/util/simpleCache.js +1 -5
  467. package/es/util/string-util.js +1 -1
  468. package/es/util/textarea-editing-util.js +3 -7
  469. package/es/util/tinymce-plugin-util.js +0 -5
  470. package/es/util/url-util.js +20 -29
  471. package/eslint.config.js +250 -0
  472. package/jest.config.js +1 -1
  473. package/locales/en.json +190 -10
  474. package/package.json +78 -82
  475. package/scripts/build-canvas +2 -1
  476. package/scripts/build.js +4 -4
  477. package/scripts/installTranslations.js +7 -8
  478. package/testcafe/RCEWrapper.test.js +0 -1
  479. package/testcafe/StatusBar.test.js +0 -1
  480. package/testcafe/axe.test.js +3 -4
  481. package/testcafe/enhanceUserContent.test.js +0 -1
  482. package/tsconfig.json +21 -16
  483. package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
  484. package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
  485. package/.eslintrc +0 -45
  486. package/.prettierignore +0 -6
  487. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  488. package/es/rce/__mocks__/tinymceReact.js +0 -55
  489. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -15,49 +15,42 @@
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
- const NUMBER_OF_WORDS = 10;
19
18
 
19
+ const NUMBER_OF_WORDS = 10;
20
20
  const countWords = text => {
21
21
  // ignore text before the first whitespace because it is part of the selected text
22
22
  const countText = text.split(/\s+/).slice(1).join(' ');
23
23
  const count = countText.trim().split(/\s+/).length;
24
24
  return count;
25
25
  };
26
-
27
26
  const getAfterText = startingElement => {
28
27
  let text = '';
29
28
  let element = startingElement.nextSibling;
30
-
31
29
  while (element) {
32
30
  text += element.textContent;
33
31
  element = element.nextSibling;
34
32
  }
35
-
36
33
  if (text.includes('.')) {
37
34
  const index = text.indexOf('.');
38
35
  text = text.substring(0, index + 1);
39
36
  }
40
-
41
37
  if (countWords(text) > NUMBER_OF_WORDS) {
42
38
  text = text.split(/\s+/).slice(0, NUMBER_OF_WORDS + 1).join(' ');
43
39
  }
44
-
45
40
  return text;
46
41
  };
47
-
48
42
  const getBeforeText = (startingElement, wordCount) => {
49
43
  let text = '';
50
44
  let element = startingElement.previousSibling;
51
-
52
45
  while (element) {
53
46
  text = element.textContent + text;
54
47
  element = element.previousSibling;
55
48
  }
56
-
57
49
  text = text.split(/\s+/).slice(-wordCount - 1).join(' ');
58
50
  return text;
59
51
  };
60
52
 
53
+ // eslint-disable-next-line no-undef
61
54
  export const getSelectionContext = elements => {
62
55
  const firstSelected = elements[0];
63
56
  const lastSelected = elements[elements.length - 1];
@@ -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
  import tinymce from 'tinymce';
19
20
  import formatMessage from '../../../format-message';
20
21
  import clickCallback from './clickCallback';
21
22
  tinymce.PluginManager.add('instructure_search_and_replace', function (editor) {
22
- var _editor$plugins;
23
-
24
23
  // We use the searchreplace plugins API
25
- if (!((_editor$plugins = editor.plugins) !== null && _editor$plugins !== void 0 && _editor$plugins.searchreplace)) return;
26
-
24
+ if (!editor.plugins?.searchreplace) return;
27
25
  const launchFindModal = ed => () => {
28
26
  clickCallback(ed, document);
29
27
  };
30
-
31
28
  editor.addCommand('launch_instructure_search_and_replace', launchFindModal(editor));
32
29
  editor.ui.registry.addMenuItem('instructure_search_and_replace', {
33
30
  text: formatMessage('Find and Replace'),
@@ -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 tinymce from 'tinymce';
19
20
  import { isStudioEmbeddedMedia, handleBeforeObjectSelected } from '../shared/StudioLtiSupportUtils';
20
21
  import VideoTrayController from '../instructure_record/VideoOptionsTray/TrayController';
@@ -25,7 +26,6 @@ tinymce.PluginManager.add('instructure_studio_media_options', function (ed) {
25
26
  onAction() {
26
27
  studioTrayController.showTrayForEditor(ed);
27
28
  },
28
-
29
29
  text: formatMessage('Studio Media Options'),
30
30
  tooltip: formatMessage('Show Studio media options')
31
31
  });
@@ -15,32 +15,28 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
+
18
19
  import React from 'react';
19
20
  import ReactDOM from 'react-dom';
20
21
  import { generateRows, HEADERS } from './utils/tableContent';
21
22
  const MODAL_ID = 'canvas-rce-wordcount-container';
22
23
  export default function (ed, document, options) {
23
- return import('./components/WordCountModal').then(_ref => {
24
- let {
25
- WordCountModal
26
- } = _ref;
24
+ return import('./components/WordCountModal').then(({
25
+ WordCountModal
26
+ }) => {
27
27
  let container = document.querySelector(`#${MODAL_ID}`);
28
-
29
28
  if (!container) {
30
29
  container = document.createElement('div');
31
30
  container.id = MODAL_ID;
32
31
  document.body.appendChild(container);
33
32
  }
34
-
35
33
  const handleDismiss = () => {
36
34
  if (container) {
37
35
  ReactDOM.unmountComponentAtNode(container);
38
36
  }
39
-
40
37
  ed.focus(options.skipEditorFocus);
41
38
  };
42
-
43
- ReactDOM.render( /*#__PURE__*/React.createElement(WordCountModal, {
39
+ ReactDOM.render(/*#__PURE__*/React.createElement(WordCountModal, {
44
40
  headers: HEADERS,
45
41
  rows: generateRows(ed),
46
42
  onDismiss: handleDismiss
@@ -1,6 +1,4 @@
1
1
  import _pt from "prop-types";
2
- // @ts-nocheck
3
-
4
2
  /*
5
3
  * Copyright (C) 2022 - present Instructure, Inc.
6
4
  *
@@ -18,53 +16,45 @@ import _pt from "prop-types";
18
16
  * You should have received a copy of the GNU Affero General Public License along
19
17
  * with this program. If not, see <http://www.gnu.org/licenses/>.
20
18
  */
19
+
21
20
  import React from 'react';
22
21
  import { Modal } from '@instructure/ui-modal';
23
22
  import { BaseButton, CloseButton } from '@instructure/ui-buttons';
24
23
  import { Heading } from '@instructure/ui-heading';
25
24
  import { Table } from '@instructure/ui-table';
26
25
  import formatMessage from '../../../../format-message';
27
- import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
28
-
26
+ import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
29
27
  const renderBody = (headers, rows) => {
30
28
  return /*#__PURE__*/React.createElement(Table, {
31
29
  caption: formatMessage('Word Count')
32
- }, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, headers.map(_ref => {
33
- let {
34
- id,
35
- getLabel
36
- } = _ref;
37
- return /*#__PURE__*/React.createElement(Table.ColHeader, {
38
- key: id,
39
- id: id
40
- }, getLabel());
41
- }))), /*#__PURE__*/React.createElement(Table.Body, null, rows.map(_ref2 => {
42
- let {
43
- label,
44
- documentCount,
45
- selectionCount
46
- } = _ref2;
47
- return /*#__PURE__*/React.createElement(Table.Row, {
48
- key: label
49
- }, /*#__PURE__*/React.createElement(Table.Cell, {
50
- key: "label"
51
- }, label), /*#__PURE__*/React.createElement(Table.Cell, {
52
- key: "document"
53
- }, documentCount), /*#__PURE__*/React.createElement(Table.Cell, {
54
- key: "selection"
55
- }, selectionCount));
56
- })));
30
+ }, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, headers.map(({
31
+ id,
32
+ getLabel
33
+ }) => /*#__PURE__*/React.createElement(Table.ColHeader, {
34
+ key: id,
35
+ id: id
36
+ }, getLabel())))), /*#__PURE__*/React.createElement(Table.Body, null, rows.map(({
37
+ label,
38
+ documentCount,
39
+ selectionCount
40
+ }) => /*#__PURE__*/React.createElement(Table.Row, {
41
+ key: label
42
+ }, /*#__PURE__*/React.createElement(Table.Cell, {
43
+ key: "label"
44
+ }, label), /*#__PURE__*/React.createElement(Table.Cell, {
45
+ key: "document"
46
+ }, documentCount), /*#__PURE__*/React.createElement(Table.Cell, {
47
+ key: "selection"
48
+ }, selectionCount)))));
57
49
  };
58
-
59
- export const WordCountModal = _ref3 => {
60
- let {
61
- headers,
62
- rows,
63
- onDismiss
64
- } = _ref3;
50
+ export const WordCountModal = ({
51
+ headers,
52
+ rows,
53
+ onDismiss
54
+ }) => {
65
55
  return /*#__PURE__*/React.createElement(Modal, {
66
56
  label: formatMessage('Word Count'),
67
- mountNode: instuiPopupMountNode,
57
+ mountNode: instuiPopupMountNodeFn(),
68
58
  open: true,
69
59
  "data-mce-component": true
70
60
  }, /*#__PURE__*/React.createElement(Modal.Header, null, /*#__PURE__*/React.createElement(CloseButton, {
@@ -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 tinymce from 'tinymce';
19
20
  import formatMessage from '../../../format-message';
20
21
  import clickCallback from './clickCallback';
@@ -15,40 +15,36 @@
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 const IGNORE_WORDCOUNT_ATTRIBUTE = 'data-ignore-wordcount';
19
20
  export const countWords = node => {
20
21
  if (node.getAttribute(IGNORE_WORDCOUNT_ATTRIBUTE) === 'chars-only') return 0;
21
- const textContent = (node === null || node === void 0 ? void 0 : node.innerText) || '';
22
+ const textContent = node?.innerText || '';
22
23
  const trimmedTextContent = textContent.trim();
23
24
  if (trimmedTextContent.length === 0) return 0;
24
25
  return trimmedTextContent.split(/\s+/).length;
25
26
  };
26
27
  export const countCharsNoSpaces = node => {
27
- const textContent = (node === null || node === void 0 ? void 0 : node.innerText) || '';
28
+ const textContent = node?.innerText || '';
28
29
  const matches = textContent.match(/ /g); // a single space
29
-
30
30
  const spaces = matches ? matches.length : 0;
31
31
  return countChars(node) - spaces;
32
32
  };
33
33
  export const countChars = node => {
34
- const textContent = (node === null || node === void 0 ? void 0 : node.innerText) || '';
34
+ const textContent = node?.innerText || '';
35
35
  const iterator = textContent[Symbol.iterator]();
36
36
  let count = 0;
37
-
38
37
  while (!iterator.next().done) {
39
38
  count++;
40
39
  }
41
-
42
40
  return count;
43
41
  };
44
42
  export const callbackForCategory = category => {
45
43
  switch (category) {
46
44
  case 'words':
47
45
  return countWords;
48
-
49
46
  case 'chars-no-spaces':
50
47
  return countCharsNoSpaces;
51
-
52
48
  case 'chars':
53
49
  return countChars;
54
50
  }
@@ -61,14 +57,11 @@ export const countShouldIgnore = (ed, scope, category) => {
61
57
  };
62
58
  export const getTinymceCount = (ed, scope, category) => {
63
59
  const wc = ed.plugins.wordcount[scope];
64
-
65
60
  switch (category) {
66
61
  case 'words':
67
62
  return wc.getWordCount();
68
-
69
63
  case 'chars-no-spaces':
70
64
  return wc.getCharacterCountWithoutSpaces();
71
-
72
65
  case 'chars':
73
66
  return wc.getCharacterCount();
74
67
  }
@@ -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 { countContent } from './countContent';
19
20
  import formatMessage from '../../../../format-message';
20
21
  export const HEADERS = [{
@@ -29,12 +30,9 @@ export const HEADERS = [{
29
30
  }];
30
31
  const ROW_LABELS = [['words', () => formatMessage('Words')], ['chars-no-spaces', () => formatMessage('Characters (no spaces)')], ['chars', () => formatMessage('Characters')]];
31
32
  export const generateRows = ed => {
32
- return ROW_LABELS.map(_ref => {
33
- let [category, getLabel] = _ref;
34
- return {
35
- label: getLabel(),
36
- documentCount: countContent(ed, 'body', category),
37
- selectionCount: countContent(ed, 'selection', category)
38
- };
39
- });
33
+ return ROW_LABELS.map(([category, getLabel]) => ({
34
+ label: getLabel(),
35
+ documentCount: countContent(ed, 'body', category),
36
+ selectionCount: countContent(ed, 'selection', category)
37
+ }));
40
38
  };
@@ -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(() => {
@@ -170,20 +163,16 @@ export default function CanvasContentTray(props) {
170
163
  }
171
164
  }, [hasOpened]);
172
165
  useEffect(() => {
173
- var _trayRef$current;
174
-
175
166
  if (!hasOpened) return;
176
167
  let c = document.querySelector('[role="main"]');
177
168
  let target_w = 0;
178
169
  if (!c) return;
179
170
  const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
180
- target_w = c.offsetWidth - ((_trayRef$current = trayRef.current) === null || _trayRef$current === void 0 ? void 0 : _trayRef$current.offsetWidth) + margin;
181
-
171
+ target_w = c.offsetWidth - trayRef.current?.offsetWidth + margin;
182
172
  if (target_w >= 320 && target_w < c.offsetWidth) {
183
173
  c.style.boxSizing = 'border-box';
184
174
  c.style.width = `${target_w}px`;
185
175
  }
186
-
187
176
  setHidingTrayOnAction(target_w < 320);
188
177
  return () => {
189
178
  c = document.querySelector('[role="main"]');
@@ -191,16 +180,13 @@ export default function CanvasContentTray(props) {
191
180
  c.style.width = '';
192
181
  };
193
182
  }, [hasOpened]);
194
-
195
183
  function handleOpenTray() {
196
184
  bridge.focusEditor(editor);
197
185
  setHasOpened(true);
198
186
  }
199
-
200
187
  function handleExitTray() {
201
188
  onTrayClosing && onTrayClosing(true); // tell RCEWrapper we're closing
202
189
  }
203
-
204
190
  function handleCloseTray() {
205
191
  // clear the store's saved search string so the tray doesn't
206
192
  // reopen with a previous tray instance's search results
@@ -208,10 +194,10 @@ export default function CanvasContentTray(props) {
208
194
  setHasOpened(false);
209
195
  onTrayClosing && onTrayClosing(false); // tell RCEWrapper we're closed
210
196
  }
211
-
212
197
  function handleReplaceButton() {
213
198
  handleDismissTray();
214
- const newLink = { ...link,
199
+ const newLink = {
200
+ ...link,
215
201
  forceRename: true,
216
202
  text: linkText
217
203
  };
@@ -222,7 +208,6 @@ export default function CanvasContentTray(props) {
222
208
  srOnly: true
223
209
  });
224
210
  }
225
-
226
211
  function renderFooter() {
227
212
  return /*#__PURE__*/React.createElement(Flex.Item, {
228
213
  background: "secondary",
@@ -239,11 +224,10 @@ export default function CanvasContentTray(props) {
239
224
  "data-testid": "replace-link-button"
240
225
  }, formatMessage('Replace')));
241
226
  }
242
-
243
227
  function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
244
- const newFilterSettings = { ...newFilter
228
+ const newFilterSettings = {
229
+ ...newFilter
245
230
  };
246
-
247
231
  if (newFilterSettings.sortValue) {
248
232
  newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
249
233
  onChangeSortBy({
@@ -251,59 +235,48 @@ export default function CanvasContentTray(props) {
251
235
  dir: newFilterSettings.sortDir
252
236
  });
253
237
  }
254
-
255
238
  if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
256
239
  onChangeSearchString(newFilterSettings.searchString);
257
240
  }
258
-
259
241
  setFilterSettings(newFilterSettings);
260
-
261
242
  if (newFilterSettings.contentType) {
262
243
  let contextType, contextId;
263
-
264
244
  switch (newFilterSettings.contentType) {
265
245
  case 'user_files':
266
246
  contextType = 'user';
267
247
  contextId = props.containingContext.userId;
268
248
  break;
269
-
270
249
  case 'group_files':
271
250
  contextType = 'group';
272
251
  contextId = props.containingContext.contextId;
273
252
  break;
274
-
275
253
  case 'course_files':
276
254
  contextType = props.contextType;
277
255
  contextId = props.containingContext.contextId;
278
256
  break;
279
-
280
257
  case 'links':
281
258
  contextType = props.containingContext.contextType;
282
259
  contextId = props.containingContext.contextId;
283
260
  }
284
-
285
261
  onChangeContext({
286
262
  contextType,
287
263
  contextId
288
264
  });
289
265
  }
290
266
  }
291
-
292
267
  function getHeader() {
293
268
  return isEditTray ? formatMessage('Edit Course Link') : formatMessage('Add');
294
269
  }
295
-
296
270
  function renderLinkDisplay() {
297
271
  return isEditTray && /*#__PURE__*/React.createElement(LinkDisplay, {
298
272
  linkText: linkText,
299
- placeholderText: (link === null || link === void 0 ? void 0 : link.title) || placeholderText,
300
- linkFileName: (link === null || link === void 0 ? void 0 : link.title) || '',
301
- published: (link === null || link === void 0 ? void 0 : link.published) || false,
273
+ placeholderText: link?.title || placeholderText,
274
+ linkFileName: link?.title || '',
275
+ published: link?.published || false,
302
276
  handleTextChange: setLinkText,
303
- linkType: link === null || link === void 0 ? void 0 : link.type
277
+ linkType: link?.type
304
278
  });
305
279
  }
306
-
307
280
  return /*#__PURE__*/React.createElement(Tray, {
308
281
  "data-mce-component": true,
309
282
  "data-testid": "CanvasContentTray",
@@ -383,13 +356,7 @@ export default function CanvasContentTray(props) {
383
356
  }
384
357
  CanvasContentTray.globalOpenCount = 0;
385
358
 
386
- function requiredWithoutSource(props, propName, componentName) {
387
- if (props.source == null && props[propName] == null) {
388
- throw new Error(`The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`${props[propName]}\`.`);
389
- }
390
- } // Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
391
-
392
-
359
+ // Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
393
360
  const trayPropsMap = {
394
361
  canUploadFiles: bool.isRequired,
395
362
  contextId: string.isRequired,
@@ -402,8 +369,8 @@ const trayPropsMap = {
402
369
  userId: string.isRequired
403
370
  }),
404
371
  filesTabDisabled: bool,
405
- host: requiredWithoutSource,
406
- jwt: requiredWithoutSource,
372
+ host: string,
373
+ jwt: string,
407
374
  refreshToken: func,
408
375
  source: shape({
409
376
  fetchImages: func.isRequired
@@ -421,9 +388,9 @@ CanvasContentTray.propTypes = {
421
388
  // called with true when the tray starts closing, false once closed
422
389
  onEditClick: func,
423
390
  ...trayPropsMap
424
- }; // the way we define trayProps, eslint doesn't recognize the following as props
391
+ };
425
392
 
426
- /* eslint-disable react/default-props-match-prop-types */
393
+ // the way we define trayProps, eslint doesn't recognize the following as props
427
394
 
428
395
  CanvasContentTray.defaultProps = {
429
396
  canUploadFiles: false,
@@ -431,5 +398,4 @@ CanvasContentTray.defaultProps = {
431
398
  refreshToken: null,
432
399
  source: null,
433
400
  themeUrl: null
434
- };
435
- /* eslint-enable react/default-props-match-prop-types */
401
+ };
@@ -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;