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