@instructure/canvas-rce 5.14.1 → 5.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
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,19 @@ 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
|
-
var _windowHandle$locatio;
|
|
37
|
-
|
|
38
36
|
origin = `//${origin}`;
|
|
39
37
|
const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
|
|
40
|
-
|
|
41
|
-
if (origin.length > 0 && windowHandle !== null && windowHandle !== void 0 && (_windowHandle$locatio = windowHandle.location) !== null && _windowHandle$locatio !== void 0 && _windowHandle$locatio.protocol) {
|
|
38
|
+
if (origin.length > 0 && windowHandle?.location?.protocol) {
|
|
42
39
|
origin = `${windowHandle.location.protocol}${origin}`;
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
|
-
|
|
46
42
|
return origin;
|
|
47
|
-
}
|
|
43
|
+
}
|
|
48
44
|
|
|
45
|
+
// filter a response to raise an error on a 400+ status
|
|
49
46
|
function checkStatus(response) {
|
|
50
47
|
if (response.status < 400) {
|
|
51
48
|
return response;
|
|
@@ -55,11 +52,9 @@ function checkStatus(response) {
|
|
|
55
52
|
throw error;
|
|
56
53
|
}
|
|
57
54
|
}
|
|
58
|
-
|
|
59
55
|
function defaultRefreshTokenHandler() {
|
|
60
56
|
throw new Error('Token expired, no refresh function provided');
|
|
61
57
|
}
|
|
62
|
-
|
|
63
58
|
function normalizeFileData(file) {
|
|
64
59
|
return {
|
|
65
60
|
// copy the name to the default display name if none provided
|
|
@@ -69,22 +64,17 @@ function normalizeFileData(file) {
|
|
|
69
64
|
href: downloadToWrap(file.href || file.url)
|
|
70
65
|
};
|
|
71
66
|
}
|
|
72
|
-
|
|
73
67
|
function throwConnectionError(error) {
|
|
74
68
|
if (error.name === 'TypeError') {
|
|
75
|
-
// eslint-disable-next-line no-console
|
|
76
69
|
console.error(`Failed to fetch from the canvas-rce-api.
|
|
77
70
|
Did you forget to start it or configure it?
|
|
78
71
|
Details can be found at https://github.com/instructure/canvas-rce-api
|
|
79
72
|
`);
|
|
80
73
|
}
|
|
81
|
-
|
|
82
74
|
throw error;
|
|
83
75
|
}
|
|
84
|
-
|
|
85
76
|
class RceApiSource {
|
|
86
|
-
constructor() {
|
|
87
|
-
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
77
|
+
constructor(options = {}) {
|
|
88
78
|
this.jwt = options.jwt;
|
|
89
79
|
this.host = options.host;
|
|
90
80
|
this.refreshToken = options.refreshToken || defaultRefreshTokenHandler;
|
|
@@ -92,7 +82,6 @@ class RceApiSource {
|
|
|
92
82
|
this.alertFunc = options.alertFunc || alertHandler.handleAlert;
|
|
93
83
|
this.canvasOrigin = options.canvasOrigin || window.origin;
|
|
94
84
|
}
|
|
95
|
-
|
|
96
85
|
getSession() {
|
|
97
86
|
const headers = headerFor(this.jwt);
|
|
98
87
|
const uri = this.baseUri('session');
|
|
@@ -100,10 +89,10 @@ class RceApiSource {
|
|
|
100
89
|
this.hasSession = true;
|
|
101
90
|
return data;
|
|
102
91
|
}).catch(throwConnectionError);
|
|
103
|
-
}
|
|
104
|
-
// uri for initial page fetch
|
|
105
|
-
|
|
92
|
+
}
|
|
106
93
|
|
|
94
|
+
// initial state of a collection is empty, not loading, with bookmark set to
|
|
95
|
+
// uri for initial page fetch
|
|
107
96
|
initializeCollection(endpoint, props) {
|
|
108
97
|
return {
|
|
109
98
|
links: [],
|
|
@@ -113,7 +102,6 @@ class RceApiSource {
|
|
|
113
102
|
searchString: props.searchString
|
|
114
103
|
};
|
|
115
104
|
}
|
|
116
|
-
|
|
117
105
|
initializeUpload() {
|
|
118
106
|
return {
|
|
119
107
|
uploading: false,
|
|
@@ -121,11 +109,9 @@ class RceApiSource {
|
|
|
121
109
|
formExpanded: false
|
|
122
110
|
};
|
|
123
111
|
}
|
|
124
|
-
|
|
125
112
|
initializeImages(props) {
|
|
126
113
|
return this.initializeDocuments(props);
|
|
127
114
|
}
|
|
128
|
-
|
|
129
115
|
initializeDocuments(props) {
|
|
130
116
|
return {
|
|
131
117
|
[props.contextType]: {
|
|
@@ -137,28 +123,24 @@ class RceApiSource {
|
|
|
137
123
|
searchString: ''
|
|
138
124
|
};
|
|
139
125
|
}
|
|
140
|
-
|
|
141
126
|
initializeMedia(props) {
|
|
142
127
|
return this.initializeDocuments(props);
|
|
143
128
|
}
|
|
144
|
-
|
|
145
129
|
initializeFlickr() {
|
|
146
130
|
return {
|
|
147
131
|
searchResults: [],
|
|
148
132
|
searching: false,
|
|
149
133
|
formExpanded: false
|
|
150
134
|
};
|
|
151
|
-
}
|
|
152
|
-
|
|
135
|
+
}
|
|
153
136
|
|
|
137
|
+
// fetches the given URI and filters it to either an error or parsed response
|
|
154
138
|
fetchPage(uri) {
|
|
155
139
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
156
140
|
}
|
|
157
|
-
|
|
158
141
|
fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, bookmark) {
|
|
159
142
|
return fetchFunction(properties, bookmark).then(result => {
|
|
160
143
|
onSuccess(result);
|
|
161
|
-
|
|
162
144
|
if (result.bookmark) {
|
|
163
145
|
this.fetchBookmarkedData(fetchFunction, properties, onSuccess, onError, result.bookmark);
|
|
164
146
|
}
|
|
@@ -166,57 +148,46 @@ class RceApiSource {
|
|
|
166
148
|
onError(error);
|
|
167
149
|
});
|
|
168
150
|
}
|
|
169
|
-
|
|
170
151
|
fetchDocs(props) {
|
|
171
152
|
const documents = props.documents[props.contextType];
|
|
172
153
|
const uri = documents.bookmark || this.uriFor('documents', props);
|
|
173
|
-
return this.apiFetch(uri, headerFor(this.jwt)).then(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
} = _ref;
|
|
154
|
+
return this.apiFetch(uri, headerFor(this.jwt)).then(({
|
|
155
|
+
bookmark,
|
|
156
|
+
files
|
|
157
|
+
}) => {
|
|
178
158
|
return {
|
|
179
159
|
bookmark,
|
|
180
160
|
files: files.map(f => fixupFileUrl(props.contextType, props.contextId, f, this.canvasOrigin))
|
|
181
161
|
};
|
|
182
162
|
});
|
|
183
163
|
}
|
|
184
|
-
|
|
185
164
|
fetchMedia(props) {
|
|
186
|
-
var _RCEGlobals$getFeatur;
|
|
187
|
-
|
|
188
165
|
const media = props.media[props.contextType];
|
|
189
166
|
const uri = media.bookmark || this.uriFor('media', props);
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
files
|
|
196
|
-
} = _ref2;
|
|
167
|
+
if (RCEGlobals.getFeatures()?.media_links_use_attachment_id) {
|
|
168
|
+
return this.apiFetch(uri, headerFor(this.jwt)).then(({
|
|
169
|
+
bookmark,
|
|
170
|
+
files
|
|
171
|
+
}) => {
|
|
197
172
|
return {
|
|
198
173
|
bookmark,
|
|
199
174
|
files: files.map(f => fixupFileUrl(props.contextType, props.contextId, f, this.canvasOrigin))
|
|
200
175
|
};
|
|
201
176
|
});
|
|
202
177
|
}
|
|
203
|
-
|
|
204
178
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
205
179
|
}
|
|
206
|
-
|
|
207
180
|
fetchFiles(uri) {
|
|
208
|
-
return this.fetchPage(uri).then(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
} = _ref3;
|
|
181
|
+
return this.fetchPage(uri).then(({
|
|
182
|
+
bookmark,
|
|
183
|
+
files
|
|
184
|
+
}) => {
|
|
213
185
|
return {
|
|
214
186
|
bookmark,
|
|
215
187
|
files: files.map(normalizeFileData)
|
|
216
188
|
};
|
|
217
189
|
});
|
|
218
190
|
}
|
|
219
|
-
|
|
220
191
|
fetchLinks(key, props) {
|
|
221
192
|
const {
|
|
222
193
|
collections
|
|
@@ -224,15 +195,12 @@ class RceApiSource {
|
|
|
224
195
|
const bookmark = collections[key].bookmark || this.uriFor(key, props);
|
|
225
196
|
return this.fetchPage(bookmark);
|
|
226
197
|
}
|
|
227
|
-
|
|
228
198
|
fetchRootFolder(props) {
|
|
229
199
|
return this.fetchPage(this.uriFor('folders', props), this.jwt);
|
|
230
200
|
}
|
|
231
|
-
|
|
232
201
|
mediaServerSession() {
|
|
233
202
|
return this.apiPost(this.baseUri('v1/services/kaltura_session'), headerFor(this.jwt), {});
|
|
234
203
|
}
|
|
235
|
-
|
|
236
204
|
uploadMediaToCanvas(mediaObject) {
|
|
237
205
|
const body = {
|
|
238
206
|
id: mediaObject.entryId,
|
|
@@ -246,28 +214,22 @@ class RceApiSource {
|
|
|
246
214
|
};
|
|
247
215
|
return this.apiPost(this.baseUri('media_objects'), headerFor(this.jwt), body);
|
|
248
216
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
title,
|
|
256
|
-
attachment_id
|
|
257
|
-
} = _ref4;
|
|
258
|
-
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)}`;
|
|
217
|
+
updateMediaObject(apiProps, {
|
|
218
|
+
media_object_id,
|
|
219
|
+
title,
|
|
220
|
+
attachment_id
|
|
221
|
+
}) {
|
|
222
|
+
const uri = RCEGlobals.getFeatures()?.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
223
|
return this.apiPost(uri, headerFor(this.jwt), null, 'PUT');
|
|
260
|
-
}
|
|
261
|
-
// receive back a 200 with the new subtitles, or a 4xx error
|
|
262
|
-
|
|
224
|
+
}
|
|
263
225
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
226
|
+
// PUT to //RCS/api/media_objects/:mediaId/media_tracks [{locale, content}, ...]
|
|
227
|
+
// receive back a 200 with the new subtitles, or a 4xx error
|
|
228
|
+
updateClosedCaptions(apiProps, {
|
|
229
|
+
media_object_id,
|
|
230
|
+
attachment_id,
|
|
231
|
+
subtitles
|
|
232
|
+
}, maxBytes = CONSTANTS.CC_FILE_MAX_BYTES) {
|
|
271
233
|
const rcsConfig = {
|
|
272
234
|
origin: originFromHost(apiProps.host),
|
|
273
235
|
headers: headerFor(apiProps.jwt)
|
|
@@ -278,10 +240,10 @@ class RceApiSource {
|
|
|
278
240
|
message: 'failed to save captions'
|
|
279
241
|
}, e));
|
|
280
242
|
});
|
|
281
|
-
}
|
|
282
|
-
// receive back the current list of media_tracks
|
|
283
|
-
|
|
243
|
+
}
|
|
284
244
|
|
|
245
|
+
// GET /media_objects/:mediaId/media_tracks
|
|
246
|
+
// receive back the current list of media_tracks
|
|
285
247
|
fetchClosedCaptions(_mediaId) {
|
|
286
248
|
return Promise.resolve([{
|
|
287
249
|
locale: 'af',
|
|
@@ -290,47 +252,40 @@ class RceApiSource {
|
|
|
290
252
|
locale: 'es',
|
|
291
253
|
content: '1\r\n00:00:00,000 --> 00:00:01,251\r\nThis is the content\r\n'
|
|
292
254
|
}]);
|
|
293
|
-
}
|
|
294
|
-
|
|
255
|
+
}
|
|
295
256
|
|
|
257
|
+
// fetches folders for the given context to upload files to
|
|
296
258
|
fetchFolders(props, bookmark) {
|
|
297
259
|
const headers = headerFor(this.jwt);
|
|
298
260
|
const uri = bookmark || this.uriFor('folders/all', props);
|
|
299
261
|
return this.apiFetch(uri, headers);
|
|
300
|
-
}
|
|
301
|
-
|
|
262
|
+
}
|
|
302
263
|
|
|
264
|
+
// Fetches all files for a given folder
|
|
303
265
|
fetchFilesForFolder(props, bookmark) {
|
|
304
266
|
let uri;
|
|
305
|
-
|
|
306
267
|
if (!bookmark) {
|
|
307
268
|
const perPageQuery = props.perPage ? `per_page=${props.perPage}` : '';
|
|
308
269
|
const searchParam = getSearchParam(props.searchString);
|
|
309
270
|
uri = `${props.filesUrl}`;
|
|
310
271
|
uri += perPageQuery ? `?${perPageQuery}` : '';
|
|
311
|
-
|
|
312
272
|
if (searchParam) {
|
|
313
273
|
uri += perPageQuery ? `${searchParam}` : `?${searchParam}`;
|
|
314
274
|
}
|
|
315
|
-
|
|
316
275
|
if (props.sortBy) {
|
|
317
276
|
uri += `${getSortParams(props.sortBy.sort, props.sortBy.order)}`;
|
|
318
277
|
}
|
|
319
278
|
}
|
|
320
|
-
|
|
321
279
|
return this.fetchPage(uri || bookmark, this.jwt);
|
|
322
280
|
}
|
|
323
|
-
|
|
324
281
|
fetchSubFolders(props, bookmark) {
|
|
325
282
|
const uri = bookmark || `${this.baseUri('folders', props.host)}/${props.folderId}`;
|
|
326
283
|
return this.apiFetch(uri, headerFor(this.jwt));
|
|
327
284
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
contextType
|
|
333
|
-
} = _ref6;
|
|
285
|
+
fetchIconMakerFolder({
|
|
286
|
+
contextId,
|
|
287
|
+
contextType
|
|
288
|
+
}) {
|
|
334
289
|
const uri = this.uriFor('folders/icon_maker', {
|
|
335
290
|
contextId,
|
|
336
291
|
contextType,
|
|
@@ -339,32 +294,26 @@ class RceApiSource {
|
|
|
339
294
|
});
|
|
340
295
|
return this.fetchPage(uri);
|
|
341
296
|
}
|
|
342
|
-
|
|
343
297
|
fetchMediaFolder(props) {
|
|
344
298
|
let uri;
|
|
345
|
-
|
|
346
299
|
if (props.contextType === 'user') {
|
|
347
300
|
uri = this.uriFor('folders', props);
|
|
348
301
|
} else {
|
|
349
302
|
uri = this.uriFor('folders/media', props);
|
|
350
303
|
}
|
|
351
|
-
|
|
352
304
|
return this.fetchPage(uri);
|
|
353
305
|
}
|
|
354
|
-
|
|
355
306
|
fetchMediaObjectIframe(mediaObjectId) {
|
|
356
307
|
return this.fetchPage(this.uriFor(`media_objects_iframe/${mediaObjectId}`));
|
|
357
308
|
}
|
|
358
|
-
|
|
359
309
|
fetchImages(props) {
|
|
360
310
|
const images = props.images[props.contextType];
|
|
361
311
|
const uri = images.bookmark || this.uriFor('images', props);
|
|
362
312
|
const headers = headerFor(this.jwt);
|
|
363
|
-
return this.apiFetch(uri, headers).then(
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
} = _ref7;
|
|
313
|
+
return this.apiFetch(uri, headers).then(({
|
|
314
|
+
bookmark,
|
|
315
|
+
files
|
|
316
|
+
}) => {
|
|
368
317
|
return {
|
|
369
318
|
bookmark,
|
|
370
319
|
files: files.map(f => fixupFileUrl(props.contextType, props.contextId, f, this.canvasOrigin)),
|
|
@@ -372,7 +321,6 @@ class RceApiSource {
|
|
|
372
321
|
};
|
|
373
322
|
});
|
|
374
323
|
}
|
|
375
|
-
|
|
376
324
|
preflightUpload(fileProps, apiProps) {
|
|
377
325
|
const headers = headerFor(this.jwt);
|
|
378
326
|
const uri = this.baseUri('upload', apiProps.host);
|
|
@@ -386,7 +334,6 @@ class RceApiSource {
|
|
|
386
334
|
};
|
|
387
335
|
return this.apiPost(uri, headers, body);
|
|
388
336
|
}
|
|
389
|
-
|
|
390
337
|
uploadFRD(fileDomObject, preflightProps) {
|
|
391
338
|
const data = new window.FormData();
|
|
392
339
|
Object.keys(preflightProps.upload_params).forEach(uploadProp => {
|
|
@@ -397,20 +344,33 @@ class RceApiSource {
|
|
|
397
344
|
method: 'POST',
|
|
398
345
|
body: data
|
|
399
346
|
};
|
|
400
|
-
|
|
401
347
|
if (!preflightProps.upload_params['x-amz-signature'] && !preflightProps.upload_url.includes('files_api')) {
|
|
402
348
|
// _not_ an S3 upload, include the credentials in the upload POST
|
|
403
349
|
// local uploads can include crendentials for same-origin requests
|
|
404
350
|
fetchOptions.credentials = 'include';
|
|
405
351
|
}
|
|
406
|
-
|
|
407
|
-
|
|
352
|
+
return fetch(preflightProps.upload_url, fetchOptions).then(checkStatus).then(res => {
|
|
353
|
+
if (res.headers.get('content-type').includes('application/xml')) {
|
|
354
|
+
if (res.status === 201) {
|
|
355
|
+
return res.text().then(text => {
|
|
356
|
+
const xmldoc = new window.DOMParser().parseFromString(text, 'application/xml');
|
|
357
|
+
const location = xmldoc.querySelector('Location').textContent;
|
|
358
|
+
return {
|
|
359
|
+
Location: location
|
|
360
|
+
};
|
|
361
|
+
});
|
|
362
|
+
} else {
|
|
363
|
+
throw new Error('upload failed to create the file');
|
|
364
|
+
}
|
|
365
|
+
} else {
|
|
366
|
+
return res.json();
|
|
367
|
+
}
|
|
368
|
+
}).then(uploadResults => {
|
|
408
369
|
return this.finalizeUpload(preflightProps, uploadResults);
|
|
409
370
|
}).catch(e => {
|
|
410
371
|
this.alertFunc(buildError({}, e));
|
|
411
372
|
});
|
|
412
373
|
}
|
|
413
|
-
|
|
414
374
|
finalizeUpload(preflightProps, uploadResults) {
|
|
415
375
|
if (preflightProps.upload_params.success_url) {
|
|
416
376
|
// s3 upload, follow-up at success_url to finalize. the success_url doesn't
|
|
@@ -421,21 +381,16 @@ class RceApiSource {
|
|
|
421
381
|
// response. we can't just fetch the location as would be intended because
|
|
422
382
|
// it requires Canvas authentication. we also don't have an RCE API
|
|
423
383
|
// endpoint to forward it through.
|
|
424
|
-
const
|
|
425
|
-
pathname
|
|
426
|
-
} = parse(uploadResults.location);
|
|
384
|
+
const pathname = parseUrlPath(uploadResults.location);
|
|
427
385
|
const matchData = pathname.match(/^\/api\/v1\/files\/((?:\d+~)?\d+)$/);
|
|
428
|
-
|
|
429
386
|
if (!matchData) {
|
|
430
387
|
const error = new Error('cannot determine file ID from location');
|
|
431
388
|
error.location = uploadResults.location;
|
|
432
389
|
throw error;
|
|
433
390
|
}
|
|
434
|
-
|
|
435
391
|
const fileId = matchData[1];
|
|
436
392
|
return this.getFile(fileId).then(fileResults => {
|
|
437
393
|
fileResults.uuid = uploadResults.uuid; // if present, we'll need the uuid for the file verifier downstream
|
|
438
|
-
|
|
439
394
|
return fileResults;
|
|
440
395
|
});
|
|
441
396
|
} else {
|
|
@@ -443,7 +398,6 @@ class RceApiSource {
|
|
|
443
398
|
return Promise.resolve(uploadResults);
|
|
444
399
|
}
|
|
445
400
|
}
|
|
446
|
-
|
|
447
401
|
setUsageRights(fileId, usageRights) {
|
|
448
402
|
const headers = headerFor(this.jwt);
|
|
449
403
|
const uri = this.baseUri('usage_rights');
|
|
@@ -453,19 +407,17 @@ class RceApiSource {
|
|
|
453
407
|
};
|
|
454
408
|
return this.apiPost(uri, headers, body);
|
|
455
409
|
}
|
|
456
|
-
|
|
457
410
|
searchFlickr(term, apiProps) {
|
|
458
411
|
const headers = headerFor(this.jwt);
|
|
459
412
|
const base = this.baseUri('flickr_search', apiProps.host);
|
|
460
413
|
const uri = `${base}?term=${encodeURIComponent(term)}`;
|
|
461
414
|
return this.apiFetch(uri, headers);
|
|
462
415
|
}
|
|
463
|
-
|
|
464
|
-
getFile(id) {
|
|
465
|
-
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
416
|
+
getFile(id, options = {}) {
|
|
466
417
|
const headers = headerFor(this.jwt);
|
|
467
|
-
const base = this.baseUri('file');
|
|
418
|
+
const base = this.baseUri('file');
|
|
468
419
|
|
|
420
|
+
// Valid query parameters for getFile
|
|
469
421
|
const {
|
|
470
422
|
replacement_chain_context_type,
|
|
471
423
|
replacement_chain_context_id,
|
|
@@ -477,39 +429,34 @@ class RceApiSource {
|
|
|
477
429
|
include
|
|
478
430
|
});
|
|
479
431
|
return this.apiFetch(uri, headers).then(normalizeFileData);
|
|
480
|
-
}
|
|
481
|
-
|
|
432
|
+
}
|
|
482
433
|
|
|
434
|
+
// @private
|
|
483
435
|
addParamsIfPresent(uri, params) {
|
|
484
436
|
let url;
|
|
485
|
-
|
|
486
437
|
try {
|
|
487
438
|
url = new URL(uri);
|
|
488
|
-
} catch (
|
|
439
|
+
} catch (_e) {
|
|
489
440
|
// Just return the URI if it was invalid
|
|
490
441
|
return uri;
|
|
491
|
-
}
|
|
492
|
-
|
|
442
|
+
}
|
|
493
443
|
|
|
444
|
+
// Add all truthy parameters to the URL
|
|
494
445
|
for (const [name, value] of Object.entries(params)) {
|
|
495
446
|
if (!value) continue;
|
|
496
447
|
url.searchParams.append(name, value);
|
|
497
448
|
}
|
|
498
|
-
|
|
499
449
|
return url.toString();
|
|
500
|
-
}
|
|
501
|
-
|
|
450
|
+
}
|
|
502
451
|
|
|
452
|
+
// @private
|
|
503
453
|
async apiFetch(uri, headers, options) {
|
|
504
454
|
if (!this.hasSession) {
|
|
505
455
|
await this.getSession();
|
|
506
456
|
}
|
|
507
|
-
|
|
508
457
|
return this.apiReallyFetch(uri, headers, options);
|
|
509
458
|
}
|
|
510
|
-
|
|
511
|
-
apiReallyFetch(uri, headers) {
|
|
512
|
-
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
459
|
+
apiReallyFetch(uri, headers, options = {}) {
|
|
513
460
|
uri = this.normalizeUriProtocol(uri);
|
|
514
461
|
return fetch(uri, {
|
|
515
462
|
headers
|
|
@@ -528,31 +475,30 @@ class RceApiSource {
|
|
|
528
475
|
this.alertFunc(buildError(e));
|
|
529
476
|
throw e;
|
|
530
477
|
});
|
|
531
|
-
}
|
|
532
|
-
|
|
478
|
+
}
|
|
533
479
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
headers = {
|
|
480
|
+
// @private
|
|
481
|
+
apiPost(uri, headers, body, method = 'POST') {
|
|
482
|
+
headers = {
|
|
483
|
+
...headers,
|
|
537
484
|
'Content-Type': 'application/json'
|
|
538
485
|
};
|
|
539
486
|
const fetchOptions = {
|
|
540
487
|
method,
|
|
541
488
|
headers
|
|
542
489
|
};
|
|
543
|
-
|
|
544
490
|
if (body) {
|
|
545
491
|
fetchOptions.body = JSON.stringify(body);
|
|
546
492
|
} else {
|
|
547
493
|
fetchOptions.form = body;
|
|
548
494
|
}
|
|
549
|
-
|
|
550
495
|
uri = this.normalizeUriProtocol(uri);
|
|
551
496
|
return fetch(uri, fetchOptions).then(response => {
|
|
552
497
|
if (response.status === 401) {
|
|
553
498
|
// retry once with fresh token
|
|
554
499
|
return this.buildRetryHeaders(fetchOptions.headers).then(newHeaders => {
|
|
555
|
-
const newOptions = {
|
|
500
|
+
const newOptions = {
|
|
501
|
+
...fetchOptions,
|
|
556
502
|
headers: newHeaders
|
|
557
503
|
};
|
|
558
504
|
return fetch(uri, newOptions);
|
|
@@ -561,55 +507,50 @@ class RceApiSource {
|
|
|
561
507
|
return response;
|
|
562
508
|
}
|
|
563
509
|
}).then(checkStatus).then(res => res.json()).catch(throwConnectionError).catch(e => e.response.json().then(responseBody => {
|
|
564
|
-
console.error(e);
|
|
565
|
-
|
|
510
|
+
console.error(e);
|
|
566
511
|
this.alertFunc(buildError(responseBody));
|
|
567
512
|
throw e;
|
|
568
513
|
}));
|
|
569
|
-
}
|
|
570
|
-
|
|
514
|
+
}
|
|
571
515
|
|
|
516
|
+
// @private
|
|
572
517
|
normalizeUriProtocol(uri, windowOverride) {
|
|
573
518
|
const windowHandle = windowOverride || (typeof window !== 'undefined' ? window : undefined);
|
|
574
|
-
|
|
575
519
|
if (windowHandle && windowHandle.location && windowHandle.location.protocol === 'https:') {
|
|
576
520
|
return uri.replace('http://', 'https://');
|
|
577
521
|
}
|
|
578
|
-
|
|
579
522
|
return uri;
|
|
580
|
-
}
|
|
581
|
-
|
|
523
|
+
}
|
|
582
524
|
|
|
525
|
+
// @private
|
|
583
526
|
buildRetryHeaders(headers) {
|
|
584
527
|
return new Promise(resolve => {
|
|
585
528
|
this.refreshToken(freshToken => {
|
|
586
529
|
this.jwt = freshToken;
|
|
587
530
|
const freshHeader = headerFor(freshToken);
|
|
588
|
-
const mergedHeaders = {
|
|
531
|
+
const mergedHeaders = {
|
|
532
|
+
...headers,
|
|
589
533
|
...freshHeader
|
|
590
534
|
};
|
|
591
535
|
resolve(mergedHeaders);
|
|
592
536
|
});
|
|
593
537
|
});
|
|
594
538
|
}
|
|
595
|
-
|
|
596
539
|
baseUri(endpoint, host, windowOverride) {
|
|
597
540
|
if (!host && this.host) {
|
|
598
541
|
host = this.host;
|
|
599
542
|
}
|
|
600
|
-
|
|
601
543
|
host = originFromHost(host, windowOverride);
|
|
602
544
|
const sharedEndpoints = ['images', 'media', 'documents', 'all']; // 'all' will eventually be something different
|
|
603
|
-
|
|
604
545
|
const endpt = sharedEndpoints.includes(endpoint) ? 'documents' : endpoint;
|
|
605
546
|
return `${host}/api/${endpt}`;
|
|
606
|
-
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// returns the URI to use with the fetchPage method to fetch the first page of
|
|
607
550
|
// the given endpoint. e.g. for wikiPages it might return:
|
|
608
551
|
//
|
|
609
552
|
// //rce.docker/api/wikiPages?context_type=course&context_id=42
|
|
610
553
|
//
|
|
611
|
-
|
|
612
|
-
|
|
613
554
|
uriFor(endpoint, props) {
|
|
614
555
|
const {
|
|
615
556
|
host,
|
|
@@ -621,52 +562,40 @@ class RceApiSource {
|
|
|
621
562
|
} = props;
|
|
622
563
|
let extra = '';
|
|
623
564
|
const pageSizeParam = perPage ? `&per_page=${perPage}` : '';
|
|
624
|
-
|
|
625
565
|
switch (endpoint) {
|
|
626
566
|
case 'images':
|
|
627
567
|
extra = `&content_types=image${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}${optionalQuery(props, 'category')}`;
|
|
628
568
|
break;
|
|
629
|
-
|
|
630
569
|
case 'media':
|
|
631
570
|
// when requesting media files via the documents endpoint
|
|
632
571
|
extra = `&content_types=video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
|
|
633
572
|
break;
|
|
634
|
-
|
|
635
573
|
case 'documents':
|
|
636
574
|
extra = `&exclude_content_types=image,video,audio${getSortParams(sortBy.sort, sortBy.dir)}${getSearchParam(searchString)}`;
|
|
637
575
|
break;
|
|
638
|
-
|
|
639
576
|
case 'media_objects':
|
|
640
577
|
// when requesting media objects (this is the currently used branch)
|
|
641
578
|
extra = `${getSortParams(sortBy.sort === 'alphabetical' ? 'title' : 'date', sortBy.dir)}${getSearchParam(searchString)}`;
|
|
642
579
|
break;
|
|
643
|
-
|
|
644
580
|
default:
|
|
645
581
|
extra = getSearchParam(searchString);
|
|
646
582
|
}
|
|
647
|
-
|
|
648
583
|
return `${this.baseUri(endpoint, host)}?contextType=${contextType}&contextId=${contextId}${pageSizeParam}${extra}`;
|
|
649
584
|
}
|
|
650
|
-
|
|
651
585
|
}
|
|
652
|
-
|
|
653
586
|
function getSortParams(sort, dir) {
|
|
654
587
|
let sortBy = sort;
|
|
655
|
-
|
|
656
588
|
if (sortBy === 'date_added') {
|
|
657
589
|
sortBy = 'created_at';
|
|
658
590
|
} else if (sortBy === 'alphabetical') {
|
|
659
591
|
sortBy = 'name';
|
|
660
592
|
}
|
|
661
|
-
|
|
662
593
|
return `&sort=${sortBy}&order=${dir}`;
|
|
663
594
|
}
|
|
664
|
-
|
|
665
595
|
function optionalQuery(props, name) {
|
|
666
596
|
return props[name] ? `&${name}=${props[name]}` : '';
|
|
667
597
|
}
|
|
668
|
-
|
|
669
598
|
export function getSearchParam(searchString) {
|
|
670
|
-
return
|
|
599
|
+
return searchString?.length >= 3 ? `&search_term=${encodeURIComponent(searchString)}` : '';
|
|
671
600
|
}
|
|
672
601
|
export default RceApiSource;
|