@instructure/canvas-rce 5.14.1 → 5.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -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, { useEffect, useState } from 'react';
|
|
19
20
|
import { View } from '@instructure/ui-view';
|
|
20
21
|
import { Flex } from '@instructure/ui-flex';
|
|
@@ -83,56 +84,50 @@ const NAMED_COLORS = [{
|
|
|
83
84
|
color: '#FFFFFF',
|
|
84
85
|
name: formatMessage('White')
|
|
85
86
|
}, null];
|
|
86
|
-
export const ColorInput =
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
readonly = false,
|
|
97
|
-
requireColor = false
|
|
98
|
-
} = _ref;
|
|
87
|
+
export const ColorInput = ({
|
|
88
|
+
color,
|
|
89
|
+
label,
|
|
90
|
+
name,
|
|
91
|
+
onChange,
|
|
92
|
+
popoverMountNode,
|
|
93
|
+
width = '11rem',
|
|
94
|
+
readonly = false,
|
|
95
|
+
requireColor = false
|
|
96
|
+
}) => {
|
|
99
97
|
const [isOpen, setIsOpen] = useState(false);
|
|
100
98
|
const [inputValue, setInputValue] = useState(color);
|
|
101
|
-
const colorName =
|
|
99
|
+
const colorName = NAMED_COLORS.find(c => c?.color === color)?.name;
|
|
102
100
|
useEffect(() => {
|
|
103
101
|
setInputValue(color);
|
|
104
|
-
}, [color]);
|
|
102
|
+
}, [color]);
|
|
105
103
|
|
|
104
|
+
// fire onChange in case value is valid
|
|
106
105
|
const handleColorChange = hex => {
|
|
107
106
|
if (isValidHex(hex)) {
|
|
108
107
|
onChange(hex);
|
|
109
108
|
}
|
|
110
|
-
|
|
111
109
|
if (!hex || !hex.length) {
|
|
112
110
|
onChange(null);
|
|
113
111
|
}
|
|
114
|
-
|
|
115
112
|
setInputValue(hex);
|
|
116
|
-
};
|
|
117
|
-
|
|
113
|
+
};
|
|
118
114
|
|
|
115
|
+
// reset the input value on blur if invalid
|
|
119
116
|
const handleInputBlur = () => {
|
|
120
117
|
if (!inputValue || inputValue.length > 0 && !isValidHex(inputValue)) {
|
|
121
118
|
setInputValue(color);
|
|
122
119
|
}
|
|
123
120
|
};
|
|
124
|
-
|
|
125
121
|
const colorPreviews = NAMED_COLORS.map(c => /*#__PURE__*/React.createElement(ColorPreview, {
|
|
126
|
-
key: `${name}-${c
|
|
127
|
-
color: c
|
|
128
|
-
name: c
|
|
122
|
+
key: `${name}-${c?.color}`,
|
|
123
|
+
color: c?.color,
|
|
124
|
+
name: c?.name,
|
|
129
125
|
disabled: !isOpen,
|
|
130
126
|
onSelect: () => {
|
|
131
|
-
handleColorChange(c
|
|
127
|
+
handleColorChange(c?.color);
|
|
132
128
|
setIsOpen(false);
|
|
133
129
|
}
|
|
134
130
|
}));
|
|
135
|
-
|
|
136
131
|
function renderPopover() {
|
|
137
132
|
const pickerLabel = colorName ? formatMessage('Color Picker ({colorName} selected)', {
|
|
138
133
|
colorName
|
|
@@ -167,7 +162,6 @@ export const ColorInput = _ref => {
|
|
|
167
162
|
"data-testid": `${name}-popover`
|
|
168
163
|
}, requireColor ? colorPreviews.slice(0, -1) : colorPreviews));
|
|
169
164
|
}
|
|
170
|
-
|
|
171
165
|
return /*#__PURE__*/React.createElement(View, {
|
|
172
166
|
as: "div"
|
|
173
167
|
}, /*#__PURE__*/React.createElement(TextInput, {
|
|
@@ -190,15 +184,13 @@ export const ColorInput = _ref => {
|
|
|
190
184
|
interaction: readonly ? 'readonly' : undefined
|
|
191
185
|
}));
|
|
192
186
|
};
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
onSelect
|
|
201
|
-
} = _ref2;
|
|
187
|
+
function ColorPreview({
|
|
188
|
+
color,
|
|
189
|
+
name,
|
|
190
|
+
disabled,
|
|
191
|
+
margin = 'xxx-small',
|
|
192
|
+
onSelect
|
|
193
|
+
}) {
|
|
202
194
|
return /*#__PURE__*/React.createElement(BaseButton, {
|
|
203
195
|
interaction: disabled ? 'readonly' : undefined,
|
|
204
196
|
isCondensed: true,
|
|
@@ -216,17 +208,13 @@ function ColorPreview(_ref2) {
|
|
|
216
208
|
testId: `colorPreview-${color || 'none'}`
|
|
217
209
|
}));
|
|
218
210
|
}
|
|
219
|
-
|
|
220
211
|
function isValidHex(color) {
|
|
221
212
|
if (!color) return false;
|
|
222
|
-
|
|
223
213
|
switch (color.length) {
|
|
224
214
|
case 4:
|
|
225
215
|
return /^#[0-9A-F]{3}$/i.test(color);
|
|
226
|
-
|
|
227
216
|
case 7:
|
|
228
217
|
return /^#[0-9A-F]{6}$/i.test(color);
|
|
229
|
-
|
|
230
218
|
default:
|
|
231
219
|
return false;
|
|
232
220
|
}
|
|
@@ -15,15 +15,15 @@
|
|
|
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 { bool, element, oneOfType, arrayOf } from 'prop-types';
|
|
20
21
|
import { Tooltip } from '@instructure/ui-tooltip';
|
|
21
|
-
export const ConditionalTooltip =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} = _ref;
|
|
22
|
+
export const ConditionalTooltip = ({
|
|
23
|
+
condition,
|
|
24
|
+
children,
|
|
25
|
+
...tooltipProps
|
|
26
|
+
}) => {
|
|
27
27
|
return condition ? /*#__PURE__*/React.createElement(Tooltip, tooltipProps, children) : /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
28
28
|
};
|
|
29
29
|
ConditionalTooltip.propTypes = {
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
|
|
19
|
-
import { isOnlyTextSelected } from '../../contentInsertionUtils'; // eslint-disable-next-line import/no-nodejs-modules
|
|
20
18
|
|
|
21
|
-
import
|
|
19
|
+
import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
|
|
20
|
+
import { isOnlyTextSelected } from '../../contentInsertionUtils';
|
|
22
21
|
import formatMessage from '../../../format-message';
|
|
23
22
|
import { isStudioEmbeddedMedia } from './StudioLtiSupportUtils';
|
|
24
23
|
import RCEGlobals from '../../RCEGlobals';
|
|
24
|
+
import { parseUrlPath } from '../../../util/url-util';
|
|
25
25
|
const FILE_DOWNLOAD_PATH_REGEX = /^\/(courses\/\d+\/)?files\/\d+\/download$/;
|
|
26
26
|
export const LINK_TYPE = 'link';
|
|
27
27
|
export const FILE_LINK_TYPE = 'file-link';
|
|
@@ -34,38 +34,29 @@ export const DISPLAY_AS_EMBED = 'embed';
|
|
|
34
34
|
export const DISPLAY_AS_EMBED_DISABLED = 'embed-disabled';
|
|
35
35
|
export const DISPLAY_AS_DOWNLOAD_LINK = 'download-link';
|
|
36
36
|
export function asImageEmbed($element) {
|
|
37
|
-
const nodeName = $element
|
|
38
|
-
|
|
37
|
+
const nodeName = $element?.nodeName.toLowerCase();
|
|
39
38
|
if (nodeName !== 'img') {
|
|
40
39
|
return null;
|
|
41
40
|
}
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
return {
|
|
42
|
+
...fromImageEmbed($element),
|
|
44
43
|
$element,
|
|
45
44
|
type: IMAGE_EMBED_TYPE
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
47
|
export function asLink($element, editor) {
|
|
49
|
-
var _$link;
|
|
50
|
-
|
|
51
48
|
let $link = $element;
|
|
52
|
-
|
|
53
|
-
if (((_$link = $link) === null || _$link === void 0 ? void 0 : _$link.tagName) !== 'A') {
|
|
49
|
+
if ($link?.tagName !== 'A') {
|
|
54
50
|
// the user may have selected some text that is w/in a link
|
|
55
51
|
// but didn't include the <a>. Let's see if that's true
|
|
56
|
-
$link = editor.dom.getParent($link, 'a[href]');
|
|
52
|
+
$link = editor && editor.dom.getParent($link, 'a[href]');
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
if (!$link || $link.tagName !== 'A' || !$link.href) {
|
|
60
55
|
return null;
|
|
61
56
|
}
|
|
62
|
-
|
|
63
|
-
const {
|
|
64
|
-
pathname
|
|
65
|
-
} = url.parse($link.href);
|
|
57
|
+
const pathname = parseUrlPath($link.href);
|
|
66
58
|
const type = FILE_DOWNLOAD_PATH_REGEX.test(pathname) ? FILE_LINK_TYPE : LINK_TYPE;
|
|
67
59
|
let displayAs = DISPLAY_AS_LINK;
|
|
68
|
-
|
|
69
60
|
if ($link.classList.contains('no_preview')) {
|
|
70
61
|
displayAs = DISPLAY_AS_DOWNLOAD_LINK;
|
|
71
62
|
} else if ($link.classList.contains('auto_open')) {
|
|
@@ -73,7 +64,6 @@ export function asLink($element, editor) {
|
|
|
73
64
|
} else if ($link.classList.contains('inline_disabled')) {
|
|
74
65
|
displayAs = DISPLAY_AS_EMBED_DISABLED;
|
|
75
66
|
}
|
|
76
|
-
|
|
77
67
|
const contentType = $link.getAttribute('data-course-type');
|
|
78
68
|
const fileName = $link.getAttribute('title');
|
|
79
69
|
const published = $link.getAttribute('data-published') === 'true';
|
|
@@ -91,7 +81,9 @@ export function asLink($element, editor) {
|
|
|
91
81
|
fileName,
|
|
92
82
|
published
|
|
93
83
|
};
|
|
94
|
-
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// the video element is a bit tricky.
|
|
95
87
|
// tinymce won't let me add many attributes to the iframe,
|
|
96
88
|
// even though I've listed them in tinymce.config.js
|
|
97
89
|
// extended_valid_elements.
|
|
@@ -99,99 +91,76 @@ export function asLink($element, editor) {
|
|
|
99
91
|
// and it's attributes, even though this could change with future
|
|
100
92
|
// tinymce releases.
|
|
101
93
|
// see https://github.com/tinymce/tinymce/issues/5181
|
|
102
|
-
|
|
103
94
|
export function asVideoElement($element) {
|
|
104
|
-
var _$videoElem$parentEle;
|
|
105
|
-
|
|
106
95
|
const $videoElem = findMediaPlayerIframe($element);
|
|
107
|
-
|
|
108
96
|
if (!isVideoElement($videoElem) && !isStudioEmbeddedMedia($videoElem)) {
|
|
109
97
|
return null;
|
|
110
98
|
}
|
|
111
|
-
|
|
112
|
-
|
|
99
|
+
return {
|
|
100
|
+
...fromVideoEmbed($videoElem),
|
|
113
101
|
$element,
|
|
114
102
|
type: VIDEO_EMBED_TYPE,
|
|
115
|
-
id:
|
|
103
|
+
id: $videoElem.parentElement?.getAttribute('data-mce-p-data-media-id') || $videoElem.getAttribute('data-mce-p-data-media-id')
|
|
116
104
|
};
|
|
117
105
|
}
|
|
118
106
|
export function asAudioElement($element) {
|
|
119
|
-
var _$element$parentEleme;
|
|
120
|
-
|
|
121
107
|
if (!$element) {
|
|
122
108
|
return null;
|
|
123
109
|
}
|
|
124
|
-
|
|
125
110
|
const $audioIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
|
|
126
111
|
const $tinymceIframeShim = $audioIframe.parentElement;
|
|
127
112
|
const title = ($audioIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
|
|
128
113
|
const audioOptions = {
|
|
129
114
|
titleText: title,
|
|
130
|
-
id:
|
|
115
|
+
id: $element.parentElement?.getAttribute('data-mce-p-data-media-id') || $element.getAttribute('data-mce-p-data-media-id')
|
|
131
116
|
};
|
|
132
|
-
|
|
133
117
|
if ($audioIframe.tagName === 'IFRAME') {
|
|
134
118
|
const audioDoc = $audioIframe.contentDocument;
|
|
135
|
-
|
|
136
119
|
try {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const trackSJson = (_audioDoc$querySelect = audioDoc.querySelector('[data-tracks]')) === null || _audioDoc$querySelect === void 0 ? void 0 : _audioDoc$querySelect.getAttribute('data-tracks');
|
|
140
|
-
|
|
120
|
+
const trackSJson = audioDoc.querySelector('[data-tracks]')?.getAttribute('data-tracks');
|
|
141
121
|
if (trackSJson) {
|
|
142
122
|
audioOptions.tracks = JSON.parse(trackSJson);
|
|
143
|
-
}
|
|
144
|
-
|
|
123
|
+
}
|
|
124
|
+
// eslint-disable-next-line no-empty
|
|
145
125
|
} catch (e) {}
|
|
146
126
|
}
|
|
147
|
-
|
|
148
127
|
if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
|
|
149
128
|
const source = $audioIframe.getAttribute('src');
|
|
150
|
-
const matches = source
|
|
151
|
-
|
|
129
|
+
const matches = source?.match(/\/media_attachments_iframe\/(\d+)/);
|
|
152
130
|
if (matches) {
|
|
153
131
|
audioOptions.attachmentId = matches[1];
|
|
154
132
|
}
|
|
155
133
|
}
|
|
156
|
-
|
|
157
134
|
return audioOptions;
|
|
158
135
|
}
|
|
159
|
-
|
|
160
136
|
function asText($element, editor) {
|
|
161
137
|
const text = editor && editor.selection.getContent({
|
|
162
138
|
format: 'text'
|
|
163
139
|
});
|
|
164
|
-
|
|
165
140
|
if (!text) {
|
|
166
141
|
return null;
|
|
167
142
|
}
|
|
168
|
-
|
|
169
143
|
return {
|
|
170
144
|
$element,
|
|
171
145
|
text,
|
|
172
146
|
type: TEXT_TYPE
|
|
173
147
|
};
|
|
174
148
|
}
|
|
175
|
-
|
|
176
149
|
function asNone($element) {
|
|
177
150
|
return {
|
|
178
151
|
$element: $element || null,
|
|
179
152
|
type: NONE_TYPE
|
|
180
153
|
};
|
|
181
154
|
}
|
|
182
|
-
|
|
183
155
|
export function getContentFromElement($element, editor) {
|
|
184
156
|
if (!($element && $element.nodeName)) {
|
|
185
157
|
return asNone();
|
|
186
158
|
}
|
|
187
|
-
|
|
188
159
|
const content = asLink($element, editor) || asImageEmbed($element) || asVideoElement($element) || asText($element, editor) || asNone($element);
|
|
189
160
|
return content;
|
|
190
161
|
}
|
|
191
|
-
export function getContentFromEditor(editor) {
|
|
192
|
-
let expandSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
162
|
+
export function getContentFromEditor(editor, expandSelection = false) {
|
|
193
163
|
let $element;
|
|
194
|
-
|
|
195
164
|
if (editor && editor.selection) {
|
|
196
165
|
// tinymce selects the element around the cursor, whether it's
|
|
197
166
|
// content is selected in the copy/paste sense or not.
|
|
@@ -201,15 +170,14 @@ export function getContentFromEditor(editor) {
|
|
|
201
170
|
$element = editor.selection.getNode();
|
|
202
171
|
}
|
|
203
172
|
}
|
|
204
|
-
|
|
205
173
|
if ($element == null) {
|
|
206
174
|
return asNone();
|
|
207
175
|
}
|
|
208
|
-
|
|
209
176
|
return getContentFromElement($element, editor);
|
|
210
|
-
}
|
|
211
|
-
// find the <a> and return it's info
|
|
177
|
+
}
|
|
212
178
|
|
|
179
|
+
// if the selection is somewhere w/in a <a>,
|
|
180
|
+
// find the <a> and return it's info
|
|
213
181
|
export function getLinkContentFromEditor(editor) {
|
|
214
182
|
const $element = editor.selection.getNode();
|
|
215
183
|
return $element ? asLink($element, editor) : null;
|
|
@@ -220,33 +188,24 @@ export function isFileLink($element, editor) {
|
|
|
220
188
|
export function isImageEmbed($element) {
|
|
221
189
|
return !!asImageEmbed($element) && !$element.getAttribute('data-placeholder-for');
|
|
222
190
|
}
|
|
223
|
-
|
|
224
191
|
function isMediaElement($element, mediaType) {
|
|
225
|
-
var _tinymceIframeShim$fi, _tinymceIframeShim$ge;
|
|
226
|
-
|
|
227
192
|
// the video is hosted in an iframe, but tinymce
|
|
228
193
|
// wraps it in a span with swizzled attribute names
|
|
229
|
-
if (
|
|
194
|
+
if (!$element?.getAttribute || !$element) {
|
|
230
195
|
return false;
|
|
231
196
|
}
|
|
232
|
-
|
|
233
197
|
const tinymceIframeShim = $element.tagName === 'IFRAME' ? $element.parentElement : $element;
|
|
234
|
-
|
|
235
|
-
if (((_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
|
|
198
|
+
if (tinymceIframeShim.firstElementChild?.tagName !== 'IFRAME') {
|
|
236
199
|
return false;
|
|
237
200
|
}
|
|
238
|
-
|
|
239
201
|
const media_obj_id = tinymceIframeShim.getAttribute('data-mce-p-data-media-id');
|
|
240
|
-
const is_media_attachment_iframe =
|
|
241
|
-
|
|
202
|
+
const is_media_attachment_iframe = tinymceIframeShim.getAttribute('data-mce-p-src')?.includes('media_attachments_iframe');
|
|
242
203
|
if (!media_obj_id && !is_media_attachment_iframe) {
|
|
243
204
|
return false;
|
|
244
205
|
}
|
|
245
|
-
|
|
246
206
|
const media_type = tinymceIframeShim.getAttribute('data-mce-p-data-media-type');
|
|
247
207
|
return media_type === mediaType;
|
|
248
208
|
}
|
|
249
|
-
|
|
250
209
|
export function isVideoElement($element) {
|
|
251
210
|
return isMediaElement($element, 'video');
|
|
252
211
|
}
|
|
@@ -254,28 +213,20 @@ export function isAudioElement($element) {
|
|
|
254
213
|
return isMediaElement($element, 'audio');
|
|
255
214
|
}
|
|
256
215
|
export function findMediaPlayerIframe(elem) {
|
|
257
|
-
var _elem$firstElementChi;
|
|
258
|
-
|
|
259
216
|
if (!elem) return null;
|
|
260
|
-
|
|
261
217
|
if (elem.tagName === 'IFRAME') {
|
|
262
218
|
// we have the iframe
|
|
263
219
|
return elem;
|
|
264
220
|
}
|
|
265
|
-
|
|
266
|
-
if (((_elem$firstElementChi = elem.firstElementChild) === null || _elem$firstElementChi === void 0 ? void 0 : _elem$firstElementChi.tagName) === 'IFRAME') {
|
|
221
|
+
if (elem.firstElementChild?.tagName === 'IFRAME') {
|
|
267
222
|
// we have the shim tinymce puts around the iframe
|
|
268
223
|
return elem.firstElementChild;
|
|
269
224
|
}
|
|
270
|
-
|
|
271
225
|
if (elem.classList.contains('mce-shim')) {
|
|
272
|
-
var _elem$previousSibling;
|
|
273
|
-
|
|
274
226
|
// tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
|
|
275
|
-
if (
|
|
227
|
+
if (elem.previousSibling?.tagName === 'IFRAME') {
|
|
276
228
|
return elem.previousSibling;
|
|
277
229
|
}
|
|
278
230
|
}
|
|
279
|
-
|
|
280
231
|
return null;
|
|
281
232
|
}
|
|
@@ -15,52 +15,43 @@
|
|
|
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
|
function scaleEvenly(width, height, scaleFactor, constraints) {
|
|
19
20
|
const minHeight = constraints.minHeight || 0;
|
|
20
21
|
const minWidth = constraints.minWidth || 0;
|
|
21
22
|
const scaledWidth = width * scaleFactor;
|
|
22
23
|
const scaledHeight = height * scaleFactor;
|
|
23
24
|
let minimumScaleFactor = scaleFactor;
|
|
24
|
-
|
|
25
25
|
if (scaledWidth < minWidth) {
|
|
26
26
|
const atLeastMinWidth = Math.max(scaledWidth, minWidth);
|
|
27
27
|
minimumScaleFactor = atLeastMinWidth / width;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
29
|
if (scaledHeight < minHeight) {
|
|
31
30
|
const atLeastMinHeight = Math.max(scaledHeight, minHeight);
|
|
32
31
|
minimumScaleFactor = Math.max(atLeastMinHeight / height, minimumScaleFactor);
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
return {
|
|
36
34
|
height: Math.round(height * minimumScaleFactor),
|
|
37
35
|
width: Math.round(width * minimumScaleFactor)
|
|
38
36
|
};
|
|
39
37
|
}
|
|
40
|
-
|
|
41
|
-
export function scaleForHeight(width, height, targetHeight) {
|
|
42
|
-
let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
43
|
-
|
|
38
|
+
export function scaleForHeight(width, height, targetHeight, constraints = {}) {
|
|
44
39
|
if (targetHeight == null) {
|
|
45
40
|
return {
|
|
46
41
|
height: null,
|
|
47
42
|
width: null
|
|
48
43
|
};
|
|
49
44
|
}
|
|
50
|
-
|
|
51
45
|
const scaleFactor = targetHeight / height;
|
|
52
46
|
return scaleEvenly(width, height, scaleFactor, constraints);
|
|
53
47
|
}
|
|
54
|
-
export function scaleForWidth(width, height, targetWidth) {
|
|
55
|
-
let constraints = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
56
|
-
|
|
48
|
+
export function scaleForWidth(width, height, targetWidth, constraints = {}) {
|
|
57
49
|
if (targetWidth == null) {
|
|
58
50
|
return {
|
|
59
51
|
height: null,
|
|
60
52
|
width: null
|
|
61
53
|
};
|
|
62
54
|
}
|
|
63
|
-
|
|
64
55
|
const scaleFactor = targetWidth / width;
|
|
65
56
|
return scaleEvenly(width, height, scaleFactor, constraints);
|
|
66
57
|
}
|
|
@@ -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 { func, shape, string } from 'prop-types';
|
|
20
21
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
@@ -22,34 +23,33 @@ import { NumberInput } from '@instructure/ui-number-input';
|
|
|
22
23
|
export default function DimensionInput(props) {
|
|
23
24
|
const {
|
|
24
25
|
dimensionState,
|
|
25
|
-
label
|
|
26
|
+
label,
|
|
27
|
+
messages
|
|
26
28
|
} = props;
|
|
27
29
|
const {
|
|
28
30
|
addOffset,
|
|
29
31
|
inputValue,
|
|
30
32
|
setInputValue
|
|
31
33
|
} = dimensionState;
|
|
32
|
-
|
|
33
34
|
function handleChange(_event, value) {
|
|
34
35
|
setInputValue(value);
|
|
35
36
|
}
|
|
36
|
-
|
|
37
37
|
function handleDecrement() {
|
|
38
38
|
addOffset(-1);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
40
|
function handleIncrement() {
|
|
42
41
|
addOffset(1);
|
|
43
42
|
}
|
|
44
|
-
|
|
45
43
|
return /*#__PURE__*/React.createElement(NumberInput, {
|
|
44
|
+
allowStringValue: true,
|
|
46
45
|
renderLabel: /*#__PURE__*/React.createElement(ScreenReaderContent, null, label),
|
|
47
46
|
onChange: handleChange,
|
|
48
47
|
onDecrement: handleDecrement,
|
|
49
48
|
onIncrement: handleIncrement,
|
|
50
49
|
isRequired: true,
|
|
51
50
|
showArrows: false,
|
|
52
|
-
value: inputValue
|
|
51
|
+
value: inputValue,
|
|
52
|
+
messages: messages
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
DimensionInput.propTypes = {
|
|
@@ -15,24 +15,34 @@
|
|
|
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 { bool, func, number, shape, string } from 'prop-types';
|
|
20
21
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
21
22
|
import { FormFieldGroup } from '@instructure/ui-form-field';
|
|
22
|
-
import { IconLockLine } from '@instructure/ui-icons';
|
|
23
|
+
import { IconLockLine, IconWarningSolid } from '@instructure/ui-icons';
|
|
23
24
|
import { Flex } from '@instructure/ui-flex';
|
|
24
25
|
import { Text } from '@instructure/ui-text';
|
|
25
26
|
import { RadioInput, RadioInputGroup } from '@instructure/ui-radio-input';
|
|
26
27
|
import formatMessage from '../../../../format-message';
|
|
27
28
|
import DimensionInput from './DimensionInput';
|
|
28
29
|
export { default as useDimensionsState } from './useDimensionsState';
|
|
29
|
-
|
|
30
|
+
const errorMessage = message => {
|
|
31
|
+
return /*#__PURE__*/React.createElement(Flex, {
|
|
32
|
+
gap: "xx-small",
|
|
33
|
+
alignItems: "center"
|
|
34
|
+
}, /*#__PURE__*/React.createElement(IconWarningSolid, {
|
|
35
|
+
color: "error"
|
|
36
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
37
|
+
color: "danger",
|
|
38
|
+
size: "small"
|
|
39
|
+
}, message));
|
|
40
|
+
};
|
|
30
41
|
const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
31
42
|
let result = {
|
|
32
43
|
text: formatMessage('Aspect ratio will be preserved'),
|
|
33
44
|
type: 'hint'
|
|
34
45
|
};
|
|
35
|
-
|
|
36
46
|
if (dimensionsState.usePercentageUnits) {
|
|
37
47
|
if (!dimensionsState.isNumeric) {
|
|
38
48
|
result = {
|
|
@@ -41,7 +51,7 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
|
41
51
|
};
|
|
42
52
|
} else if (!dimensionsState.isAtLeastMinimums) {
|
|
43
53
|
result = {
|
|
44
|
-
text: formatMessage('
|
|
54
|
+
text: formatMessage('Percentage must be at least {percentage}%', {
|
|
45
55
|
percentage: minPercentage
|
|
46
56
|
}),
|
|
47
57
|
type: 'error'
|
|
@@ -54,17 +64,15 @@ const getMessage = (dimensionsState, minWidth, minHeight, minPercentage) => {
|
|
|
54
64
|
};
|
|
55
65
|
} else if (!dimensionsState.isAtLeastMinimums) {
|
|
56
66
|
result = {
|
|
57
|
-
text: formatMessage('
|
|
67
|
+
text: formatMessage('Pixels must be at least {width} x {height}px', {
|
|
58
68
|
width: minWidth,
|
|
59
69
|
height: minHeight
|
|
60
70
|
}),
|
|
61
71
|
type: 'error'
|
|
62
72
|
};
|
|
63
73
|
}
|
|
64
|
-
|
|
65
74
|
return result;
|
|
66
75
|
};
|
|
67
|
-
|
|
68
76
|
export default function DimensionsInput(props) {
|
|
69
77
|
const {
|
|
70
78
|
dimensionsState,
|
|
@@ -73,12 +81,24 @@ export default function DimensionsInput(props) {
|
|
|
73
81
|
minPercentage,
|
|
74
82
|
hidePercentage
|
|
75
83
|
} = props;
|
|
76
|
-
|
|
77
84
|
const handleDimensionTypeChange = e => {
|
|
78
85
|
dimensionsState.setUsePercentageUnits(e.target.value === 'percentage');
|
|
79
86
|
};
|
|
80
|
-
|
|
81
87
|
const message = getMessage(dimensionsState, minWidth, minHeight, minPercentage);
|
|
88
|
+
const secondaryMessage = {
|
|
89
|
+
...message,
|
|
90
|
+
text: ''
|
|
91
|
+
};
|
|
92
|
+
const displayMessage = message => {
|
|
93
|
+
if (!message) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
97
|
+
"data-testid": "message"
|
|
98
|
+
}, message.type === 'error' ? errorMessage(message.text) : /*#__PURE__*/React.createElement(Text, {
|
|
99
|
+
size: "small"
|
|
100
|
+
}, message.text));
|
|
101
|
+
};
|
|
82
102
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
83
103
|
direction: "column"
|
|
84
104
|
}, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -100,8 +120,7 @@ export default function DimensionsInput(props) {
|
|
|
100
120
|
}))), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
101
121
|
padding: "small"
|
|
102
122
|
}, /*#__PURE__*/React.createElement(FormFieldGroup, {
|
|
103
|
-
description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions'))
|
|
104
|
-
messages: [message]
|
|
123
|
+
description: /*#__PURE__*/React.createElement(ScreenReaderContent, null, formatMessage('Dimensions'))
|
|
105
124
|
}, /*#__PURE__*/React.createElement(Flex, {
|
|
106
125
|
alignItems: "start",
|
|
107
126
|
direction: "row",
|
|
@@ -111,7 +130,8 @@ export default function DimensionsInput(props) {
|
|
|
111
130
|
shouldGrow: true
|
|
112
131
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
113
132
|
dimensionState: dimensionsState.percentageState,
|
|
114
|
-
label: formatMessage('Percentage')
|
|
133
|
+
label: formatMessage('Percentage'),
|
|
134
|
+
messages: [secondaryMessage]
|
|
115
135
|
})), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
116
136
|
padding: "x-small small"
|
|
117
137
|
}, "%")) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -119,7 +139,8 @@ export default function DimensionsInput(props) {
|
|
|
119
139
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
120
140
|
dimensionState: dimensionsState.widthState,
|
|
121
141
|
label: formatMessage('Width'),
|
|
122
|
-
minValue: minWidth
|
|
142
|
+
minValue: minWidth,
|
|
143
|
+
messages: [secondaryMessage]
|
|
123
144
|
})), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
124
145
|
padding: "x-small small"
|
|
125
146
|
}, /*#__PURE__*/React.createElement(IconLockLine, null)), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -127,8 +148,9 @@ export default function DimensionsInput(props) {
|
|
|
127
148
|
}, /*#__PURE__*/React.createElement(DimensionInput, {
|
|
128
149
|
dimensionState: dimensionsState.heightState,
|
|
129
150
|
label: formatMessage('Height'),
|
|
130
|
-
minValue: minHeight
|
|
131
|
-
|
|
151
|
+
minValue: minHeight,
|
|
152
|
+
messages: [secondaryMessage]
|
|
153
|
+
}))))), displayMessage(message)));
|
|
132
154
|
}
|
|
133
155
|
DimensionsInput.propTypes = {
|
|
134
156
|
dimensionsState: shape({
|