@instructure/canvas-rce 5.14.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/DEVELOPMENT.md +1 -1
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +12 -34
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +8 -10
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +76 -81
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/styleMock.js +0 -18
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -15,17 +15,21 @@
|
|
|
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 ReactDOM from 'react-dom';
|
|
20
21
|
import formatMessage from '../format-message';
|
|
21
22
|
import { Spinner } from '@instructure/ui-spinner';
|
|
22
23
|
import { getData, setData } from './jqueryish_funcs';
|
|
23
|
-
export const previewableMimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.writer', 'application/excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/rtf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.sun.xml.impress', 'application/vnd.sun.xml.calc', 'application/vnd.ms-excel', 'application/msword', 'application/mspowerpoint', 'application/rtf', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'text/plain', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/postscript', 'application/pdf', 'application/vnd.ms-powerpoint'];
|
|
24
|
-
// ex: isPreviewable("application/mspowerpoint") -> true
|
|
24
|
+
export const previewableMimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.sun.xml.writer', 'application/excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/rtf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'application/vnd.sun.xml.impress', 'application/vnd.sun.xml.calc', 'application/vnd.ms-excel', 'application/msword', 'application/mspowerpoint', 'application/rtf', 'application/vnd.oasis.opendocument.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'text/plain', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/postscript', 'application/pdf', 'application/vnd.ms-powerpoint'];
|
|
25
25
|
|
|
26
|
+
// check to see if a file of a certan mimeType is previewable inline in the browser
|
|
27
|
+
// ex: isPreviewable("application/mspowerpoint") -> true
|
|
26
28
|
export function isPreviewable(mimeType) {
|
|
27
29
|
return previewableMimeTypes.includes(mimeType);
|
|
28
|
-
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Show a loading spinner
|
|
29
33
|
// The typical use is to show the spinner next to a canvas file link
|
|
30
34
|
// while the inline preview is loading. It's also used when previewing
|
|
31
35
|
// student submitted files in speedgrader, in which case $link is really
|
|
@@ -35,7 +39,6 @@ export function isPreviewable(mimeType) {
|
|
|
35
39
|
//
|
|
36
40
|
// $link: the DOM node that serves as the reference for locating the spinner
|
|
37
41
|
// position: one of 'adjacent' or 'centered'
|
|
38
|
-
|
|
39
42
|
export function showLoadingImage($link) {
|
|
40
43
|
let position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'adjacent';
|
|
41
44
|
const dir = $link && window.getComputedStyle($link).direction || 'ltr';
|
|
@@ -50,7 +53,6 @@ export function showLoadingImage($link) {
|
|
|
50
53
|
const list = getData($link, 'loading_images') || [];
|
|
51
54
|
list.push($imageHolder);
|
|
52
55
|
setData($link, 'loading_images', list);
|
|
53
|
-
|
|
54
56
|
if (!$link.style.position || $link.style.position === 'static') {
|
|
55
57
|
const top = `${boundingBox.top + window.scrollY + (position === 'adjacent' ? 0 : boundingBox.height / 2)}px`;
|
|
56
58
|
const left = `${offsetLeft}px`;
|
|
@@ -62,8 +64,7 @@ export function showLoadingImage($link) {
|
|
|
62
64
|
$imageHolder.setAttribute('style', `z-index:${zIndex}; position: absolute; top: ${top}; left: ${left}; margin-inline-start:${imageMarginInlineStart}; margin-top: ${imageMarginTop}`);
|
|
63
65
|
$link.appendChild($imageHolder);
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
ReactDOM.render( /*#__PURE__*/React.createElement(Spinner, {
|
|
67
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(Spinner, {
|
|
67
68
|
size: "x-small",
|
|
68
69
|
renderTitle: formatMessage('Loading')
|
|
69
70
|
}), $imageHolder);
|
|
@@ -71,7 +72,6 @@ export function showLoadingImage($link) {
|
|
|
71
72
|
}
|
|
72
73
|
export function removeLoadingImage($link) {
|
|
73
74
|
var _$link$querySelector;
|
|
74
|
-
|
|
75
75
|
(_$link$querySelector = $link.querySelector('.loading_image')) === null || _$link$querySelector === void 0 ? void 0 : _$link$querySelector.remove();
|
|
76
76
|
const list = getData($link, 'loading_images') || [];
|
|
77
77
|
list.forEach(item => {
|
|
@@ -95,7 +95,6 @@ export function loadDocPreview($container, options) {
|
|
|
95
95
|
if (!($container instanceof HTMLElement)) {
|
|
96
96
|
throw new Error('loadDocPreview requires a DOM element as first argument');
|
|
97
97
|
}
|
|
98
|
-
|
|
99
98
|
function tellAppIViewedThisInline() {
|
|
100
99
|
// if I have a url to ping back to the app that I viewed this file inline, ping it.
|
|
101
100
|
if (opts.attachment_view_inline_ping_url) {
|
|
@@ -104,7 +103,6 @@ export function loadDocPreview($container, options) {
|
|
|
104
103
|
});
|
|
105
104
|
}
|
|
106
105
|
}
|
|
107
|
-
|
|
108
106
|
if (opts.crocodoc_session_url) {
|
|
109
107
|
const sanitizedUrl = sanitizeUrl(opts.crocodoc_session_url);
|
|
110
108
|
const iframe = document.createElement('iframe');
|
|
@@ -143,12 +141,10 @@ export function loadDocPreview($container, options) {
|
|
|
143
141
|
embedded: true,
|
|
144
142
|
url: opts.public_url
|
|
145
143
|
}).toString()}`;
|
|
146
|
-
|
|
147
144
|
if (!opts.ajax_valid || opts.ajax_valid()) {
|
|
148
145
|
const iframe = document.createElement('iframe');
|
|
149
146
|
iframe.addEventListener('load', () => {
|
|
150
147
|
tellAppIViewedThisInline('google');
|
|
151
|
-
|
|
152
148
|
if (typeof opts.ready === 'function') {
|
|
153
149
|
opts.ready();
|
|
154
150
|
}
|
|
@@ -159,37 +155,33 @@ export function loadDocPreview($container, options) {
|
|
|
159
155
|
$container.appendChild(iframe);
|
|
160
156
|
}
|
|
161
157
|
};
|
|
162
|
-
|
|
163
158
|
if (opts.public_url) {
|
|
164
159
|
loadGooglePreview();
|
|
165
160
|
} else if (opts.attachment_id) {
|
|
166
161
|
let url = `/api/v1/files/${opts.attachment_id}/public_url.json`;
|
|
167
|
-
|
|
168
162
|
if (opts.submission_id) {
|
|
169
163
|
url += '?' + new URLSearchParams({
|
|
170
164
|
submission_id: opts.submission_id
|
|
171
165
|
}).toString();
|
|
172
166
|
}
|
|
173
|
-
|
|
174
167
|
if (opts.verifier) {
|
|
175
168
|
url += `${opts.submission_id ? '&' : '?'}verifier=${opts.verifier}`;
|
|
176
169
|
} else {
|
|
177
170
|
const match = window.location.search.match(/verifier=([^&]+)(?:&|$)/);
|
|
178
171
|
const ver = match && match[1];
|
|
179
|
-
|
|
180
172
|
if (ver) {
|
|
181
173
|
url += `${opts.submission_id ? '&' : '?'}verifier=${ver}`;
|
|
182
174
|
}
|
|
183
175
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
176
|
+
showLoadingImage($container, 'centered');
|
|
177
|
+
// eslint-disable-next-line promise/catch-or-return
|
|
187
178
|
fetch(url).then(response => {
|
|
188
179
|
if (!response.ok) throw new Error(`${response.status}: ${response.statusText}`);
|
|
189
180
|
return response;
|
|
190
181
|
}).then(response => response.json()).then(data => {
|
|
191
182
|
if (data.public_url) {
|
|
192
|
-
opts = {
|
|
183
|
+
opts = {
|
|
184
|
+
...opts,
|
|
193
185
|
...data
|
|
194
186
|
};
|
|
195
187
|
loadGooglePreview();
|
|
@@ -204,31 +196,28 @@ export function loadDocPreview($container, options) {
|
|
|
204
196
|
} else {
|
|
205
197
|
// else fall back with a message that the document can't be viewed inline
|
|
206
198
|
const paragraph = document.createElement('p');
|
|
207
|
-
|
|
208
199
|
if (opts.attachment_preview_processing) {
|
|
209
200
|
paragraph.textContent = formatMessage('The document preview is currently being processed. Please try again later.');
|
|
210
201
|
} else {
|
|
211
202
|
paragraph.textContent = formatMessage('This document cannot be displayed within Canvas.');
|
|
212
203
|
}
|
|
213
|
-
|
|
214
|
-
$container.
|
|
204
|
+
$container.replaceChildren();
|
|
205
|
+
$container.appendChild(paragraph);
|
|
215
206
|
}
|
|
216
207
|
}
|
|
208
|
+
|
|
217
209
|
/**
|
|
218
210
|
* Replaces bad urls with harmless urls in cases where bad urls might cause harm
|
|
219
211
|
* @param {string} url
|
|
220
212
|
*/
|
|
221
|
-
|
|
222
213
|
export function sanitizeUrl(url) {
|
|
223
214
|
const defaultUrl = 'about:blank';
|
|
224
|
-
|
|
225
215
|
try {
|
|
226
|
-
const parsedUrl = new URL(url, window.location.origin);
|
|
227
|
-
|
|
216
|
+
const parsedUrl = new URL(url, window.location.origin);
|
|
217
|
+
// eslint-disable-next-line no-script-url
|
|
228
218
|
if (parsedUrl.protocol === 'javascript:') {
|
|
229
219
|
return defaultUrl;
|
|
230
220
|
}
|
|
231
|
-
|
|
232
221
|
return url;
|
|
233
222
|
} catch (e) {
|
|
234
223
|
// URL() throws TypeError if url is not a valid URL
|
|
@@ -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 { IconDownloadLine } from '@instructure/ui-icons/es/svg';
|
|
19
20
|
import formatMessage from '../format-message';
|
|
20
21
|
import { closest, getData, hide, insertAfter, setData, show } from './jqueryish_funcs';
|
|
@@ -23,10 +24,10 @@ import mediaCommentThumbnail from './media_comment_thumbnail';
|
|
|
23
24
|
import { addParentFrameContextToUrl } from '../rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl';
|
|
24
25
|
import { MathJaxDirective, Mathml } from './mathml';
|
|
25
26
|
import { makeExternalLinkIcon } from './external_links';
|
|
26
|
-
import getTranslations from '../getTranslations';
|
|
27
|
+
import getTranslations from '../getTranslations';
|
|
27
28
|
|
|
29
|
+
// in jest the es directory doesn't exist so stub the undefined svg
|
|
28
30
|
const IconDownloadSVG = (IconDownloadLine === null || IconDownloadLine === void 0 ? void 0 : IconDownloadLine.src) || '<svg></svg>';
|
|
29
|
-
|
|
30
31
|
function makeDownloadButton(download_url, filename) {
|
|
31
32
|
const a = document.createElement('a');
|
|
32
33
|
a.setAttribute('class', 'file_download_btn');
|
|
@@ -47,11 +48,9 @@ function makeDownloadButton(download_url, filename) {
|
|
|
47
48
|
a.appendChild(srspan);
|
|
48
49
|
return a;
|
|
49
50
|
}
|
|
50
|
-
|
|
51
51
|
function handleYoutubeLink($link) {
|
|
52
52
|
const href = $link.getAttribute('href');
|
|
53
53
|
const id = youTubeID(href || '');
|
|
54
|
-
|
|
55
54
|
if (id && !$link.classList.contains('inline_disabled')) {
|
|
56
55
|
const $after = document.createElement('a');
|
|
57
56
|
$after.setAttribute('href', href);
|
|
@@ -97,32 +96,25 @@ function handleYoutubeLink($link) {
|
|
|
97
96
|
insertAfter($after, $link);
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
|
-
|
|
101
99
|
let preview_counter = 0;
|
|
102
|
-
|
|
103
100
|
function previewId() {
|
|
104
101
|
return `preview_${++preview_counter}`;
|
|
105
102
|
}
|
|
106
|
-
|
|
107
103
|
function buildUrl(url) {
|
|
108
104
|
try {
|
|
109
105
|
return new URL(url);
|
|
110
|
-
} catch (e) {
|
|
106
|
+
} catch (e) {
|
|
107
|
+
// Don't raise an error
|
|
111
108
|
}
|
|
112
109
|
}
|
|
113
|
-
|
|
114
110
|
const addResourceIdentifiersToStudioContent = content => {
|
|
115
111
|
content.querySelectorAll('iframe.lti-embed').forEach(iframe => {
|
|
116
112
|
var _userContentContainer, _userContentContainer2;
|
|
117
|
-
|
|
118
113
|
const url = buildUrl(iframe.getAttribute('src'));
|
|
119
|
-
|
|
120
114
|
if (!url || !url.pathname.includes('external_tools/retrieve') || !url.search.includes('instructuremedia.com') || !url.search.includes('custom_arc_media_id')) {
|
|
121
115
|
return;
|
|
122
116
|
}
|
|
123
|
-
|
|
124
117
|
const userContentContainer = iframe.closest('.user_content');
|
|
125
|
-
|
|
126
118
|
if (userContentContainer !== null && userContentContainer !== void 0 && (_userContentContainer = userContentContainer.dataset) !== null && _userContentContainer !== void 0 && _userContentContainer.resourceType && userContentContainer !== null && userContentContainer !== void 0 && (_userContentContainer2 = userContentContainer.dataset) !== null && _userContentContainer2 !== void 0 && _userContentContainer2.resourceId) {
|
|
127
119
|
url.searchParams.set('com_instructure_course_canvas_resource_type', userContentContainer.dataset.resourceType);
|
|
128
120
|
url.searchParams.set('com_instructure_course_canvas_resource_id', userContentContainer.dataset.resourceId);
|
|
@@ -130,7 +122,6 @@ const addResourceIdentifiersToStudioContent = content => {
|
|
|
130
122
|
}
|
|
131
123
|
});
|
|
132
124
|
};
|
|
133
|
-
|
|
134
125
|
export function enhanceUserContent() {
|
|
135
126
|
let container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
|
|
136
127
|
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
@@ -140,19 +131,16 @@ export function enhanceUserContent() {
|
|
|
140
131
|
kalturaSettings,
|
|
141
132
|
disableGooglePreviews,
|
|
142
133
|
canvasLinksTarget,
|
|
143
|
-
|
|
144
134
|
/**
|
|
145
135
|
* For MathML configuration
|
|
146
136
|
*/
|
|
147
137
|
new_math_equation_handling,
|
|
148
138
|
explicit_latex_typesetting,
|
|
149
139
|
locale,
|
|
150
|
-
|
|
151
140
|
/**
|
|
152
141
|
* When used inside of an LTI tool, this contains the canvas global id of the tool.
|
|
153
142
|
*/
|
|
154
143
|
containingCanvasLtiToolId,
|
|
155
|
-
|
|
156
144
|
/**
|
|
157
145
|
* Contingency plan in case new instfs media links cause problems in rich content.
|
|
158
146
|
*/
|
|
@@ -166,12 +154,10 @@ export function enhanceUserContent() {
|
|
|
166
154
|
console.error('Failed loading the language file for', locale, '. Falling back to English.');
|
|
167
155
|
});
|
|
168
156
|
const content = container instanceof HTMLElement && container || document.getElementById('content') || document;
|
|
169
|
-
|
|
170
157
|
const showFilePreviewEx = event => showFilePreview(event, {
|
|
171
158
|
canvasOrigin,
|
|
172
159
|
disableGooglePreviews
|
|
173
160
|
});
|
|
174
|
-
|
|
175
161
|
content.querySelectorAll('.user_content:not(.enhanced)').forEach(elem => {
|
|
176
162
|
elem.classList.add('unenhanced');
|
|
177
163
|
explicit_latex_typesetting && elem.classList.add(MathJaxDirective.Process);
|
|
@@ -186,43 +172,40 @@ export function enhanceUserContent() {
|
|
|
186
172
|
explicit_latex_typesetting && mathml.processNewMathInElem(unenhanced_elem);
|
|
187
173
|
unenhanced_elem.querySelectorAll('img').forEach(img => {
|
|
188
174
|
const src = img.getAttribute('src');
|
|
189
|
-
|
|
190
175
|
if (!/^\/[^/]/.test(src)) {
|
|
191
176
|
return;
|
|
192
|
-
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// if the image file is unpublished it's replaced with the lock image
|
|
193
180
|
// and canvas adds hidden=1 to the URL.
|
|
194
181
|
// we also need to strip the alt text
|
|
195
|
-
|
|
196
|
-
|
|
197
182
|
if (/hidden=1$/.test(src)) {
|
|
198
183
|
img.setAttribute('alt', formatMessage('This image is currently unavailable'));
|
|
199
184
|
}
|
|
200
185
|
});
|
|
201
|
-
setData(unenhanced_elem, 'unenhanced_content_html', unenhanced_elem.innerHTML);
|
|
202
|
-
// use this to show users old links instead
|
|
186
|
+
setData(unenhanced_elem, 'unenhanced_content_html', unenhanced_elem.innerHTML);
|
|
203
187
|
|
|
188
|
+
// If instfs links are causing content problems,
|
|
189
|
+
// use this to show users old links instead
|
|
204
190
|
if (replaceInstFSLinksWithOldLinks) {
|
|
205
191
|
const attributes = ['href', 'src'];
|
|
206
192
|
const selector = '[href], [src]';
|
|
207
193
|
const oldLinkAttribute = 'data-old-link';
|
|
208
194
|
unenhanced_elem.querySelectorAll(selector).forEach(element => {
|
|
209
195
|
const oldLink = element.getAttribute(oldLinkAttribute);
|
|
210
|
-
|
|
211
196
|
if (!oldLink) {
|
|
212
197
|
return;
|
|
213
198
|
}
|
|
214
|
-
|
|
215
199
|
for (const a of attributes) {
|
|
216
200
|
const newLink = element.getAttribute(a);
|
|
217
|
-
|
|
218
201
|
if (newLink && newLink != oldLink) {
|
|
219
202
|
element.setAttribute(a, oldLink);
|
|
220
203
|
}
|
|
221
204
|
}
|
|
222
205
|
});
|
|
223
|
-
}
|
|
224
|
-
|
|
206
|
+
}
|
|
225
207
|
|
|
208
|
+
// guarantee relative links point to canvas
|
|
226
209
|
if (canvasOrigin) {
|
|
227
210
|
const attributes = ['href', 'src'];
|
|
228
211
|
const selector = '[href], [src]';
|
|
@@ -230,38 +213,34 @@ export function enhanceUserContent() {
|
|
|
230
213
|
try {
|
|
231
214
|
for (const a of attributes) {
|
|
232
215
|
const potentialUrl = element.getAttribute(a);
|
|
233
|
-
|
|
234
216
|
if (!/^\/[^/]/.test(potentialUrl)) {
|
|
235
217
|
continue;
|
|
236
218
|
}
|
|
237
|
-
|
|
238
219
|
const absoluteUrl = new URL(potentialUrl, canvasOrigin);
|
|
239
220
|
element.setAttribute(a, absoluteUrl.href);
|
|
240
|
-
|
|
241
221
|
if (canvasLinksTarget && element.tagName === 'A' && (!element.getAttribute('target') || element.getAttribute('target') === '_blank')) {
|
|
242
222
|
element.setAttribute('target', canvasLinksTarget);
|
|
243
223
|
}
|
|
244
224
|
}
|
|
245
|
-
} catch (_ignore) {
|
|
225
|
+
} catch (_ignore) {
|
|
226
|
+
// canvasOrigin probably isn't a valid base url
|
|
246
227
|
}
|
|
247
228
|
});
|
|
248
|
-
}
|
|
249
|
-
|
|
229
|
+
}
|
|
250
230
|
|
|
231
|
+
// add parent_frame_context to canvas iframes to allow them loading inside another LTI tool
|
|
251
232
|
if (containingCanvasLtiToolId != null) {
|
|
252
233
|
unenhanced_elem.querySelectorAll('iframe[src]').forEach(iframeElem => {
|
|
253
234
|
const src = iframeElem.getAttribute('src');
|
|
254
|
-
|
|
255
235
|
if (src.startsWith(canvasOrigin)) {
|
|
256
236
|
iframeElem.setAttribute('src', addParentFrameContextToUrl(src, containingCanvasLtiToolId));
|
|
257
237
|
}
|
|
258
238
|
});
|
|
259
|
-
}
|
|
260
|
-
|
|
239
|
+
}
|
|
261
240
|
|
|
241
|
+
// tell LTI tools that they are launching from within the active RCE
|
|
262
242
|
unenhanced_elem.querySelectorAll('iframe[src]').forEach(iframeElem => {
|
|
263
243
|
const src = iframeElem.getAttribute('src');
|
|
264
|
-
|
|
265
244
|
if (src.startsWith(canvasOrigin)) {
|
|
266
245
|
iframeElem.setAttribute('src', src.replace('display=in_rce', 'display=borderless'));
|
|
267
246
|
}
|
|
@@ -275,9 +254,7 @@ export function enhanceUserContent() {
|
|
|
275
254
|
const $linkSpan = document.createElement('span');
|
|
276
255
|
const $linkText = childLink.innerHTML;
|
|
277
256
|
$linkSpan.innerHTML = $linkText;
|
|
278
|
-
|
|
279
257
|
while (childLink.firstChild) childLink.removeChild(childLink.firstChild);
|
|
280
|
-
|
|
281
258
|
childLink.appendChild($linkSpan);
|
|
282
259
|
const externalLinkIcon = makeExternalLinkIcon(childLink);
|
|
283
260
|
childLink.appendChild(externalLinkIcon);
|
|
@@ -285,21 +262,20 @@ export function enhanceUserContent() {
|
|
|
285
262
|
addResourceIdentifiersToStudioContent(unenhanced_elem);
|
|
286
263
|
});
|
|
287
264
|
content.querySelectorAll('a.instructure_file_link, a.instructure_scribd_file').forEach(file_link => {
|
|
288
|
-
const href = buildUrl(file_link.href);
|
|
265
|
+
const href = buildUrl(file_link.href);
|
|
289
266
|
|
|
267
|
+
// Don't attempt to enhance links with no href
|
|
290
268
|
if (!href) return;
|
|
291
269
|
const matchesCanvasFile = href.pathname.match(/(?:\/(courses|groups|users)\/\d+)?\/files\/([\d~]+)(?=[!*'();:@&=+$,/?#\[\]]|$)/);
|
|
292
|
-
|
|
293
270
|
if (!matchesCanvasFile) {
|
|
294
271
|
// a bug in the new RCE added instructure_file_link class name to all links
|
|
295
272
|
// only proceed if this is a canvas file link
|
|
296
273
|
return;
|
|
297
274
|
}
|
|
298
|
-
|
|
299
275
|
if (file_link.textContent.trim()) {
|
|
300
276
|
file_link.addEventListener('click', showFilePreviewEx);
|
|
301
|
-
const filename = file_link.textContent;
|
|
302
|
-
|
|
277
|
+
const filename = file_link.textContent;
|
|
278
|
+
// instructure_file_link_holder is used to find file_preview_link
|
|
303
279
|
const $span = document.createElement('span');
|
|
304
280
|
$span.setAttribute('class', 'instructure_file_holder link_holder instructure_file_link_holder');
|
|
305
281
|
const qs = href.searchParams;
|
|
@@ -307,7 +283,6 @@ export function enhanceUserContent() {
|
|
|
307
283
|
qs.append('download_frd', '1');
|
|
308
284
|
const download_url = `${href.origin}${href.pathname.replace(/(?:\/(download|preview))?$/, '/download')}?${qs}`;
|
|
309
285
|
const $download_btn = makeDownloadButton(download_url, filename);
|
|
310
|
-
|
|
311
286
|
if (file_link.classList.contains('instructure_scribd_file')) {
|
|
312
287
|
if (file_link.classList.contains('no_preview')) {
|
|
313
288
|
// link downloads
|
|
@@ -321,22 +296,21 @@ export function enhanceUserContent() {
|
|
|
321
296
|
file_link.classList.add('file_preview_link');
|
|
322
297
|
}
|
|
323
298
|
}
|
|
324
|
-
|
|
325
299
|
file_link.classList.remove('instructure_file_link');
|
|
326
300
|
file_link.classList.remove('instructure_scribd_file');
|
|
327
301
|
file_link.parentElement.replaceChild($span, file_link);
|
|
328
302
|
$span.appendChild(file_link);
|
|
329
303
|
if ($download_btn) $span.appendChild($download_btn);
|
|
330
304
|
}
|
|
331
|
-
});
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Some schools have been using 'file_preview_link' for inline previews
|
|
332
308
|
// outside of the RCE so find them all after we've gone through and
|
|
333
309
|
// added our own (above)
|
|
334
|
-
|
|
335
310
|
content.querySelectorAll('.instructure_file_link_holder a.file_preview_link, .instructure_file_link_holder a.scribd_file_preview_link').forEach($link => {
|
|
336
311
|
if ($link.classList.contains('previewable')) {
|
|
337
312
|
return;
|
|
338
313
|
}
|
|
339
|
-
|
|
340
314
|
const preview_id = previewId();
|
|
341
315
|
$link.setAttribute('aria-expanded', 'false');
|
|
342
316
|
$link.setAttribute('aria-controls', preview_id);
|
|
@@ -348,7 +322,6 @@ export function enhanceUserContent() {
|
|
|
348
322
|
$preview_container.id = preview_id;
|
|
349
323
|
$preview_container.setAttribute('style', 'display: none;');
|
|
350
324
|
$link.parentElement.appendChild($preview_container);
|
|
351
|
-
|
|
352
325
|
if ($link.classList.contains('auto_open')) {
|
|
353
326
|
$link.click();
|
|
354
327
|
}
|
|
@@ -359,25 +332,20 @@ export function enhanceUserContent() {
|
|
|
359
332
|
const a = closest($thumbnail, 'a', content);
|
|
360
333
|
a === null || a === void 0 ? void 0 : a.classList.add('instructure_inline_media_comment');
|
|
361
334
|
});
|
|
362
|
-
|
|
363
335
|
if ($anchor.matches('.instructure_inline_media_comment')) {
|
|
364
336
|
$anchor.classList.remove('no-underline');
|
|
365
337
|
mediaCommentThumbnail($anchor, 'normal', false, kalturaSettings);
|
|
366
338
|
}
|
|
367
|
-
|
|
368
339
|
if ($anchor.matches('.instructure_video_link, .instructure_audio_link')) {
|
|
369
340
|
mediaCommentThumbnail($anchor, 'normal', true, kalturaSettings);
|
|
370
341
|
}
|
|
371
|
-
|
|
372
342
|
if (!$anchor.matches('.youtubed')) {
|
|
373
343
|
handleYoutubeLink($anchor);
|
|
374
344
|
}
|
|
375
345
|
});
|
|
376
|
-
|
|
377
346
|
if (customEnhanceFunc) {
|
|
378
347
|
customEnhanceFunc();
|
|
379
348
|
}
|
|
380
|
-
|
|
381
349
|
content.querySelectorAll('.user_content.unenhanced').forEach($elem => {
|
|
382
350
|
$elem.classList.remove('unenhanced');
|
|
383
351
|
$elem.classList.add('enhanced');
|
|
@@ -387,9 +355,9 @@ export function enhanceUserContent() {
|
|
|
387
355
|
$elem.submit();
|
|
388
356
|
$elem.classList.add('submitted');
|
|
389
357
|
});
|
|
390
|
-
}, 10);
|
|
358
|
+
}, 10);
|
|
359
|
+
// Remove sandbox attribute from user content iframes to fix busted
|
|
391
360
|
// third-party content, like Google Drive documents.
|
|
392
|
-
|
|
393
361
|
document.querySelectorAll('.user_content iframe[sandbox="allow-scripts allow-forms allow-same-origin"]').forEach(frame => {
|
|
394
362
|
frame.removeAttribute('sandbox');
|
|
395
363
|
const src = frame.src;
|
|
@@ -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 { IconExternalLinkLine } from '@instructure/ui-icons/es/svg';
|
|
19
20
|
import { getTld } from './instructure_helper';
|
|
20
21
|
import formatMessage from '../format-message';
|
|
@@ -42,19 +43,17 @@ export function makeAllExternalLinksExternalLinks() {
|
|
|
42
43
|
if (!content) return;
|
|
43
44
|
const tld = getTld(window.location.hostname);
|
|
44
45
|
const links = content.querySelectorAll(`a[href*="//"]:not([href*="${tld}"])`); // technique for finding "external" links copied from https://davidwalsh.name/external-links-css
|
|
45
|
-
|
|
46
46
|
for (let i = 0; i < links.length; i++) {
|
|
47
|
-
const $link = links[i];
|
|
48
|
-
|
|
47
|
+
const $link = links[i];
|
|
48
|
+
// don't mess with the ones that were already processed in enhanceUserContent
|
|
49
49
|
if ($link.classList.contains('external')) continue;
|
|
50
50
|
if ($link.matches('.open_in_a_new_tab')) continue;
|
|
51
51
|
if ($link.querySelectorAll('img').length > 0) continue;
|
|
52
52
|
if ($link.matches('.not_external')) continue;
|
|
53
|
-
if ($link.matches('.exclude_external_icon')) continue;
|
|
54
|
-
|
|
53
|
+
if ($link.matches('.exclude_external_icon')) continue;
|
|
54
|
+
// we have some pre-instui buttons that are styled links
|
|
55
55
|
if ($link.classList.contains('btn')) continue;
|
|
56
56
|
const $linkToReplace = $link;
|
|
57
|
-
|
|
58
57
|
if ($linkToReplace) {
|
|
59
58
|
const $linkIndicator = makeExternalLinkIcon();
|
|
60
59
|
$linkToReplace.classList.add('external');
|
|
@@ -64,9 +63,7 @@ export function makeAllExternalLinksExternalLinks() {
|
|
|
64
63
|
const $linkSpan = document.createElement('span');
|
|
65
64
|
const $linkText = $linkToReplace.innerHTML;
|
|
66
65
|
$linkSpan.innerHTML = $linkText;
|
|
67
|
-
|
|
68
66
|
while ($linkToReplace.firstChild) $linkToReplace.removeChild($linkToReplace.firstChild);
|
|
69
|
-
|
|
70
67
|
$linkToReplace.appendChild($linkSpan);
|
|
71
68
|
$linkToReplace.appendChild($linkIndicator);
|
|
72
69
|
}
|
|
@@ -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 mediaCommentThumbnail from './media_comment_thumbnail';
|
|
19
20
|
export * from './enhance_user_content';
|
|
20
21
|
export { isPreviewable, loadDocPreview } from './doc_previews';
|