@instructure/canvas-rce 5.14.0 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/DEVELOPMENT.md +1 -1
- 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/__tests__/sidebar/reducers/all_files.test.js +28 -0
- package/babel.config.js +3 -1
- package/build.sh +7 -7
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- 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 +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +25 -38
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -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 +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- 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 +3 -18
- 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 +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- 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 +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -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 +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- 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 +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- 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 +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- 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 +1 -3
- 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 +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- 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 +1 -1
- 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 +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- 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 +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- 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 +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- 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 +2 -10
- 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 +19 -4
- 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 +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- 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 +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- 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 +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- 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 +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- 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 +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- 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 +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- 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 +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- 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 +7 -10
- 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 +32 -42
- 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 +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- 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 +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- 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 +1 -5
- 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 +1 -4
- 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 +1 -6
- 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 +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -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 +8 -10
- 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 +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- 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 +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- 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 +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- 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 +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- 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 +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- 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/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- 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 +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +77 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/publish_to_npm.sh +1 -1
- 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 +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/common/components/FileTree/File.js +0 -64
- package/es/common/components/FileTree/Folder.js +0 -110
- package/es/common/components/FileTree/index.js +0 -84
- package/es/common/components/FileTree/styles.js +0 -72
- package/es/common/components/Loading.js +0 -83
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2020 - 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 {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/build.sh
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
export COMPOSE_FILE=./docker-compose.yml
|
|
3
3
|
|
|
4
|
-
docker
|
|
5
|
-
docker
|
|
4
|
+
docker compose build
|
|
5
|
+
docker compose up -d
|
|
6
6
|
|
|
7
7
|
# run unit tests
|
|
8
|
-
docker
|
|
8
|
+
docker compose exec -T module npm run test-cov
|
|
9
9
|
unit_status=$?
|
|
10
|
-
docker cp $(docker
|
|
10
|
+
docker cp $(docker compose ps -q module):/usr/src/app/coverage coverage
|
|
11
11
|
|
|
12
12
|
# check code formatting
|
|
13
|
-
docker
|
|
13
|
+
docker compose exec -T module npm run fmt:check
|
|
14
14
|
fmt_status=$?
|
|
15
15
|
|
|
16
16
|
# lint all the things
|
|
17
|
-
docker
|
|
17
|
+
docker compose exec -T module npm run lint
|
|
18
18
|
lint_status=$?
|
|
19
19
|
|
|
20
|
-
docker
|
|
20
|
+
docker compose stop
|
|
21
21
|
|
|
22
22
|
# jenkins uses the exit code to decide whether you passed or not
|
|
23
23
|
((unit_status)) && exit $unit_status
|
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
|
-
/* eslint no-console: 0 */
|
|
21
21
|
|
|
22
|
+
/* eslint no-console: 0 */
|
|
22
23
|
export default class Bridge {
|
|
23
24
|
constructor() {
|
|
24
25
|
this.insertLink = link => {
|
|
25
26
|
if (this.focusedEditor) {
|
|
26
27
|
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.controller(this.focusedEditor.id)) === null || _this$controller === void 0 ? void 0 : _this$controller.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,32 @@ 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
80
|
var _this$controller2;
|
|
91
|
-
|
|
92
81
|
this.focusedEditor.insertVideo(video);
|
|
93
82
|
(_this$controller2 = this.controller(this.focusedEditor.id)) === null || _this$controller2 === void 0 ? void 0 : _this$controller2.hideTray();
|
|
94
83
|
}
|
|
95
84
|
};
|
|
96
|
-
|
|
97
85
|
this.insertAudio = audio => {
|
|
98
86
|
if (this.focusedEditor) {
|
|
99
87
|
var _this$controller3;
|
|
100
|
-
|
|
101
88
|
this.focusedEditor.insertAudio(audio);
|
|
102
89
|
(_this$controller3 = this.controller(this.focusedEditor.id)) === null || _this$controller3 === void 0 ? void 0 : _this$controller3.hideTray();
|
|
103
90
|
}
|
|
104
91
|
};
|
|
105
|
-
|
|
106
92
|
this.focusedEditor = null; // the RCEWrapper, not tinymce
|
|
107
|
-
|
|
108
93
|
this.resolveEditorRendered = null;
|
|
109
94
|
this._editorRendered = new Promise(resolve => {
|
|
110
95
|
this.resolveEditorRendered = resolve;
|
|
@@ -115,146 +100,116 @@ export default class Bridge {
|
|
|
115
100
|
this._uploadMediaTranslations = null;
|
|
116
101
|
this._canvasOrigin = '';
|
|
117
102
|
}
|
|
118
|
-
|
|
119
103
|
get editorRendered() {
|
|
120
104
|
return this._editorRendered;
|
|
121
105
|
}
|
|
122
|
-
|
|
123
106
|
controller(editorId) {
|
|
124
107
|
return this._controller[editorId];
|
|
125
108
|
}
|
|
126
|
-
|
|
127
109
|
activeEditor() {
|
|
128
110
|
return this.focusedEditor;
|
|
129
111
|
}
|
|
130
|
-
|
|
131
112
|
focusEditor(editor) {
|
|
132
113
|
if (this.focusedEditor !== editor) {
|
|
133
114
|
this.hideTrays();
|
|
134
115
|
}
|
|
135
|
-
|
|
136
116
|
this.focusedEditor = editor;
|
|
137
117
|
}
|
|
138
|
-
|
|
139
118
|
blurEditor(editor) {
|
|
140
119
|
if (this.focusedEditor === editor) {
|
|
141
120
|
this.hideTrays();
|
|
142
121
|
this.focusedEditor = null;
|
|
143
122
|
}
|
|
144
123
|
}
|
|
145
|
-
|
|
146
124
|
focusActiveEditor() {
|
|
147
125
|
var _this$focusedEditor, _this$focusedEditor$m, _this$focusedEditor$m2;
|
|
148
|
-
|
|
149
126
|
let skipFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
150
127
|
(_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);
|
|
151
128
|
}
|
|
152
|
-
|
|
153
129
|
get mediaServerSession() {
|
|
154
130
|
return this._mediaServerSession;
|
|
155
131
|
}
|
|
156
|
-
|
|
157
132
|
get mediaServerUploader() {
|
|
158
133
|
return this._mediaServerUploader;
|
|
159
134
|
}
|
|
160
|
-
|
|
161
135
|
setMediaServerSession(session) {
|
|
162
136
|
this._mediaServerSession = session;
|
|
163
|
-
|
|
164
137
|
if (this._mediaServerUploader) {
|
|
165
138
|
this._mediaServerUploader.destroy();
|
|
166
|
-
|
|
167
139
|
this._mediaServerUploader = null;
|
|
168
140
|
}
|
|
169
|
-
|
|
170
141
|
this._mediaServerUploader = new K5Uploader(session);
|
|
171
142
|
}
|
|
172
|
-
|
|
173
143
|
get canvasOrigin() {
|
|
174
144
|
return this._canvasOrigin;
|
|
175
145
|
}
|
|
176
|
-
|
|
177
146
|
set canvasOrigin(origin) {
|
|
178
147
|
this._canvasOrigin = origin;
|
|
179
|
-
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// we have to defer importing mediaTranslations until they are asked for
|
|
180
151
|
// or they get imported before the locale has been setup and all the strings
|
|
181
152
|
// are in English
|
|
182
|
-
|
|
183
|
-
|
|
184
153
|
get uploadMediaTranslations() {
|
|
185
154
|
if (!this._uploadMediaTranslations) {
|
|
186
155
|
const module = require('../rce/plugins/instructure_record/mediaTranslations');
|
|
187
|
-
|
|
188
156
|
this._uploadMediaTranslations = module.default;
|
|
189
157
|
}
|
|
190
|
-
|
|
191
158
|
return this._uploadMediaTranslations;
|
|
192
159
|
}
|
|
193
|
-
|
|
194
160
|
detachEditor(editor) {
|
|
195
161
|
if (editor === this.focusedEditor) {
|
|
196
162
|
this.focusedEditor = null;
|
|
197
163
|
}
|
|
198
164
|
}
|
|
199
|
-
|
|
200
165
|
getEditor() {
|
|
201
166
|
return this.focusedEditor;
|
|
202
167
|
}
|
|
203
|
-
|
|
204
168
|
renderEditor(editor) {
|
|
205
169
|
this.resolveEditorRendered();
|
|
206
|
-
|
|
207
170
|
if (this.focusedEditor === null) {
|
|
208
171
|
this.focusEditor(editor);
|
|
209
172
|
}
|
|
210
173
|
}
|
|
211
|
-
|
|
212
174
|
attachController(controller, editorId) {
|
|
213
175
|
this._controller[editorId] = controller;
|
|
214
176
|
}
|
|
215
|
-
|
|
216
177
|
detachController(editorId) {
|
|
217
178
|
delete this._controller[editorId];
|
|
218
179
|
}
|
|
219
|
-
|
|
220
180
|
showTrayForPlugin(plugin, editorId) {
|
|
221
181
|
var _this$_controller$edi;
|
|
222
|
-
|
|
223
182
|
(_this$_controller$edi = this._controller[editorId]) === null || _this$_controller$edi === void 0 ? void 0 : _this$_controller$edi.showTrayForPlugin(plugin);
|
|
224
183
|
}
|
|
225
|
-
|
|
226
184
|
hideTrays() {
|
|
227
185
|
Object.keys(this._controller).forEach(eid => {
|
|
228
186
|
this._controller[eid].hideTray(true);
|
|
229
187
|
});
|
|
230
188
|
}
|
|
231
|
-
|
|
232
189
|
existingContentToLink() {
|
|
233
190
|
if (this.focusedEditor) {
|
|
234
191
|
return this.focusedEditor.existingContentToLink();
|
|
235
192
|
}
|
|
236
|
-
|
|
237
193
|
return false;
|
|
238
194
|
}
|
|
239
|
-
|
|
240
195
|
existingContentToLinkIsImg() {
|
|
241
196
|
if (this.focusedEditor) {
|
|
242
197
|
return this.focusedEditor.existingContentToLinkIsImg();
|
|
243
198
|
}
|
|
244
|
-
|
|
245
199
|
return false;
|
|
246
200
|
}
|
|
247
201
|
|
|
202
|
+
// insertFileLink is called from the FileBrowser when All files is chosen
|
|
203
|
+
// vs the above insertLink which is called from the other CanvasContentTray panels.
|
|
204
|
+
|
|
248
205
|
insertImage(image) {
|
|
249
206
|
if (this.focusedEditor) {
|
|
250
207
|
var _this$controller4;
|
|
251
|
-
|
|
252
208
|
const result = this.focusedEditor.insertImage(image);
|
|
253
209
|
(_this$controller4 = this.controller(this.focusedEditor.id)) === null || _this$controller4 === void 0 ? void 0 : _this$controller4.hideTray();
|
|
254
210
|
return result;
|
|
255
211
|
}
|
|
256
212
|
}
|
|
257
|
-
|
|
258
213
|
insertImagePlaceholder(fileMetaProps) {
|
|
259
214
|
if (this.focusedEditor) {
|
|
260
215
|
// don't insert a placeholder if the user has selected content, because in some cases the selected
|
|
@@ -264,13 +219,11 @@ export default class Bridge {
|
|
|
264
219
|
}
|
|
265
220
|
}
|
|
266
221
|
}
|
|
267
|
-
|
|
268
222
|
removePlaceholders(name) {
|
|
269
223
|
if (this.focusedEditor) {
|
|
270
224
|
this.focusedEditor.removePlaceholders(name);
|
|
271
225
|
}
|
|
272
226
|
}
|
|
273
|
-
|
|
274
227
|
showError(err) {
|
|
275
228
|
if (this.focusedEditor) {
|
|
276
229
|
this.focusedEditor.addAlert({
|
|
@@ -279,5 +232,4 @@ export default class Bridge {
|
|
|
279
232
|
});
|
|
280
233
|
}
|
|
281
234
|
}
|
|
282
|
-
|
|
283
235
|
}
|