@instructure/canvas-rce 5.14.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -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/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
- package/babel.config.js +3 -1
- 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 +12 -34
- 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/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
- 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 +22 -49
- 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 +76 -81
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- 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/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/styleMock.js +0 -18
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
package/es/rcs/api.js
CHANGED
|
@@ -15,13 +15,14 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import 'isomorphic-fetch';
|
|
19
|
-
import { parse } from 'url';
|
|
20
20
|
import { saveClosedCaptions, saveClosedCaptionsForAttachment, CONSTANTS } from '@instructure/canvas-media';
|
|
21
21
|
import { downloadToWrap, fixupFileUrl } from '../common/fileUrl';
|
|
22
22
|
import alertHandler from '../rce/alertHandler';
|
|
23
23
|
import buildError from './buildError';
|
|
24
24
|
import RCEGlobals from '../rce/RCEGlobals';
|
|
25
|
+
import { parseUrlPath } from '../util/url-util';
|
|
25
26
|
export function headerFor(jwt) {
|
|
26
27
|
return {
|
|
27
28
|
Authorization: 'Bearer ' + jwt
|
|
@@ -29,23 +30,20 @@ export function headerFor(jwt) {
|
|
|
29
30
|
}
|
|
30
31
|
export function originFromHost(host, windowOverride) {
|
|
31
32
|
let origin = host;
|
|
32
|
-
|
|
33
33
|
if (typeof origin !== 'string') {
|
|
34
34
|
origin = '';
|
|
35
35
|
} else if (origin && origin.substr(0, 4) !== 'http') {
|
|
36
36
|
var _windowHandle$locatio;
|
|
37
|
-
|
|
38
37
|
origin = `//${origin}`;
|
|
39
38
|
const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
|
|
40
|
-
|
|
41
39
|
if (origin.length > 0 && windowHandle !== null && windowHandle !== void 0 && (_windowHandle$locatio = windowHandle.location) !== null && _windowHandle$locatio !== void 0 && _windowHandle$locatio.protocol) {
|
|
42
40
|
origin = `${windowHandle.location.protocol}${origin}`;
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
|
-
|
|
46
43
|
return origin;
|
|
47
|
-
}
|
|
44
|
+
}
|
|
48
45
|
|
|
46
|
+
// filter a response to raise an error on a 400+ status
|
|
49
47
|
function checkStatus(response) {
|
|
50
48
|
if (response.status < 400) {
|
|
51
49
|
return response;
|
|
@@ -55,11 +53,9 @@ function checkStatus(response) {
|
|
|
55
53
|
throw error;
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
|
-
|
|
59
56
|
function defaultRefreshTokenHandler() {
|
|
60
57
|
throw new Error('Token expired, no refresh function provided');
|
|
61
58
|
}
|
|
62
|
-
|
|
63
59
|
function normalizeFileData(file) {
|
|
64
60
|
return {
|
|
65
61
|
// copy the name to the default display name if none provided
|
|
@@ -69,7 +65,6 @@ function normalizeFileData(file) {
|
|
|
69
65
|
href: downloadToWrap(file.href || file.url)
|
|
70
66
|
};
|
|
71
67
|
}
|
|
72
|
-
|
|
73
68
|
function throwConnectionError(error) {
|
|
74
69
|
if (error.name === 'TypeError') {
|
|
75
70
|
// eslint-disable-next-line no-console
|
|
@@ -78,10 +73,8 @@ function throwConnectionError(error) {
|
|
|
78
73
|
Details can be found at https://github.com/instructure/canvas-rce-api
|
|
79
74
|
`);
|
|
80
75
|
}
|
|
81
|
-
|
|
82
76
|
throw error;
|
|
83
77
|
}
|
|
84
|
-
|
|
85
78
|
class RceApiSource {
|
|
86
79
|
constructor() {
|
|
87
80
|
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
@@ -92,7 +85,6 @@ class RceApiSource {
|
|
|
92
85
|
this.alertFunc = options.alertFunc || alertHandler.handleAlert;
|
|
93
86
|
this.canvasOrigin = options.canvasOrigin || window.origin;
|
|
94
87
|
}
|
|
95
|
-
|
|
96
88
|
getSession() {
|
|
97
89
|
const headers = headerFor(this.jwt);
|
|
98
90
|
const uri = this.baseUri('session');
|
|
@@ -100,10 +92,10 @@ class RceApiSource {
|
|
|
100
92
|
this.hasSession = true;
|
|
101
93
|
return data;
|
|
102
94
|
}).catch(throwConnectionError);
|
|
103
|
-
}
|
|
104
|
-
// uri for initial page fetch
|
|
105
|
-
|
|
95
|
+
}
|
|
106
96
|
|
|
97
|
+
// initial state of a collection is empty, not loading, with bookmark set to
|
|
98
|
+
// uri for initial page fetch
|
|
107
99
|
initializeCollection(endpoint, props) {
|
|
108
100
|
return {
|
|
109
101
|
links: [],
|
|
@@ -113,7 +105,6 @@ class RceApiSource {
|
|
|
113
105
|
searchString: props.searchString
|
|
114
106
|
};
|
|
115
107
|
}
|
|
116
|
-
|
|
117
108
|
initializeUpload() {
|
|
118
109
|
return {
|
|
119
110
|
uploading: false,
|
|
@@ -121,11 +112,9 @@ class RceApiSource {
|
|
|
121
112
|
formExpanded: false
|
|
122
113
|
};
|
|
123
114
|
}
|
|
124
|
-
|
|
125
115
|
initializeImages(props) {
|
|
126
116
|
return this.initializeDocuments(props);
|
|
127
117
|
}
|
|
128
|
-
|
|
129
118
|
initializeDocuments(props) {
|
|
130
119
|
return {
|
|
131
120
|
[props.contextType]: {
|
|
@@ -137,28 +126,24 @@ class RceApiSource {
|
|
|
137
126
|
searchString: ''
|
|
138
127
|
};
|
|
139
128
|
}
|
|
140
|
-
|
|
141
129
|
initializeMedia(props) {
|
|
142
130
|
return this.initializeDocuments(props);
|
|
143
131
|
}
|
|
144
|
-
|
|
145
132
|
initializeFlickr() {
|
|
146
133
|
return {
|
|
147
134
|
searchResults: [],
|
|
148
135
|
searching: false,
|
|
149
136
|
formExpanded: false
|
|
150
137
|
};
|
|
151
|
-
}
|
|
152
|
-
|
|
138
|
+
}
|
|
153
139
|
|
|
140
|
+
// fetches the given URI and filters it to either an error or parsed response
|
|
154
141
|
fetchPage(uri) {
|
|
155
142
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
156
143
|
}
|
|
157
|
-
|
|
158
144
|
fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, bookmark) {
|
|
159
145
|
return fetchFunction(properties, bookmark).then(result => {
|
|
160
146
|
onSuccess(result);
|
|
161
|
-
|
|
162
147
|
if (result.bookmark) {
|
|
163
148
|
this.fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, result.bookmark);
|
|
164
149
|
}
|
|
@@ -166,7 +151,6 @@ class RceApiSource {
|
|
|
166
151
|
onError(error);
|
|
167
152
|
});
|
|
168
153
|
}
|
|
169
|
-
|
|
170
154
|
fetchDocs(props) {
|
|
171
155
|
const documents = props.documents[props.contextType];
|
|
172
156
|
const uri = documents.bookmark || this.uriFor('documents', props);
|
|
@@ -181,13 +165,10 @@ class RceApiSource {
|
|
|
181
165
|
};
|
|
182
166
|
});
|
|
183
167
|
}
|
|
184
|
-
|
|
185
168
|
fetchMedia(props) {
|
|
186
169
|
var _RCEGlobals$getFeatur;
|
|
187
|
-
|
|
188
170
|
const media = props.media[props.contextType];
|
|
189
171
|
const uri = media.bookmark || this.uriFor('media', props);
|
|
190
|
-
|
|
191
172
|
if ((_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur !== void 0 && _RCEGlobals$getFeatur.media_links_use_attachment_id) {
|
|
192
173
|
return this.apiFetch(uri, headerFor(this.jwt)).then(_ref2 => {
|
|
193
174
|
let {
|
|
@@ -200,10 +181,8 @@ class RceApiSource {
|
|
|
200
181
|
};
|
|
201
182
|
});
|
|
202
183
|
}
|
|
203
|
-
|
|
204
184
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
205
185
|
}
|
|
206
|
-
|
|
207
186
|
fetchFiles(uri) {
|
|
208
187
|
return this.fetchPage(uri).then(_ref3 => {
|
|
209
188
|
let {
|
|
@@ -216,7 +195,6 @@ class RceApiSource {
|
|
|
216
195
|
};
|
|
217
196
|
});
|
|
218
197
|
}
|
|
219
|
-
|
|
220
198
|
fetchLinks(key, props) {
|
|
221
199
|
const {
|
|
222
200
|
collections
|
|
@@ -224,15 +202,12 @@ class RceApiSource {
|
|
|
224
202
|
const bookmark = collections[key].bookmark || this.uriFor(key, props);
|
|
225
203
|
return this.fetchPage(bookmark);
|
|
226
204
|
}
|
|
227
|
-
|
|
228
205
|
fetchRootFolder(props) {
|
|
229
206
|
return this.fetchPage(this.uriFor('folders', props), this.jwt);
|
|
230
207
|
}
|
|
231
|
-
|
|
232
208
|
mediaServerSession() {
|
|
233
209
|
return this.apiPost(this.baseUri('v1/services/kaltura_session'), headerFor(this.jwt), {});
|
|
234
210
|
}
|
|
235
|
-
|
|
236
211
|
uploadMediaToCanvas(mediaObject) {
|
|
237
212
|
const body = {
|
|
238
213
|
id: mediaObject.entryId,
|
|
@@ -246,10 +221,8 @@ class RceApiSource {
|
|
|
246
221
|
};
|
|
247
222
|
return this.apiPost(this.baseUri('media_objects'), headerFor(this.jwt), body);
|
|
248
223
|
}
|
|
249
|
-
|
|
250
224
|
updateMediaObject(apiProps, _ref4) {
|
|
251
225
|
var _RCEGlobals$getFeatur2;
|
|
252
|
-
|
|
253
226
|
let {
|
|
254
227
|
media_object_id,
|
|
255
228
|
title,
|
|
@@ -257,10 +230,10 @@ class RceApiSource {
|
|
|
257
230
|
} = _ref4;
|
|
258
231
|
const uri = (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.media_links_use_attachment_id && attachment_id ? `${this.baseUri('media_attachments', apiProps.host)}/${attachment_id}?user_entered_title=${encodeURIComponent(title)}` : `${this.baseUri('media_objects', apiProps.host)}/${media_object_id}?user_entered_title=${encodeURIComponent(title)}`;
|
|
259
232
|
return this.apiPost(uri, headerFor(this.jwt), null, 'PUT');
|
|
260
|
-
}
|
|
261
|
-
// receive back a 200 with the new subtitles, or a 4xx error
|
|
262
|
-
|
|
233
|
+
}
|
|
263
234
|
|
|
235
|
+
// PUT to //RCS/api/media_objects/:mediaId/media_tracks [{locale, content}, ...]
|
|
236
|
+
// receive back a 200 with the new subtitles, or a 4xx error
|
|
264
237
|
updateClosedCaptions(apiProps, _ref5) {
|
|
265
238
|
let {
|
|
266
239
|
media_object_id,
|
|
@@ -278,10 +251,10 @@ class RceApiSource {
|
|
|
278
251
|
message: 'failed to save captions'
|
|
279
252
|
}, e));
|
|
280
253
|
});
|
|
281
|
-
}
|
|
282
|
-
// receive back the current list of media_tracks
|
|
283
|
-
|
|
254
|
+
}
|
|
284
255
|
|
|
256
|
+
// GET /media_objects/:mediaId/media_tracks
|
|
257
|
+
// receive back the current list of media_tracks
|
|
285
258
|
fetchClosedCaptions(_mediaId) {
|
|
286
259
|
return Promise.resolve([{
|
|
287
260
|
locale: 'af',
|
|
@@ -290,42 +263,36 @@ class RceApiSource {
|
|
|
290
263
|
locale: 'es',
|
|
291
264
|
content: '1\r\n00:00:00,000 --> 00:00:01,251\r\nThis is the content\r\n'
|
|
292
265
|
}]);
|
|
293
|
-
}
|
|
294
|
-
|
|
266
|
+
}
|
|
295
267
|
|
|
268
|
+
// fetches folders for the given context to upload files to
|
|
296
269
|
fetchFolders(props, bookmark) {
|
|
297
270
|
const headers = headerFor(this.jwt);
|
|
298
271
|
const uri = bookmark || this.uriFor('folders/all', props);
|
|
299
272
|
return this.apiFetch(uri, headers);
|
|
300
|
-
}
|
|
301
|
-
|
|
273
|
+
}
|
|
302
274
|
|
|
275
|
+
// Fetches all files for a given folder
|
|
303
276
|
fetchFilesForFolder(props, bookmark) {
|
|
304
277
|
let uri;
|
|
305
|
-
|
|
306
278
|
if (!bookmark) {
|
|
307
279
|
const perPageQuery = props.perPage ? `per_page=${props.perPage}` : '';
|
|
308
280
|
const searchParam = getSearchParam(props.searchString);
|
|
309
281
|
uri = `${props.filesUrl}`;
|
|
310
282
|
uri += perPageQuery ? `?${perPageQuery}` : '';
|
|
311
|
-
|
|
312
283
|
if (searchParam) {
|
|
313
284
|
uri += perPageQuery ? `${searchParam}` : `?${searchParam}`;
|
|
314
285
|
}
|
|
315
|
-
|
|
316
286
|
if (props.sortBy) {
|
|
317
287
|
uri += `${getSortParams(props.sortBy.sort, props.sortBy.order)}`;
|
|
318
288
|
}
|
|
319
289
|
}
|
|
320
|
-
|
|
321
290
|
return this.fetchPage(uri || bookmark, this.jwt);
|
|
322
291
|
}
|
|
323
|
-
|
|
324
292
|
fetchSubFolders(props, bookmark) {
|
|
325
293
|
const uri = bookmark || `${this.baseUri('folders', props.host)}/${props.folderId}`;
|
|
326
294
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
327
295
|
}
|
|
328
|
-
|
|
329
296
|
fetchIconMakerFolder(_ref6) {
|
|
330
297
|
let {
|
|
331
298
|
contextId,
|
|
@@ -339,23 +306,18 @@ class RceApiSource {
|
|
|
339
306
|
});
|
|
340
307
|
return this.fetchPage(uri);
|
|
341
308
|
}
|
|
342
|
-
|
|
343
309
|
fetchMediaFolder(props) {
|
|
344
310
|
let uri;
|
|
345
|
-
|
|
346
311
|
if (props.contextType === 'user') {
|
|
347
312
|
uri = this.uriFor('folders', props);
|
|
348
313
|
} else {
|
|
349
314
|
uri = this.uriFor('folders/media', props);
|
|
350
315
|
}
|
|
351
|
-
|
|
352
316
|
return this.fetchPage(uri);
|
|
353
317
|
}
|
|
354
|
-
|
|
355
318
|
fetchMediaObjectIframe(mediaObjectId) {
|
|
356
319
|
return this.fetchPage(this.uriFor(`media_objects_iframe/${mediaObjectId}`));
|
|
357
320
|
}
|
|
358
|
-
|
|
359
321
|
fetchImages(props) {
|
|
360
322
|
const images = props.images[props.contextType];
|
|
361
323
|
const uri = images.bookmark || this.uriFor('images', props);
|
|
@@ -372,7 +334,6 @@ class RceApiSource {
|
|
|
372
334
|
};
|
|
373
335
|
});
|
|
374
336
|
}
|
|
375
|
-
|
|
376
337
|
preflightUpload(fileProps, apiProps) {
|
|
377
338
|
const headers = headerFor(this.jwt);
|
|
378
339
|
const uri = this.baseUri('upload', apiProps.host);
|
|
@@ -386,7 +347,6 @@ class RceApiSource {
|
|
|
386
347
|
};
|
|
387
348
|
return this.apiPost(uri, headers, body);
|
|
388
349
|
}
|
|
389
|
-
|
|
390
350
|
uploadFRD(fileDomObject, preflightProps) {
|
|
391
351
|
const data = new window.FormData();
|
|
392
352
|
Object.keys(preflightProps.upload_params).forEach(uploadProp => {
|
|
@@ -397,20 +357,33 @@ class RceApiSource {
|
|
|
397
357
|
method: 'POST',
|
|
398
358
|
body: data
|
|
399
359
|
};
|
|
400
|
-
|
|
401
360
|
if (!preflightProps.upload_params['x-amz-signature'] && !preflightProps.upload_url.includes('files_api')) {
|
|
402
361
|
// _not_ an S3 upload, include the credentials in the upload POST
|
|
403
362
|
// local uploads can include crendentials for same-origin requests
|
|
404
363
|
fetchOptions.credentials = 'include';
|
|
405
364
|
}
|
|
406
|
-
|
|
407
|
-
|
|
365
|
+
return fetch(preflightProps.upload_url, fetchOptions).then(checkStatus).then(res => {
|
|
366
|
+
if (res.headers.get('content-type').includes('application/xml')) {
|
|
367
|
+
if (res.status === 201) {
|
|
368
|
+
return res.text().then(text => {
|
|
369
|
+
const xmldoc = new window.DOMParser().parseFromString(text, 'application/xml');
|
|
370
|
+
const location = xmldoc.querySelector('Location').textContent;
|
|
371
|
+
return {
|
|
372
|
+
Location: location
|
|
373
|
+
};
|
|
374
|
+
});
|
|
375
|
+
} else {
|
|
376
|
+
throw new Error('upload failed to create the file');
|
|
377
|
+
}
|
|
378
|
+
} else {
|
|
379
|
+
return res.json();
|
|
380
|
+
}
|
|
381
|
+
}).then(uploadResults => {
|
|
408
382
|
return this.finalizeUpload(preflightProps, uploadResults);
|
|
409
383
|
}).catch(e => {
|
|
410
384
|
this.alertFunc(buildError({}, e));
|
|
411
385
|
});
|
|
412
386
|
}
|
|
413
|
-
|
|
414
387
|
finalizeUpload(preflightProps, uploadResults) {
|
|
415
388
|
if (preflightProps.upload_params.success_url) {
|
|
416
389
|
// s3 upload, follow-up at success_url to finalize. the success_url doesn't
|
|
@@ -421,21 +394,16 @@ class RceApiSource {
|
|
|
421
394
|
// response. we can't just fetch the location as would be intended because
|
|
422
395
|
// it requires Canvas authentication. we also don't have an RCE API
|
|
423
396
|
// endpoint to forward it through.
|
|
424
|
-
const
|
|
425
|
-
pathname
|
|
426
|
-
} = parse(uploadResults.location);
|
|
397
|
+
const pathname = parseUrlPath(uploadResults.location);
|
|
427
398
|
const matchData = pathname.match(/^\/api\/v1\/files\/((?:\d+~)?\d+)$/);
|
|
428
|
-
|
|
429
399
|
if (!matchData) {
|
|
430
400
|
const error = new Error('cannot determine file ID from location');
|
|
431
401
|
error.location = uploadResults.location;
|
|
432
402
|
throw error;
|
|
433
403
|
}
|
|
434
|
-
|
|
435
404
|
const fileId = matchData[1];
|
|
436
405
|
return this.getFile(fileId).then(fileResults => {
|
|
437
406
|
fileResults.uuid = uploadResults.uuid; // if present, we'll need the uuid for the file verifier downstream
|
|
438
|
-
|
|
439
407
|
return fileResults;
|
|
440
408
|
});
|
|
441
409
|
} else {
|
|
@@ -443,7 +411,6 @@ class RceApiSource {
|
|
|
443
411
|
return Promise.resolve(uploadResults);
|
|
444
412
|
}
|
|
445
413
|
}
|
|
446
|
-
|
|
447
414
|
setUsageRights(fileId, usageRights) {
|
|
448
415
|
const headers = headerFor(this.jwt);
|
|
449
416
|
const uri = this.baseUri('usage_rights');
|
|
@@ -453,19 +420,18 @@ class RceApiSource {
|
|
|
453
420
|
};
|
|
454
421
|
return this.apiPost(uri, headers, body);
|
|
455
422
|
}
|
|
456
|
-
|
|
457
423
|
searchFlickr(term, apiProps) {
|
|
458
424
|
const headers = headerFor(this.jwt);
|
|
459
425
|
const base = this.baseUri('flickr_search', apiProps.host);
|
|
460
426
|
const uri = `${base}?term=${encodeURIComponent(term)}`;
|
|
461
427
|
return this.apiFetch(uri, headers);
|
|
462
428
|
}
|
|
463
|
-
|
|
464
429
|
getFile(id) {
|
|
465
430
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
466
431
|
const headers = headerFor(this.jwt);
|
|
467
|
-
const base = this.baseUri('file');
|
|
432
|
+
const base = this.baseUri('file');
|
|
468
433
|
|
|
434
|
+
// Valid query parameters for getFile
|
|
469
435
|
const {
|
|
470
436
|
replacement_chain_context_type,
|
|
471
437
|
replacement_chain_context_id,
|
|
@@ -477,37 +443,33 @@ class RceApiSource {
|
|
|
477
443
|
include
|
|
478
444
|
});
|
|
479
445
|
return this.apiFetch(uri, headers).then(normalizeFileData);
|
|
480
|
-
}
|
|
481
|
-
|
|
446
|
+
}
|
|
482
447
|
|
|
448
|
+
// @private
|
|
483
449
|
addParamsIfPresent(uri, params) {
|
|
484
450
|
let url;
|
|
485
|
-
|
|
486
451
|
try {
|
|
487
452
|
url = new URL(uri);
|
|
488
|
-
} catch (
|
|
453
|
+
} catch (_e) {
|
|
489
454
|
// Just return the URI if it was invalid
|
|
490
455
|
return uri;
|
|
491
|
-
}
|
|
492
|
-
|
|
456
|
+
}
|
|
493
457
|
|
|
458
|
+
// Add all truthy parameters to the URL
|
|
494
459
|
for (const [name, value] of Object.entries(params)) {
|
|
495
460
|
if (!value) continue;
|
|
496
461
|
url.searchParams.append(name, value);
|
|
497
462
|
}
|
|
498
|
-
|
|
499
463
|
return url.toString();
|
|
500
|
-
}
|
|
501
|
-
|
|
464
|
+
}
|
|
502
465
|
|
|
466
|
+
// @private
|
|
503
467
|
async apiFetch(uri, headers, options) {
|
|
504
468
|
if (!this.hasSession) {
|
|
505
469
|
await this.getSession();
|
|
506
470
|
}
|
|
507
|
-
|
|
508
471
|
return this.apiReallyFetch(uri, headers, options);
|
|
509
472
|
}
|
|
510
|
-
|
|
511
473
|
apiReallyFetch(uri, headers) {
|
|
512
474
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
513
475
|
uri = this.normalizeUriProtocol(uri);
|
|
@@ -528,31 +490,31 @@ class RceApiSource {
|
|
|
528
490
|
this.alertFunc(buildError(e));
|
|
529
491
|
throw e;
|
|
530
492
|
});
|
|
531
|
-
}
|
|
532
|
-
|
|
493
|
+
}
|
|
533
494
|
|
|
495
|
+
// @private
|
|
534
496
|
apiPost(uri, headers, body) {
|
|
535
497
|
let method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'POST';
|
|
536
|
-
headers = {
|
|
498
|
+
headers = {
|
|
499
|
+
...headers,
|
|
537
500
|
'Content-Type': 'application/json'
|
|
538
501
|
};
|
|
539
502
|
const fetchOptions = {
|
|
540
503
|
method,
|
|
541
504
|
headers
|
|
542
505
|
};
|
|
543
|
-
|
|
544
506
|
if (body) {
|
|
545
507
|
fetchOptions.body = JSON.stringify(body);
|
|
546
508
|
} else {
|
|
547
509
|
fetchOptions.form = body;
|
|
548
510
|
}
|
|
549
|
-
|
|
550
511
|
uri = this.normalizeUriProtocol(uri);
|
|
551
512
|
return fetch(uri, fetchOptions).then(response => {
|
|
552
513
|
if (response.status === 401) {
|
|
553
514
|
// retry once with fresh token
|
|
554
515
|
return this.buildRetryHeaders(fetchOptions.headers).then(newHeaders => {
|
|
555
|
-
const newOptions = {
|
|
516
|
+
const newOptions = {
|
|
517
|
+
...fetchOptions,
|
|
556
518
|
headers: newHeaders
|
|
557
519
|
};
|
|
558
520
|
return fetch(uri, newOptions);
|
|
@@ -562,54 +524,49 @@ class RceApiSource {
|
|
|
562
524
|
}
|
|
563
525
|
}).then(checkStatus).then(res => res.json()).catch(throwConnectionError).catch(e => e.response.json().then(responseBody => {
|
|
564
526
|
console.error(e); // eslint-disable-line no-console
|
|
565
|
-
|
|
566
527
|
this.alertFunc(buildError(responseBody));
|
|
567
528
|
throw e;
|
|
568
529
|
}));
|
|
569
|
-
}
|
|
570
|
-
|
|
530
|
+
}
|
|
571
531
|
|
|
532
|
+
// @private
|
|
572
533
|
normalizeUriProtocol(uri, windowOverride) {
|
|
573
534
|
const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
|
|
574
|
-
|
|
575
535
|
if (windowHandle && windowHandle.location && windowHandle.location.protocol === 'https:') {
|
|
576
536
|
return uri.replace('http://', 'https://');
|
|
577
537
|
}
|
|
578
|
-
|
|
579
538
|
return uri;
|
|
580
|
-
}
|
|
581
|
-
|
|
539
|
+
}
|
|
582
540
|
|
|
541
|
+
// @private
|
|
583
542
|
buildRetryHeaders(headers) {
|
|
584
543
|
return new Promise(resolve => {
|
|
585
544
|
this.refreshToken(freshToken => {
|
|
586
545
|
this.jwt = freshToken;
|
|
587
546
|
const freshHeader = headerFor(freshToken);
|
|
588
|
-
const mergedHeaders = {
|
|
547
|
+
const mergedHeaders = {
|
|
548
|
+
...headers,
|
|
589
549
|
...freshHeader
|
|
590
550
|
};
|
|
591
551
|
resolve(mergedHeaders);
|
|
592
552
|
});
|
|
593
553
|
});
|
|
594
554
|
}
|
|
595
|
-
|
|
596
555
|
baseUri(endpoint, host, windowOverride) {
|
|
597
556
|
if (!host && this.host) {
|
|
598
557
|
host = this.host;
|
|
599
558
|
}
|
|
600
|
-
|
|
601
559
|
host = originFromHost(host, windowOverride);
|
|
602
560
|
const sharedEndpoints = ['images', 'media', 'documents', 'all']; // 'all' will eventually be something different
|
|
603
|
-
|
|
604
561
|
const endpt = sharedEndpoints.includes(endpoint) ? 'documents' : endpoint;
|
|
605
562
|
return `${host}/api/${endpt}`;
|
|
606
|
-
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// returns the URI to use with the fetchPage method to fetch the first page of
|
|
607
566
|
// the given endpoint. e.g. for wikiPages it might return:
|
|
608
567
|
//
|
|
609
568
|
// //rce.docker/api/wikiPages?context_type=course&context_id=42
|
|
610
569
|
//
|
|
611
|
-
|
|
612
|
-
|
|
613
570
|
uriFor(endpoint, props) {
|
|
614
571
|
const {
|
|
615
572
|
host,
|
|
@@ -621,51 +578,39 @@ class RceApiSource {
|
|
|
621
578
|
} = props;
|
|
622
579
|
let extra = '';
|
|
623
580
|
const pageSizeParam = perPage ? `&per_page=${perPage}` : '';
|
|
624
|
-
|
|
625
581
|
switch (endpoint) {
|
|
626
582
|
case 'images':
|
|
627
583
|
extra = `&content_types=image${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}${optionalQuery(props, 'category')}`;
|
|
628
584
|
break;
|
|
629
|
-
|
|
630
585
|
case 'media':
|
|
631
586
|
// when requesting media files via the documents endpoint
|
|
632
587
|
extra = `&content_types=video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
|
|
633
588
|
break;
|
|
634
|
-
|
|
635
589
|
case 'documents':
|
|
636
590
|
extra = `&exclude_content_types=image,video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
|
|
637
591
|
break;
|
|
638
|
-
|
|
639
592
|
case 'media_objects':
|
|
640
593
|
// when requesting media objects (this is the currently used branch)
|
|
641
594
|
extra = `${getSortParams(sortBy.sort === 'alphabetical' ? 'title' : 'date', sortBy.dir)}${getSearchParam(searchString)}`;
|
|
642
595
|
break;
|
|
643
|
-
|
|
644
596
|
default:
|
|
645
597
|
extra = getSearchParam(searchString);
|
|
646
598
|
}
|
|
647
|
-
|
|
648
599
|
return `${this.baseUri(endpoint, host)}?contextType=${contextType}&contextId=${contextId}${pageSizeParam}${extra}`;
|
|
649
600
|
}
|
|
650
|
-
|
|
651
601
|
}
|
|
652
|
-
|
|
653
602
|
function getSortParams(sort, dir) {
|
|
654
603
|
let sortBy = sort;
|
|
655
|
-
|
|
656
604
|
if (sortBy === 'date_added') {
|
|
657
605
|
sortBy = 'created_at';
|
|
658
606
|
} else if (sortBy === 'alphabetical') {
|
|
659
607
|
sortBy = 'name';
|
|
660
608
|
}
|
|
661
|
-
|
|
662
609
|
return `&sort=${sortBy}&order=${dir}`;
|
|
663
610
|
}
|
|
664
|
-
|
|
665
611
|
function optionalQuery(props, name) {
|
|
666
612
|
return props[name] ? `&${name}=${props[name]}` : '';
|
|
667
613
|
}
|
|
668
|
-
|
|
669
614
|
export function getSearchParam(searchString) {
|
|
670
615
|
return (searchString === null || searchString === void 0 ? void 0 : searchString.length) >= 3 ? `&search_term=${encodeURIComponent(searchString)}` : '';
|
|
671
616
|
}
|
package/es/rcs/buildError.js
CHANGED
|
@@ -15,7 +15,9 @@
|
|
|
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 formatMessage from '../format-message';
|
|
20
|
+
|
|
19
21
|
/*
|
|
20
22
|
* builds an a displayable error based on errorContext and error
|
|
21
23
|
*
|
|
@@ -25,74 +27,60 @@ import formatMessage from '../format-message';
|
|
|
25
27
|
*
|
|
26
28
|
* @returns { Object } Displayable error - An object with "text" and "variant" keys
|
|
27
29
|
*/
|
|
28
|
-
|
|
29
30
|
export default function buildError(errorContext, error) {
|
|
30
31
|
return getErrorClass(errorContext, error).build(error);
|
|
31
32
|
}
|
|
32
|
-
|
|
33
33
|
function getErrorClass(errorContext, error) {
|
|
34
|
-
const errors = [QuotaError, CaptionSizeError, CaptionCreationError, DefaultError];
|
|
35
|
-
// Defaults to DefaultError
|
|
34
|
+
const errors = [QuotaError, CaptionSizeError, CaptionCreationError, DefaultError];
|
|
36
35
|
|
|
36
|
+
// Find the first error class that matches the given context and error.
|
|
37
|
+
// Defaults to DefaultError
|
|
37
38
|
return errors.find(ErrorClass => ErrorClass.isMatch(errorContext, error));
|
|
38
39
|
}
|
|
39
|
-
|
|
40
40
|
class QuotaError {
|
|
41
41
|
static isMatch(errorContext) {
|
|
42
42
|
return (errorContext === null || errorContext === void 0 ? void 0 : errorContext.message) === 'file size exceeds quota';
|
|
43
43
|
}
|
|
44
|
-
|
|
45
44
|
static build(_error) {
|
|
46
45
|
return {
|
|
47
46
|
text: formatMessage('File storage quota exceeded'),
|
|
48
47
|
variant: 'error'
|
|
49
48
|
};
|
|
50
49
|
}
|
|
51
|
-
|
|
52
50
|
}
|
|
53
|
-
|
|
54
51
|
class CaptionSizeError {
|
|
55
52
|
static isMatch(_errorContext, error) {
|
|
56
53
|
return (error === null || error === void 0 ? void 0 : error.name) === 'FileSizeError';
|
|
57
54
|
}
|
|
58
|
-
|
|
59
55
|
static build(error) {
|
|
60
56
|
return {
|
|
61
57
|
text: formatMessage('Closed caption file must be less than {maxKb} kb', {
|
|
62
58
|
maxKb: error.maxBytes / 1000 // bytes to kb
|
|
63
|
-
|
|
64
59
|
}),
|
|
65
60
|
variant: 'error'
|
|
66
61
|
};
|
|
67
62
|
}
|
|
68
|
-
|
|
69
63
|
}
|
|
70
|
-
|
|
71
64
|
class CaptionCreationError {
|
|
72
65
|
static isMatch(errorContext) {
|
|
73
66
|
return (errorContext === null || errorContext === void 0 ? void 0 : errorContext.message) === 'failed to save captions';
|
|
74
67
|
}
|
|
75
|
-
|
|
76
68
|
static build(_error) {
|
|
77
69
|
return {
|
|
78
70
|
text: formatMessage('loading closed captions/subtitles failed.'),
|
|
79
71
|
variant: 'error'
|
|
80
72
|
};
|
|
81
73
|
}
|
|
82
|
-
|
|
83
74
|
}
|
|
84
|
-
|
|
85
75
|
class DefaultError {
|
|
86
76
|
static isMatch() {
|
|
87
77
|
// DefaultError comes last in the list an always matches
|
|
88
78
|
return true;
|
|
89
79
|
}
|
|
90
|
-
|
|
91
80
|
static build(_error) {
|
|
92
81
|
return {
|
|
93
82
|
text: formatMessage('Something went wrong. Check your connection, reload the page, and try again.'),
|
|
94
83
|
variant: 'error'
|
|
95
84
|
};
|
|
96
85
|
}
|
|
97
|
-
|
|
98
86
|
}
|