@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.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (C)
|
|
2
|
+
* Copyright (C) 2020 - present Instructure, Inc.
|
|
3
3
|
*
|
|
4
4
|
* This file is part of Canvas.
|
|
5
5
|
*
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
import * as actions from '../../../src/sidebar/actions/all_files'
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
}
|
|
20
|
+
describe('all_files actions', () => {
|
|
21
|
+
it('alFilesLoading returns ALL_FILES_LOADING with the new value', () => {
|
|
22
|
+
expect(actions.allFilesLoading(true)).toEqual({
|
|
23
|
+
type: actions.ALL_FILES_LOADING,
|
|
24
|
+
payload: true,
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
})
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2018 - present Instructure, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of Canvas.
|
|
5
|
+
*
|
|
6
|
+
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
+
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
+
* Software Foundation, version 3 of the License.
|
|
9
|
+
*
|
|
10
|
+
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
+
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
+
* details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
+
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
import * as actions from '../../../src/sidebar/actions/data'
|
|
19
|
+
import RceApiSource from '../../../src/rcs/api'
|
|
20
|
+
import {spiedStore} from './utils'
|
|
21
|
+
|
|
22
|
+
describe('Sidebar data actions', () => {
|
|
23
|
+
// collection key to use in testing
|
|
24
|
+
const collectionKey = 'theCollection'
|
|
25
|
+
const searchString = 'search-string'
|
|
26
|
+
const uriFor = () => 'uriFor/bookmark'
|
|
27
|
+
|
|
28
|
+
// trivial "always succeeds" source
|
|
29
|
+
const successPage = {links: 'successLinks', bookmark: 'successBookmark'}
|
|
30
|
+
const successSource = {
|
|
31
|
+
fetchLinks(key) {
|
|
32
|
+
return this.fetchPage(key)
|
|
33
|
+
},
|
|
34
|
+
fetchPage(_uri) {
|
|
35
|
+
return new Promise(resolve => {
|
|
36
|
+
resolve(successPage)
|
|
37
|
+
})
|
|
38
|
+
},
|
|
39
|
+
uriFor,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// trivial "always fails" source
|
|
43
|
+
const brokenError = new Error('broken')
|
|
44
|
+
const brokenSource = {
|
|
45
|
+
fetchLinks(key) {
|
|
46
|
+
return this.fetchPage(key)
|
|
47
|
+
},
|
|
48
|
+
fetchPage(_uri) {
|
|
49
|
+
return new Promise(() => {
|
|
50
|
+
throw brokenError
|
|
51
|
+
})
|
|
52
|
+
},
|
|
53
|
+
uriFor,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// returns a "black hole" source that spies fetchLinks
|
|
57
|
+
function stubbedSource() {
|
|
58
|
+
const source = new RceApiSource()
|
|
59
|
+
jest.spyOn(source, 'fetchPage').mockReturnValue(new Promise(resolve => resolve(successPage)))
|
|
60
|
+
jest.spyOn(source, 'uriFor').mockReturnValue('uriFor/bookmark')
|
|
61
|
+
return source
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// constants for testing that can be overridden in props to storeState (see
|
|
65
|
+
// below)
|
|
66
|
+
const defaultCollection = {
|
|
67
|
+
links: [],
|
|
68
|
+
bookmark: 'bookmark',
|
|
69
|
+
isLoading: false,
|
|
70
|
+
searchString,
|
|
71
|
+
}
|
|
72
|
+
const defaults = {
|
|
73
|
+
jwt: 'theJWT',
|
|
74
|
+
source: successSource,
|
|
75
|
+
searchString,
|
|
76
|
+
collections: {
|
|
77
|
+
[`${collectionKey}`]: defaultCollection,
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// defaults and reshapes the given props into the shape needed by the store
|
|
82
|
+
function setupState(props = {}, collectionProps = {}) {
|
|
83
|
+
const retval = {...defaults, ...props}
|
|
84
|
+
const collection = {...defaultCollection, ...collectionProps}
|
|
85
|
+
retval.collections[collectionKey] = collection
|
|
86
|
+
return retval
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
describe('fetchPage', () => {
|
|
90
|
+
it('uses bookmark from store to call source.fetchPage', () => {
|
|
91
|
+
const source = stubbedSource()
|
|
92
|
+
const state = setupState({source})
|
|
93
|
+
const store = spiedStore(state)
|
|
94
|
+
store.dispatch(actions.fetchPage(collectionKey))
|
|
95
|
+
expect(source.fetchPage).toHaveBeenCalledWith(defaultCollection.bookmark)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('dispatches receivePage with page retrieved from source', async () => {
|
|
99
|
+
const store = spiedStore(setupState())
|
|
100
|
+
await store.dispatch(actions.fetchPage(collectionKey))
|
|
101
|
+
const callArgs = store.spy.mock.lastCall[0]
|
|
102
|
+
expect(callArgs.type).toEqual(actions.RECEIVE_PAGE)
|
|
103
|
+
expect(callArgs.key).toEqual(collectionKey)
|
|
104
|
+
expect(callArgs.links).toEqual(successPage.links)
|
|
105
|
+
expect(callArgs.bookmark).toEqual(successPage.bookmark)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('dispatches failPage on error retrieving page from source', async () => {
|
|
109
|
+
const store = spiedStore(setupState({source: brokenSource}))
|
|
110
|
+
await store.dispatch(actions.fetchPage(collectionKey))
|
|
111
|
+
const callArgs = store.spy.mock.lastCall[0]
|
|
112
|
+
expect(callArgs.type).toEqual(actions.FAIL_PAGE)
|
|
113
|
+
expect(callArgs.key).toEqual(collectionKey)
|
|
114
|
+
expect(callArgs.error).toEqual(brokenError)
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
describe('fetchNextPage', () => {
|
|
119
|
+
it('dispatches requestPage first', () => {
|
|
120
|
+
const store = spiedStore(setupState())
|
|
121
|
+
store.dispatch(actions.fetchNextPage(collectionKey))
|
|
122
|
+
const callArgs = store.spy.mock.calls[0][0]
|
|
123
|
+
expect(callArgs.type).toEqual(actions.REQUEST_PAGE)
|
|
124
|
+
expect(callArgs.key).toEqual(collectionKey)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('fetches next page if collection has bookmark and is not loading', () => {
|
|
128
|
+
const store = spiedStore(setupState())
|
|
129
|
+
store.dispatch(actions.fetchNextPage(collectionKey))
|
|
130
|
+
expect(store.spy).toHaveBeenCalledWith({
|
|
131
|
+
type: actions.REQUEST_PAGE,
|
|
132
|
+
cancel: expect.any(Function),
|
|
133
|
+
key: collectionKey,
|
|
134
|
+
})
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('cancels previous fetch if collection is already loading', () => {
|
|
138
|
+
const cancel = jest.fn()
|
|
139
|
+
const store = spiedStore(setupState({}, {isLoading: true, cancel}))
|
|
140
|
+
store.dispatch(actions.fetchNextPage(collectionKey))
|
|
141
|
+
|
|
142
|
+
expect(cancel).toHaveBeenCalled()
|
|
143
|
+
expect(store.spy).toHaveBeenCalledWith({
|
|
144
|
+
type: actions.REQUEST_PAGE,
|
|
145
|
+
cancel: expect.any(Function),
|
|
146
|
+
key: collectionKey,
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
describe('fetchInitialPage', () => {
|
|
152
|
+
it('fetches initial page if collection is empty, has bookmark, and is not loading', () => {
|
|
153
|
+
const store = spiedStore(setupState())
|
|
154
|
+
store.dispatch(actions.fetchInitialPage(collectionKey))
|
|
155
|
+
expect(store.spy).toHaveBeenCalledWith({
|
|
156
|
+
type: actions.REQUEST_INITIAL_PAGE,
|
|
157
|
+
cancel: expect.any(Function),
|
|
158
|
+
key: collectionKey,
|
|
159
|
+
searchString,
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('skips fetching initial page if collection is not empty', () => {
|
|
164
|
+
const store = spiedStore(setupState({}, {links: [{href: 'link', title: 'A Link'}]}))
|
|
165
|
+
store.dispatch(actions.fetchInitialPage(collectionKey))
|
|
166
|
+
expect(store.spy).not.toHaveBeenCalledWith({
|
|
167
|
+
type: actions.REQUEST_INITIAL_PAGE,
|
|
168
|
+
cancel: expect.any(Function),
|
|
169
|
+
key: collectionKey,
|
|
170
|
+
searchString,
|
|
171
|
+
})
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
it('creates the URL if collection has no bookmark', () => {
|
|
175
|
+
const source = stubbedSource()
|
|
176
|
+
const store = spiedStore(setupState({source}, {bookmark: null}))
|
|
177
|
+
store.dispatch(actions.fetchInitialPage(collectionKey))
|
|
178
|
+
expect(source.fetchPage).toHaveBeenCalledWith('uriFor/bookmark')
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
it('cancels previous fetch if collection is already loading', () => {
|
|
182
|
+
const cancel = jest.fn()
|
|
183
|
+
const store = spiedStore(setupState({}, {isLoading: true, cancel}))
|
|
184
|
+
store.dispatch(actions.fetchInitialPage(collectionKey))
|
|
185
|
+
|
|
186
|
+
expect(cancel).toHaveBeenCalled()
|
|
187
|
+
|
|
188
|
+
expect(store.spy).toHaveBeenCalledWith({
|
|
189
|
+
type: actions.REQUEST_INITIAL_PAGE,
|
|
190
|
+
cancel: expect.any(Function),
|
|
191
|
+
key: collectionKey,
|
|
192
|
+
searchString,
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
})
|
|
196
|
+
})
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2018 - present Instructure, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of Canvas.
|
|
5
|
+
*
|
|
6
|
+
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
+
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
+
* Software Foundation, version 3 of the License.
|
|
9
|
+
*
|
|
10
|
+
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
+
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
+
* details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
+
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import {createStore, applyMiddleware} from 'redux'
|
|
20
|
+
import {thunk} from 'redux-thunk'
|
|
21
|
+
import {batch, batching} from 'redux-batch-middleware'
|
|
22
|
+
|
|
23
|
+
// creates a reducer that just alerts a spy on each action and leaves state
|
|
24
|
+
// alone. the associated spy is hung off the returned reducer
|
|
25
|
+
export function spiedReducer() {
|
|
26
|
+
const spy = jest.fn()
|
|
27
|
+
const reducer = (state = {}, action) => {
|
|
28
|
+
if (!action.type.includes('@@redux/INIT')) {
|
|
29
|
+
spy(action)
|
|
30
|
+
}
|
|
31
|
+
return state
|
|
32
|
+
}
|
|
33
|
+
reducer.spy = spy
|
|
34
|
+
return reducer
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// creates a store with the given state and with a spiedReducer; the spy from
|
|
38
|
+
// the reducer is also hung off the returned store
|
|
39
|
+
export function spiedStore(state) {
|
|
40
|
+
const reducer = spiedReducer()
|
|
41
|
+
const store = createStore(batching(reducer), state, applyMiddleware(thunk, batch))
|
|
42
|
+
store.spy = reducer.spy
|
|
43
|
+
return store
|
|
44
|
+
}
|
package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (C)
|
|
2
|
+
* Copyright (C) 2020 - present Instructure, Inc.
|
|
3
3
|
*
|
|
4
4
|
* This file is part of Canvas.
|
|
5
5
|
*
|
|
@@ -15,6 +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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
|
|
19
|
+
import {allFilesLoading} from '../../../src/sidebar/reducers/all_files'
|
|
20
|
+
import * as actions from '../../../src/sidebar/actions/all_files'
|
|
21
|
+
|
|
22
|
+
describe('all_files reducer', () => {
|
|
23
|
+
it('sets isLoading', () => {
|
|
24
|
+
const state = {isLoading: false}
|
|
25
|
+
const newState = allFilesLoading(state, actions.allFilesLoading(true))
|
|
26
|
+
expect(newState.isLoading).toEqual(true)
|
|
27
|
+
})
|
|
28
|
+
})
|
package/babel.config.js
CHANGED
|
@@ -37,7 +37,6 @@ module.exports = {
|
|
|
37
37
|
},
|
|
38
38
|
|
|
39
39
|
presets: [
|
|
40
|
-
'@babel/preset-typescript',
|
|
41
40
|
[
|
|
42
41
|
'@babel/preset-env',
|
|
43
42
|
{
|
|
@@ -63,6 +62,9 @@ module.exports = {
|
|
|
63
62
|
extractDefaultTranslations: false,
|
|
64
63
|
},
|
|
65
64
|
],
|
|
65
|
+
['@babel/preset-typescript', {
|
|
66
|
+
allowDeclareFields: true
|
|
67
|
+
}],
|
|
66
68
|
],
|
|
67
69
|
|
|
68
70
|
plugins: [
|
package/es/bridge/Bridge.js
CHANGED
|
@@ -15,16 +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 { K5Uploader } from '@instructure/k5uploader';
|
|
19
20
|
import { fileEmbed } from '../common/mimeClass';
|
|
20
|
-
|
|
21
|
+
import mediaTranslations from '../rce/plugins/instructure_record/mediaTranslations';
|
|
21
22
|
|
|
23
|
+
/* eslint no-console: 0 */
|
|
22
24
|
export default class Bridge {
|
|
23
25
|
constructor() {
|
|
24
26
|
this.insertLink = link => {
|
|
25
27
|
if (this.focusedEditor) {
|
|
26
|
-
var _this$controller;
|
|
27
|
-
|
|
28
28
|
const {
|
|
29
29
|
selection
|
|
30
30
|
} = this.focusedEditor.props.tinymce.get(this.focusedEditor.props.textareaId);
|
|
@@ -32,31 +32,25 @@ export default class Bridge {
|
|
|
32
32
|
node: selection.getNode(),
|
|
33
33
|
range: selection.getRng()
|
|
34
34
|
};
|
|
35
|
-
|
|
36
35
|
if (!link.text || link.text.trim().length === 0) {
|
|
37
36
|
link.text = link.title || link.href;
|
|
38
37
|
}
|
|
39
|
-
|
|
40
38
|
this.focusedEditor.insertLink(link);
|
|
41
|
-
|
|
39
|
+
this.controller(this.focusedEditor.id)?.hideTray();
|
|
42
40
|
} else {
|
|
43
41
|
console.warn('clicked sidebar link without a focused editor');
|
|
44
42
|
}
|
|
45
43
|
};
|
|
46
|
-
|
|
47
44
|
this.insertFileLink = link => {
|
|
48
45
|
const embedData = fileEmbed(link);
|
|
49
|
-
|
|
50
46
|
if (embedData.type === 'image') {
|
|
51
47
|
return this.insertImage(link);
|
|
52
48
|
} else if (embedData.type === 'video' || embedData.type === 'audio') {
|
|
53
49
|
link.embedded_iframe_url = link.embedded_iframe_url || link.href;
|
|
54
50
|
return this.embedMedia(link);
|
|
55
51
|
}
|
|
56
|
-
|
|
57
52
|
return this.insertLink(link);
|
|
58
53
|
};
|
|
59
|
-
|
|
60
54
|
this.embedImage = image => {
|
|
61
55
|
if (this.existingContentToLink() && !this.existingContentToLinkIsImg()) {
|
|
62
56
|
this.insertLink({
|
|
@@ -70,41 +64,30 @@ export default class Bridge {
|
|
|
70
64
|
this.insertImage(image);
|
|
71
65
|
}
|
|
72
66
|
};
|
|
73
|
-
|
|
74
67
|
this.embedMedia = media => {
|
|
75
68
|
const embedData = fileEmbed(media);
|
|
76
|
-
|
|
77
69
|
if (embedData.type === 'video') {
|
|
78
70
|
this.insertVideo(media);
|
|
79
71
|
} else {
|
|
80
72
|
this.insertAudio(media);
|
|
81
73
|
}
|
|
82
74
|
};
|
|
83
|
-
|
|
84
75
|
this.insertEmbedCode = embedCode => {
|
|
85
76
|
this.focusedEditor.insertEmbedCode(embedCode);
|
|
86
77
|
};
|
|
87
|
-
|
|
88
78
|
this.insertVideo = video => {
|
|
89
79
|
if (this.focusedEditor) {
|
|
90
|
-
var _this$controller2;
|
|
91
|
-
|
|
92
80
|
this.focusedEditor.insertVideo(video);
|
|
93
|
-
|
|
81
|
+
this.controller(this.focusedEditor.id)?.hideTray();
|
|
94
82
|
}
|
|
95
83
|
};
|
|
96
|
-
|
|
97
84
|
this.insertAudio = audio => {
|
|
98
85
|
if (this.focusedEditor) {
|
|
99
|
-
var _this$controller3;
|
|
100
|
-
|
|
101
86
|
this.focusedEditor.insertAudio(audio);
|
|
102
|
-
|
|
87
|
+
this.controller(this.focusedEditor.id)?.hideTray();
|
|
103
88
|
}
|
|
104
89
|
};
|
|
105
|
-
|
|
106
90
|
this.focusedEditor = null; // the RCEWrapper, not tinymce
|
|
107
|
-
|
|
108
91
|
this.resolveEditorRendered = null;
|
|
109
92
|
this._editorRendered = new Promise(resolve => {
|
|
110
93
|
this.resolveEditorRendered = resolve;
|
|
@@ -115,146 +98,111 @@ export default class Bridge {
|
|
|
115
98
|
this._uploadMediaTranslations = null;
|
|
116
99
|
this._canvasOrigin = '';
|
|
117
100
|
}
|
|
118
|
-
|
|
119
101
|
get editorRendered() {
|
|
120
102
|
return this._editorRendered;
|
|
121
103
|
}
|
|
122
|
-
|
|
123
104
|
controller(editorId) {
|
|
124
105
|
return this._controller[editorId];
|
|
125
106
|
}
|
|
126
|
-
|
|
127
107
|
activeEditor() {
|
|
128
108
|
return this.focusedEditor;
|
|
129
109
|
}
|
|
130
|
-
|
|
131
110
|
focusEditor(editor) {
|
|
132
111
|
if (this.focusedEditor !== editor) {
|
|
133
112
|
this.hideTrays();
|
|
134
113
|
}
|
|
135
|
-
|
|
136
114
|
this.focusedEditor = editor;
|
|
137
115
|
}
|
|
138
|
-
|
|
139
116
|
blurEditor(editor) {
|
|
140
117
|
if (this.focusedEditor === editor) {
|
|
141
118
|
this.hideTrays();
|
|
142
119
|
this.focusedEditor = null;
|
|
143
120
|
}
|
|
144
121
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
var _this$focusedEditor, _this$focusedEditor$m, _this$focusedEditor$m2;
|
|
148
|
-
|
|
149
|
-
let skipFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
150
|
-
(_this$focusedEditor = this.focusedEditor) === null || _this$focusedEditor === void 0 ? void 0 : (_this$focusedEditor$m = _this$focusedEditor.mceInstance) === null || _this$focusedEditor$m === void 0 ? void 0 : (_this$focusedEditor$m2 = _this$focusedEditor$m.call(_this$focusedEditor)) === null || _this$focusedEditor$m2 === void 0 ? void 0 : _this$focusedEditor$m2.focus(skipFocus);
|
|
122
|
+
focusActiveEditor(skipFocus = false) {
|
|
123
|
+
this.focusedEditor?.mceInstance?.()?.focus(skipFocus);
|
|
151
124
|
}
|
|
152
|
-
|
|
153
125
|
get mediaServerSession() {
|
|
154
126
|
return this._mediaServerSession;
|
|
155
127
|
}
|
|
156
|
-
|
|
157
128
|
get mediaServerUploader() {
|
|
158
129
|
return this._mediaServerUploader;
|
|
159
130
|
}
|
|
160
|
-
|
|
161
131
|
setMediaServerSession(session) {
|
|
162
132
|
this._mediaServerSession = session;
|
|
163
|
-
|
|
164
133
|
if (this._mediaServerUploader) {
|
|
165
134
|
this._mediaServerUploader.destroy();
|
|
166
|
-
|
|
167
135
|
this._mediaServerUploader = null;
|
|
168
136
|
}
|
|
169
|
-
|
|
170
137
|
this._mediaServerUploader = new K5Uploader(session);
|
|
171
138
|
}
|
|
172
|
-
|
|
173
139
|
get canvasOrigin() {
|
|
174
140
|
return this._canvasOrigin;
|
|
175
141
|
}
|
|
176
|
-
|
|
177
142
|
set canvasOrigin(origin) {
|
|
178
143
|
this._canvasOrigin = origin;
|
|
179
|
-
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// we have to defer importing mediaTranslations until they are asked for
|
|
180
147
|
// or they get imported before the locale has been setup and all the strings
|
|
181
148
|
// are in English
|
|
182
|
-
|
|
183
|
-
|
|
184
149
|
get uploadMediaTranslations() {
|
|
185
150
|
if (!this._uploadMediaTranslations) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
this._uploadMediaTranslations = module.default;
|
|
151
|
+
this._uploadMediaTranslations = mediaTranslations;
|
|
189
152
|
}
|
|
190
|
-
|
|
191
153
|
return this._uploadMediaTranslations;
|
|
192
154
|
}
|
|
193
|
-
|
|
194
155
|
detachEditor(editor) {
|
|
195
156
|
if (editor === this.focusedEditor) {
|
|
196
157
|
this.focusedEditor = null;
|
|
197
158
|
}
|
|
198
159
|
}
|
|
199
|
-
|
|
200
160
|
getEditor() {
|
|
201
161
|
return this.focusedEditor;
|
|
202
162
|
}
|
|
203
|
-
|
|
204
163
|
renderEditor(editor) {
|
|
205
164
|
this.resolveEditorRendered();
|
|
206
|
-
|
|
207
165
|
if (this.focusedEditor === null) {
|
|
208
166
|
this.focusEditor(editor);
|
|
209
167
|
}
|
|
210
168
|
}
|
|
211
|
-
|
|
212
169
|
attachController(controller, editorId) {
|
|
213
170
|
this._controller[editorId] = controller;
|
|
214
171
|
}
|
|
215
|
-
|
|
216
172
|
detachController(editorId) {
|
|
217
173
|
delete this._controller[editorId];
|
|
218
174
|
}
|
|
219
|
-
|
|
220
175
|
showTrayForPlugin(plugin, editorId) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
(_this$_controller$edi = this._controller[editorId]) === null || _this$_controller$edi === void 0 ? void 0 : _this$_controller$edi.showTrayForPlugin(plugin);
|
|
176
|
+
this._controller[editorId]?.showTrayForPlugin(plugin);
|
|
224
177
|
}
|
|
225
|
-
|
|
226
178
|
hideTrays() {
|
|
227
179
|
Object.keys(this._controller).forEach(eid => {
|
|
228
180
|
this._controller[eid].hideTray(true);
|
|
229
181
|
});
|
|
230
182
|
}
|
|
231
|
-
|
|
232
183
|
existingContentToLink() {
|
|
233
184
|
if (this.focusedEditor) {
|
|
234
185
|
return this.focusedEditor.existingContentToLink();
|
|
235
186
|
}
|
|
236
|
-
|
|
237
187
|
return false;
|
|
238
188
|
}
|
|
239
|
-
|
|
240
189
|
existingContentToLinkIsImg() {
|
|
241
190
|
if (this.focusedEditor) {
|
|
242
191
|
return this.focusedEditor.existingContentToLinkIsImg();
|
|
243
192
|
}
|
|
244
|
-
|
|
245
193
|
return false;
|
|
246
194
|
}
|
|
247
195
|
|
|
196
|
+
// insertFileLink is called from the FileBrowser when All files is chosen
|
|
197
|
+
// vs the above insertLink which is called from the other CanvasContentTray panels.
|
|
198
|
+
|
|
248
199
|
insertImage(image) {
|
|
249
200
|
if (this.focusedEditor) {
|
|
250
|
-
var _this$controller4;
|
|
251
|
-
|
|
252
201
|
const result = this.focusedEditor.insertImage(image);
|
|
253
|
-
|
|
202
|
+
this.controller(this.focusedEditor.id)?.hideTray();
|
|
254
203
|
return result;
|
|
255
204
|
}
|
|
256
205
|
}
|
|
257
|
-
|
|
258
206
|
insertImagePlaceholder(fileMetaProps) {
|
|
259
207
|
if (this.focusedEditor) {
|
|
260
208
|
// don't insert a placeholder if the user has selected content, because in some cases the selected
|
|
@@ -264,13 +212,11 @@ export default class Bridge {
|
|
|
264
212
|
}
|
|
265
213
|
}
|
|
266
214
|
}
|
|
267
|
-
|
|
268
215
|
removePlaceholders(name) {
|
|
269
216
|
if (this.focusedEditor) {
|
|
270
217
|
this.focusedEditor.removePlaceholders(name);
|
|
271
218
|
}
|
|
272
219
|
}
|
|
273
|
-
|
|
274
220
|
showError(err) {
|
|
275
221
|
if (this.focusedEditor) {
|
|
276
222
|
this.focusedEditor.addAlert({
|
|
@@ -279,5 +225,4 @@ export default class Bridge {
|
|
|
279
225
|
});
|
|
280
226
|
}
|
|
281
227
|
}
|
|
282
|
-
|
|
283
228
|
}
|