@instructure/canvas-rce 5.14.0 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/DEVELOPMENT.md +1 -1
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/__tests__/sidebar/reducers/all_files.test.js +28 -0
- package/babel.config.js +3 -1
- package/build.sh +7 -7
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +25 -38
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +8 -10
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +77 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/publish_to_npm.sh +1 -1
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/common/components/FileTree/File.js +0 -64
- package/es/common/components/FileTree/Folder.js +0 -110
- package/es/common/components/FileTree/index.js +0 -84
- package/es/common/components/FileTree/styles.js +0 -72
- package/es/common/components/Loading.js +0 -83
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { Suspense } from 'react';
|
|
19
20
|
import { Spinner } from '@instructure/ui-spinner';
|
|
20
21
|
import formatMessage from '../../../format-message';
|
|
@@ -27,19 +28,18 @@ const thePanels = {
|
|
|
27
28
|
media: /*#__PURE__*/React.lazy(() => import('../instructure_record/MediaPanel')),
|
|
28
29
|
all: /*#__PURE__*/React.lazy(() => import('./RceFileBrowser')),
|
|
29
30
|
unknown: /*#__PURE__*/React.lazy(() => import('./UnknownFileTypePanel'))
|
|
30
|
-
};
|
|
31
|
-
// pulled from useLazy's cache
|
|
31
|
+
};
|
|
32
32
|
|
|
33
|
+
// Returns a Suspense wrapped lazy loaded component
|
|
34
|
+
// pulled from useLazy's cache
|
|
33
35
|
export function DynamicPanel(props) {
|
|
34
36
|
let key = '';
|
|
35
|
-
|
|
36
37
|
if (props.contentType === 'links') {
|
|
37
38
|
key = 'links';
|
|
38
39
|
} else {
|
|
39
40
|
key = props.contentSubtype in thePanels ? props.contentSubtype : 'unknown';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
}
|
|
42
|
+
// @ts-expect-error
|
|
43
43
|
const Component = thePanels[key];
|
|
44
44
|
return /*#__PURE__*/React.createElement(Suspense, {
|
|
45
45
|
fallback: /*#__PURE__*/React.createElement(Spinner, {
|
|
@@ -164,14 +164,11 @@ export const FILTER_SETTINGS_BY_PLUGIN = {
|
|
|
164
164
|
};
|
|
165
165
|
export function isLoading(sprops) {
|
|
166
166
|
var _sprops$collections$a, _sprops$collections$a2, _sprops$collections$d, _sprops$collections$m, _sprops$collections$q, _sprops$collections$w, _sprops$documents$cou, _sprops$documents$use, _sprops$documents$gro, _sprops$media$course, _sprops$media$user, _sprops$media$group, _sprops$all_files;
|
|
167
|
-
|
|
168
167
|
return ((_sprops$collections$a = sprops.collections.announcements) === null || _sprops$collections$a === void 0 ? void 0 : _sprops$collections$a.isLoading) || ((_sprops$collections$a2 = sprops.collections.assignments) === null || _sprops$collections$a2 === void 0 ? void 0 : _sprops$collections$a2.isLoading) || ((_sprops$collections$d = sprops.collections.discussions) === null || _sprops$collections$d === void 0 ? void 0 : _sprops$collections$d.isLoading) || ((_sprops$collections$m = sprops.collections.modules) === null || _sprops$collections$m === void 0 ? void 0 : _sprops$collections$m.isLoading) || ((_sprops$collections$q = sprops.collections.quizzes) === null || _sprops$collections$q === void 0 ? void 0 : _sprops$collections$q.isLoading) || ((_sprops$collections$w = sprops.collections.wikiPages) === null || _sprops$collections$w === void 0 ? void 0 : _sprops$collections$w.isLoading) || ((_sprops$documents$cou = sprops.documents.course) === null || _sprops$documents$cou === void 0 ? void 0 : _sprops$documents$cou.isLoading) || ((_sprops$documents$use = sprops.documents.user) === null || _sprops$documents$use === void 0 ? void 0 : _sprops$documents$use.isLoading) || ((_sprops$documents$gro = sprops.documents.group) === null || _sprops$documents$gro === void 0 ? void 0 : _sprops$documents$gro.isLoading) || ((_sprops$media$course = sprops.media.course) === null || _sprops$media$course === void 0 ? void 0 : _sprops$media$course.isLoading) || ((_sprops$media$user = sprops.media.user) === null || _sprops$media$user === void 0 ? void 0 : _sprops$media$user.isLoading) || ((_sprops$media$group = sprops.media.group) === null || _sprops$media$group === void 0 ? void 0 : _sprops$media$group.isLoading) || ((_sprops$all_files = sprops.all_files) === null || _sprops$all_files === void 0 ? void 0 : _sprops$all_files.isLoading);
|
|
169
168
|
}
|
|
170
|
-
|
|
171
169
|
function renderLoading() {
|
|
172
170
|
return formatMessage('Loading');
|
|
173
171
|
}
|
|
174
|
-
|
|
175
172
|
export const UploadCanvasPanelIds = ['user_documents', 'course_documents', 'group_documents', 'user_images', 'course_images', 'group_images', 'user_media', 'course_media', 'group_media', 'course_links', 'group_links', 'list_icon_maker_icons', 'all'];
|
|
176
173
|
export const CanvasPanelTitles = {
|
|
177
174
|
user_documents: formatMessage('User Documents'),
|
|
@@ -15,19 +15,16 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
const DEFAULT_TARGET_QUALITY = 0.75;
|
|
19
20
|
export const MAX_IMAGE_SIZE_BYTES = 500 * 1024;
|
|
20
|
-
|
|
21
21
|
function blobToBase64(blob) {
|
|
22
22
|
return new Promise(resolve => {
|
|
23
23
|
const reader = new FileReader();
|
|
24
|
-
|
|
25
24
|
reader.onloadend = () => resolve(reader.result);
|
|
26
|
-
|
|
27
25
|
reader.readAsDataURL(blob);
|
|
28
26
|
});
|
|
29
27
|
}
|
|
30
|
-
|
|
31
28
|
function drawImageOnCanvasElement(_ref) {
|
|
32
29
|
let {
|
|
33
30
|
image,
|
|
@@ -42,7 +39,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
42
39
|
height
|
|
43
40
|
} = image;
|
|
44
41
|
let compressedImageWidth, compressedImageHeight;
|
|
45
|
-
|
|
46
42
|
if (width > previewWidth || height > previewHeight) {
|
|
47
43
|
if (width > height) {
|
|
48
44
|
compressedImageWidth = previewWidth;
|
|
@@ -54,7 +50,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
54
50
|
compressedImageWidth = compressedImageHeight = previewHeight;
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
|
-
|
|
58
53
|
const canvas = document.createElement('canvas');
|
|
59
54
|
canvas.width = compressedImageWidth;
|
|
60
55
|
canvas.height = compressedImageHeight;
|
|
@@ -62,7 +57,6 @@ function drawImageOnCanvasElement(_ref) {
|
|
|
62
57
|
ctx.drawImage(image, 0, 0, compressedImageWidth, compressedImageHeight);
|
|
63
58
|
canvas.toBlob(blob => blob ? resolve(blob) : reject(blob), 'image/jpeg', quality);
|
|
64
59
|
}
|
|
65
|
-
|
|
66
60
|
export function canCompressImage() {
|
|
67
61
|
// Some old browsers don't support toBlob
|
|
68
62
|
return Boolean(document.createElement('canvas').toBlob);
|
|
@@ -83,7 +77,6 @@ export function compressImage(_ref3) {
|
|
|
83
77
|
return new Promise((resolve, reject) => {
|
|
84
78
|
const image = new Image();
|
|
85
79
|
image.src = encodedImage;
|
|
86
|
-
|
|
87
80
|
image.onload = function () {
|
|
88
81
|
drawImageOnCanvasElement({
|
|
89
82
|
image,
|
|
@@ -15,12 +15,12 @@
|
|
|
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 moment from 'moment-timezone';
|
|
19
20
|
export const applyTimezoneOffsetToDate = (date, targetTimezone) => {
|
|
20
21
|
if (!targetTimezone) {
|
|
21
22
|
return moment(date).toDate();
|
|
22
23
|
}
|
|
23
|
-
|
|
24
24
|
const currentTimezoneOffset = moment(date).utcOffset();
|
|
25
25
|
const expectedTimezoneOffset = moment.tz(date, targetTimezone).utcOffset();
|
|
26
26
|
const totalOffset = expectedTimezoneOffset - currentTimezoneOffset;
|
|
@@ -15,12 +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 getCookie from './get-cookie';
|
|
19
|
-
const csrfToken = getCookie('_csrf_token');
|
|
20
|
+
const csrfToken = getCookie('_csrf_token');
|
|
21
|
+
|
|
22
|
+
// these are duplicated in application_helper.rb#prefetch_xhr
|
|
20
23
|
// because we don't have a good pattern for sharing them yet.
|
|
21
24
|
// If you change these defaults, you should probably cascade that change
|
|
22
25
|
// to that ruby location
|
|
23
|
-
|
|
24
26
|
export const defaultFetchOptions = () => ({
|
|
25
27
|
credentials: 'same-origin',
|
|
26
28
|
headers: {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
3
|
*
|
|
@@ -17,10 +15,11 @@
|
|
|
17
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
17
|
*/
|
|
18
|
+
|
|
19
|
+
// @ts-expect-error
|
|
20
20
|
import parseLinkHeader from './parse-link-header';
|
|
21
21
|
import { defaultFetchOptions } from './defaultFetchOptions';
|
|
22
22
|
import { toQueryString } from './query-string-encoding';
|
|
23
|
-
|
|
24
23
|
function constructRelativeUrl(_ref) {
|
|
25
24
|
let {
|
|
26
25
|
path,
|
|
@@ -29,8 +28,9 @@ function constructRelativeUrl(_ref) {
|
|
|
29
28
|
const queryString = toQueryString(params);
|
|
30
29
|
if (queryString.length === 0) return path;
|
|
31
30
|
return path + '?' + queryString;
|
|
32
|
-
}
|
|
31
|
+
}
|
|
33
32
|
|
|
33
|
+
// https://fetch.spec.whatwg.org/#requestinit
|
|
34
34
|
|
|
35
35
|
// NOTE: we do NOT deep-merge customFetchOptions.headers, they should be passed
|
|
36
36
|
// in the headers arg instead.
|
|
@@ -43,14 +43,13 @@ export default async function doFetchApi(_ref2) {
|
|
|
43
43
|
body,
|
|
44
44
|
fetchOpts = {}
|
|
45
45
|
} = _ref2;
|
|
46
|
-
const finalFetchOptions = {
|
|
46
|
+
const finalFetchOptions = {
|
|
47
|
+
...defaultFetchOptions()
|
|
47
48
|
};
|
|
48
|
-
|
|
49
49
|
if (body && typeof body !== 'string') {
|
|
50
50
|
body = JSON.stringify(body);
|
|
51
51
|
finalFetchOptions.headers['Content-Type'] = 'application/json';
|
|
52
52
|
}
|
|
53
|
-
|
|
54
53
|
Object.assign(finalFetchOptions.headers, headers);
|
|
55
54
|
Object.assign(finalFetchOptions, fetchOpts);
|
|
56
55
|
const url = constructRelativeUrl({
|
|
@@ -61,18 +60,16 @@ export default async function doFetchApi(_ref2) {
|
|
|
61
60
|
body,
|
|
62
61
|
method,
|
|
63
62
|
...finalFetchOptions,
|
|
63
|
+
// eslint-disable-next-line no-undef
|
|
64
64
|
credentials: finalFetchOptions.credentials
|
|
65
65
|
});
|
|
66
|
-
|
|
67
66
|
if (!response.ok) {
|
|
68
67
|
const err = new Error(`doFetchApi received a bad response: ${response.status} ${response.statusText}`);
|
|
69
68
|
Object.assign(err, {
|
|
70
69
|
response
|
|
71
70
|
}); // in case anyone wants to check it for something
|
|
72
|
-
|
|
73
71
|
throw err;
|
|
74
72
|
}
|
|
75
|
-
|
|
76
73
|
const linkHeader = response.headers.get('Link');
|
|
77
74
|
const link = linkHeader && parseLinkHeader(linkHeader) || undefined;
|
|
78
75
|
const text = await response.text();
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import doFetchApi from './doFetchApi';
|
|
19
20
|
export * from './get-cookie';
|
|
20
21
|
export * from './parse-link-header';
|
|
@@ -15,29 +15,26 @@
|
|
|
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
|
// based on https://github.com/thlorenz/parse-link-header/blob/master/index.js (MIT)
|
|
20
|
+
|
|
19
21
|
function parseQueryParams(linkUrl) {
|
|
20
22
|
const queryParams = {};
|
|
21
23
|
const urlParts = linkUrl.split('?');
|
|
22
|
-
|
|
23
24
|
if (urlParts.length > 1) {
|
|
24
25
|
urlParts[1].split('&').forEach(param => {
|
|
25
26
|
const [key, value] = param.split('=');
|
|
26
27
|
queryParams[key] = decodeURIComponent(value);
|
|
27
28
|
});
|
|
28
29
|
}
|
|
29
|
-
|
|
30
30
|
return queryParams;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
32
|
function parseLink(link) {
|
|
34
33
|
try {
|
|
35
34
|
const linkMatch = link.match(/<([^>]*)>\s*(.*)/);
|
|
36
|
-
|
|
37
35
|
if (!linkMatch) {
|
|
38
36
|
return null;
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
const [, linkUrl, partsString] = linkMatch;
|
|
42
39
|
const parts = partsString.split(';').map(part => part.trim());
|
|
43
40
|
const info = {
|
|
@@ -45,46 +42,40 @@ function parseLink(link) {
|
|
|
45
42
|
};
|
|
46
43
|
parts.forEach(part => {
|
|
47
44
|
const partMatch = part.match(/(.+)\s*=\s*"?([^"]+)"?/);
|
|
48
|
-
|
|
49
45
|
if (partMatch) {
|
|
50
46
|
const [, key, value] = partMatch;
|
|
51
47
|
info[key.trim()] = value.trim();
|
|
52
48
|
}
|
|
53
49
|
});
|
|
54
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
...parseQueryParams(linkUrl),
|
|
55
52
|
...info
|
|
56
53
|
};
|
|
57
54
|
} catch (e) {
|
|
58
55
|
return null;
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
|
-
|
|
62
58
|
function hasRel(x) {
|
|
63
59
|
return x !== null && 'rel' in x;
|
|
64
60
|
}
|
|
65
|
-
|
|
66
61
|
function intoRels(acc, x) {
|
|
67
62
|
x.rel.split(/\s+/).forEach(rel => {
|
|
68
|
-
const {
|
|
63
|
+
const {
|
|
64
|
+
...rest
|
|
69
65
|
} = x;
|
|
70
|
-
|
|
71
66
|
switch (rel) {
|
|
72
67
|
case 'first':
|
|
73
68
|
acc.first = rest;
|
|
74
69
|
break;
|
|
75
|
-
|
|
76
70
|
case 'prev':
|
|
77
71
|
acc.prev = rest;
|
|
78
72
|
break;
|
|
79
|
-
|
|
80
73
|
case 'current':
|
|
81
74
|
acc.current = rest;
|
|
82
75
|
break;
|
|
83
|
-
|
|
84
76
|
case 'next':
|
|
85
77
|
acc.next = rest;
|
|
86
78
|
break;
|
|
87
|
-
|
|
88
79
|
case 'last':
|
|
89
80
|
acc.last = rest;
|
|
90
81
|
break;
|
|
@@ -92,13 +83,10 @@ function intoRels(acc, x) {
|
|
|
92
83
|
});
|
|
93
84
|
return acc;
|
|
94
85
|
}
|
|
95
|
-
|
|
96
86
|
const PARSE_LINK_HEADER_MAXLEN = 2000;
|
|
97
87
|
const PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED = process.env.PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED != null;
|
|
98
|
-
|
|
99
88
|
function checkHeader(linkHeader) {
|
|
100
89
|
if (!linkHeader) return false;
|
|
101
|
-
|
|
102
90
|
if (linkHeader.length > PARSE_LINK_HEADER_MAXLEN) {
|
|
103
91
|
if (PARSE_LINK_HEADER_THROW_ON_MAXLEN_EXCEEDED) {
|
|
104
92
|
throw new Error(`Input string too long, it should be under ${PARSE_LINK_HEADER_MAXLEN} characters.`);
|
|
@@ -106,10 +94,8 @@ function checkHeader(linkHeader) {
|
|
|
106
94
|
return false;
|
|
107
95
|
}
|
|
108
96
|
}
|
|
109
|
-
|
|
110
97
|
return true;
|
|
111
98
|
}
|
|
112
|
-
|
|
113
99
|
export default function parseLinkHeader(linkHeader) {
|
|
114
100
|
if (!checkHeader(linkHeader)) return null;
|
|
115
101
|
return linkHeader.split(/,\s*(?=<)/).map(parseLink).filter(hasRel).reduce(intoRels, {});
|
|
@@ -15,19 +15,22 @@
|
|
|
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
|
// toQueryString does what jQuery's .param() does, only without having to bring in
|
|
19
20
|
// all of jQuery.
|
|
21
|
+
|
|
20
22
|
// URLSearchParams turns arrays into queries like a=1,2,3
|
|
21
23
|
// But our jQuery makes the older "PHP" style like a[]=1&a[]=2&a[]=3
|
|
22
24
|
// JQuery also magically deals with parameters that are functions, and recursive
|
|
23
25
|
// objects within objects, {a: 1, b: {c: 2, d: 3}, e: 4} => a=1&b[c]=2&b[d]=3&e=4
|
|
24
26
|
// ... so we have to do a lot of massaging with the params object before using it
|
|
25
27
|
// So fun!
|
|
28
|
+
|
|
26
29
|
export function toQueryString(params) {
|
|
27
|
-
const paramsWithIndexes = [];
|
|
30
|
+
const paramsWithIndexes = [];
|
|
28
31
|
|
|
32
|
+
// fix up the array/object indexes to match the PHP standard
|
|
29
33
|
const fixIndexes = elt => [elt[0].replace(/\[\d+\]$/, '[]').replace(/{/g, '[').replace(/}/g, ']'), elt[1]];
|
|
30
|
-
|
|
31
34
|
function serialize(k, elt, suffix) {
|
|
32
35
|
if (elt instanceof Function) {
|
|
33
36
|
paramsWithIndexes.push([k + suffix, elt()]);
|
|
@@ -45,7 +48,6 @@ export function toQueryString(params) {
|
|
|
45
48
|
paramsWithIndexes.push([k + suffix, elt]);
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
|
-
|
|
49
51
|
Object.keys(params).forEach(k => serialize(k, params[k], ''));
|
|
50
52
|
return new URLSearchParams(paramsWithIndexes.map(fixIndexes)).toString();
|
|
51
53
|
}
|
|
@@ -31,10 +31,12 @@ export const fileShape = {
|
|
|
31
31
|
locked_for_user: bool,
|
|
32
32
|
published: bool
|
|
33
33
|
};
|
|
34
|
-
export const imageShape = {
|
|
34
|
+
export const imageShape = {
|
|
35
|
+
...fileShape,
|
|
35
36
|
thumbnail_url: string
|
|
36
37
|
};
|
|
37
|
-
export const mediaObjectShape = {
|
|
38
|
+
export const mediaObjectShape = {
|
|
39
|
+
...imageShape,
|
|
38
40
|
title: string.isRequired,
|
|
39
41
|
embedded_iframe_url: string,
|
|
40
42
|
media_entry_id: string
|
|
@@ -76,32 +78,26 @@ export const mediaQueryReturnShape = {
|
|
|
76
78
|
isLoading: bool,
|
|
77
79
|
error: string
|
|
78
80
|
};
|
|
79
|
-
|
|
80
81
|
function createContentTrayDocumentShape(isRequired) {
|
|
81
82
|
return function validateContentTrayDocuments(props, propName, componentName) {
|
|
82
83
|
const p = props[propName];
|
|
83
|
-
|
|
84
84
|
if (!p) {
|
|
85
85
|
if (isRequired) {
|
|
86
86
|
if (!p) {
|
|
87
87
|
return new Error(`Required prop \`${propName}\` not supplied to \`${componentName}\`. Validation failed.`);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
|
|
91
90
|
return undefined;
|
|
92
91
|
} else {
|
|
93
92
|
const files = p.user || p.course || p.group || p.User || p.Course || p.Group;
|
|
94
|
-
|
|
95
93
|
if (!files) {
|
|
96
94
|
return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. Missing "user"|"course"|"group" key.`);
|
|
97
95
|
}
|
|
98
|
-
|
|
99
96
|
if ('searchString' in p) {
|
|
100
97
|
if (!(typeof p.searchString === 'string')) {
|
|
101
98
|
return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. "searchString" must be a string.`);
|
|
102
99
|
}
|
|
103
100
|
}
|
|
104
|
-
|
|
105
101
|
if (propName === 'documents') {
|
|
106
102
|
checkPropTypes({
|
|
107
103
|
docs: shape(documentQueryReturnShape)
|
|
@@ -124,6 +120,5 @@ function createContentTrayDocumentShape(isRequired) {
|
|
|
124
120
|
}
|
|
125
121
|
};
|
|
126
122
|
}
|
|
127
|
-
|
|
128
123
|
export const contentTrayDocumentShape = createContentTrayDocumentShape(false);
|
|
129
124
|
contentTrayDocumentShape.isRequired = createContentTrayDocumentShape(true);
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
import { absoluteToRelativeUrl } from '../../../common/fileUrl';
|
|
20
20
|
import { IconAudioLine, IconDocumentLine, IconMsExcelLine, IconMsPptLine, IconMsWordLine, IconPdfLine, IconVideoLine } from '@instructure/ui-icons';
|
|
21
21
|
import RCEGlobals from '../../RCEGlobals';
|
|
@@ -25,26 +25,21 @@ export function getIconFromType(type) {
|
|
|
25
25
|
} else if (isAudio(type)) {
|
|
26
26
|
return IconAudioLine;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
28
|
switch (type) {
|
|
30
29
|
case 'application/msword':
|
|
31
30
|
case 'application/vnd.apple.pages':
|
|
32
31
|
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
|
|
33
32
|
return IconMsWordLine;
|
|
34
|
-
|
|
35
33
|
case 'application/vnd.ms-powerpoint':
|
|
36
34
|
case 'application/vnd.apple.keynote':
|
|
37
35
|
case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
|
|
38
36
|
return IconMsPptLine;
|
|
39
|
-
|
|
40
37
|
case 'application/pdf':
|
|
41
38
|
return IconPdfLine;
|
|
42
|
-
|
|
43
39
|
case 'application/vnd.ms-excel':
|
|
44
40
|
case 'application/vnd.apple.numbers':
|
|
45
41
|
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
|
|
46
42
|
return IconMsExcelLine;
|
|
47
|
-
|
|
48
43
|
default:
|
|
49
44
|
return IconDocumentLine;
|
|
50
45
|
}
|
|
@@ -70,72 +65,67 @@ export function isIWork(filename) {
|
|
|
70
65
|
export function getIWorkType(filename) {
|
|
71
66
|
const tokens = filename.split('.');
|
|
72
67
|
if (tokens.length <= 1) return '';
|
|
73
|
-
const lastToken = tokens[tokens.length - 1];
|
|
74
|
-
|
|
75
|
-
switch (lastToken.toLowerCase()) {
|
|
68
|
+
const lastToken = tokens[tokens.length - 1].toLowerCase();
|
|
69
|
+
switch (lastToken) {
|
|
76
70
|
case 'pages':
|
|
77
71
|
return 'application/vnd.apple.pages';
|
|
78
|
-
|
|
79
72
|
case 'key':
|
|
80
73
|
return 'application/vnd.apple.keynote';
|
|
81
|
-
|
|
82
74
|
case 'numbers':
|
|
83
75
|
return 'application/vnd.apple.numbers';
|
|
84
|
-
|
|
85
76
|
default:
|
|
86
77
|
return '';
|
|
87
78
|
}
|
|
88
79
|
}
|
|
89
80
|
export function mediaPlayerURLFromFile(file, canvasOrigin) {
|
|
90
81
|
var _RCEGlobals$getFeatur;
|
|
91
|
-
|
|
92
82
|
// why oh why aren't we consistent?
|
|
93
83
|
const content_type = file['content-type'] || file.content_type || file.type;
|
|
84
|
+
if (typeof content_type !== 'string') throw new Error('Invalid content type');
|
|
94
85
|
const type = content_type.replace(/\/.*$/, '');
|
|
95
|
-
|
|
86
|
+
const baseOrigin = canvasOrigin !== null && canvasOrigin !== void 0 ? canvasOrigin : window.location.origin;
|
|
96
87
|
if ((_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur !== void 0 && _RCEGlobals$getFeatur.media_links_use_attachment_id && isAudioOrVideo(content_type) && file.id) {
|
|
97
88
|
var _RCEGlobals$getFeatur2;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
url.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (file.uuid && (file.contextType == 'User' || !!canvasOrigin && canvasOrigin !== window.location.origin && (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.file_verifiers_for_quiz_links)) {
|
|
104
|
-
url.query.verifier = file.uuid;
|
|
89
|
+
const url = new URL(`/media_attachments_iframe/${file.id}`, baseOrigin);
|
|
90
|
+
url.searchParams.set('type', type);
|
|
91
|
+
url.searchParams.set('embedded', 'true');
|
|
92
|
+
if (file.uuid && (file.contextType === 'User' || canvasOrigin && canvasOrigin !== window.location.origin && (_RCEGlobals$getFeatur2 = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur2 !== void 0 && _RCEGlobals$getFeatur2.file_verifiers_for_quiz_links)) {
|
|
93
|
+
url.searchParams.set('verifier', file.uuid);
|
|
105
94
|
} else if (file.url || file.href) {
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
95
|
+
const href = file.url || file.href;
|
|
96
|
+
if (typeof href !== 'string') {
|
|
97
|
+
throw new Error('Invalid URL');
|
|
98
|
+
}
|
|
99
|
+
const parsedUrl = new URL(href, baseOrigin);
|
|
100
|
+
const verifier = parsedUrl.searchParams.get('verifier');
|
|
101
|
+
if (verifier) {
|
|
102
|
+
url.searchParams.set('verifier', verifier);
|
|
110
103
|
}
|
|
111
104
|
}
|
|
112
|
-
|
|
113
|
-
return format(url);
|
|
105
|
+
return url.toString().replace(baseOrigin, '');
|
|
114
106
|
}
|
|
115
|
-
|
|
116
107
|
if (file.embedded_iframe_url) {
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return `${absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin)}`;
|
|
108
|
+
const embedUrl = new URL(file.embedded_iframe_url, baseOrigin);
|
|
109
|
+
if (embedUrl.searchParams.has('type')) {
|
|
110
|
+
return absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin);
|
|
121
111
|
}
|
|
122
|
-
|
|
123
|
-
return `${
|
|
112
|
+
const relative = absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin);
|
|
113
|
+
return `${relative}?type=${type}`;
|
|
124
114
|
}
|
|
125
|
-
|
|
126
115
|
if (isAudioOrVideo(content_type)) {
|
|
127
116
|
var _file$embed;
|
|
128
|
-
|
|
129
117
|
const mediaEntryId = file.media_entry_id || ((_file$embed = file.embed) === null || _file$embed === void 0 ? void 0 : _file$embed.id) || file.mediaEntryId;
|
|
130
|
-
|
|
131
118
|
if (mediaEntryId && mediaEntryId !== 'maybe') {
|
|
132
119
|
return `/media_objects_iframe/${mediaEntryId}?type=${type}`;
|
|
133
120
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
121
|
+
const href = file.url || file.href;
|
|
122
|
+
if (typeof href !== 'string') {
|
|
123
|
+
throw new Error('Invalid URL');
|
|
124
|
+
}
|
|
125
|
+
const parsedUrl = new URL(href, baseOrigin);
|
|
126
|
+
const verifier = parsedUrl.searchParams.get('verifier');
|
|
127
|
+
const verifierParam = verifier ? `&verifier=${verifier}` : '';
|
|
128
|
+
return `/media_objects_iframe?mediahref=${parsedUrl.pathname}${verifierParam}&type=${type}`;
|
|
138
129
|
}
|
|
139
|
-
|
|
140
130
|
return undefined;
|
|
141
131
|
}
|
|
@@ -15,11 +15,10 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
export const convertFileToBase64 = blob => new Promise((resolve, reject) => {
|
|
19
20
|
const reader = new FileReader();
|
|
20
21
|
reader.readAsDataURL(blob);
|
|
21
|
-
|
|
22
22
|
reader.onload = () => resolve(reader.result);
|
|
23
|
-
|
|
24
23
|
reader.onerror = error => reject(error);
|
|
25
24
|
});
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import { SVGIcon } from '@instructure/ui-svg-images';
|
|
20
21
|
import { IconAssignmentLine, IconDiscussionLine, IconModuleLine, IconQuizLine, IconQuizSolid as IconNewQuiz, IconAnnouncementLine, IconDocumentLine } from '@instructure/ui-icons';
|
|
@@ -31,28 +32,20 @@ export const getIcon = type => {
|
|
|
31
32
|
switch (type) {
|
|
32
33
|
case 'assignments':
|
|
33
34
|
return IconAssignmentLine;
|
|
34
|
-
|
|
35
35
|
case 'discussions':
|
|
36
36
|
return IconDiscussionLine;
|
|
37
|
-
|
|
38
37
|
case 'modules':
|
|
39
38
|
return IconModuleLine;
|
|
40
|
-
|
|
41
39
|
case 'quizzes':
|
|
42
40
|
return IconQuizLine;
|
|
43
|
-
|
|
44
41
|
case 'quizzes.next':
|
|
45
42
|
return IconNewQuiz;
|
|
46
|
-
|
|
47
43
|
case 'announcements':
|
|
48
44
|
return IconAnnouncementLine;
|
|
49
|
-
|
|
50
45
|
case 'wikiPages':
|
|
51
46
|
return IconDocumentLine;
|
|
52
|
-
|
|
53
47
|
case 'navigation':
|
|
54
48
|
return IconBlank;
|
|
55
|
-
|
|
56
49
|
default:
|
|
57
50
|
return IconDocumentLine;
|
|
58
51
|
}
|
|
@@ -61,28 +54,20 @@ export const getFriendlyLinkType = type => {
|
|
|
61
54
|
switch (type) {
|
|
62
55
|
case 'assignments':
|
|
63
56
|
return formatMessage('Assignment');
|
|
64
|
-
|
|
65
57
|
case 'discussions':
|
|
66
58
|
return formatMessage('Discussion');
|
|
67
|
-
|
|
68
59
|
case 'modules':
|
|
69
60
|
return formatMessage('Module');
|
|
70
|
-
|
|
71
61
|
case 'quizzes':
|
|
72
62
|
return formatMessage('Quiz');
|
|
73
|
-
|
|
74
63
|
case 'quizzes.next':
|
|
75
64
|
return formatMessage('New Quiz');
|
|
76
|
-
|
|
77
65
|
case 'announcements':
|
|
78
66
|
return formatMessage('Announcement');
|
|
79
|
-
|
|
80
67
|
case 'wikiPages':
|
|
81
68
|
return formatMessage('Page');
|
|
82
|
-
|
|
83
69
|
case 'navigation':
|
|
84
70
|
return formatMessage('Navigation');
|
|
85
|
-
|
|
86
71
|
default:
|
|
87
72
|
return '';
|
|
88
73
|
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
export default function round(number) {
|
|
19
20
|
let decimalDigits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
|
|
20
21
|
if (decimalDigits < 0) throw new Error('decimal digits must be >= 0');
|
|
@@ -15,17 +15,18 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
const MASQUERADE_SELECTOR = 'body.is-masquerading-or-student-view';
|
|
19
|
-
let trayHeight = null;
|
|
20
|
+
let trayHeight = null;
|
|
21
|
+
|
|
22
|
+
// Adjusts the height that slide-out trays should take up based on the presence
|
|
20
23
|
// or absence of the masquerade bottom bar. Caches the result of this check
|
|
21
24
|
// forever, since we always reload the bundle when you enter/leave masquerade.
|
|
22
|
-
|
|
23
25
|
export const getTrayHeight = () => {
|
|
24
26
|
if (!trayHeight) {
|
|
25
27
|
const masqueradeBar = document.querySelector(MASQUERADE_SELECTOR);
|
|
26
28
|
trayHeight = masqueradeBar ? 'calc(100vh - 50px)' : '100vh';
|
|
27
29
|
}
|
|
28
|
-
|
|
29
30
|
return trayHeight;
|
|
30
31
|
};
|
|
31
32
|
export const isExternalUrl = url => {
|