@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,45 +15,44 @@
|
|
|
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, { useState, useCallback, useEffect } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
export default function useDebouncedValue(currentValue, onChange, processValueCallback) {
|
|
21
|
-
const [immediateValue, setImmediateValue] = useState(currentValue);
|
|
22
|
+
const [immediateValue, setImmediateValue] = useState(currentValue);
|
|
22
23
|
|
|
24
|
+
// Only invokes onChange on the trailing edge of the timeout
|
|
23
25
|
const debouncedOnChangeCallback = useCallback(debounce(val => onChange(val), 500, {
|
|
24
26
|
trailing: true
|
|
25
27
|
}), []);
|
|
26
28
|
useEffect(() => {
|
|
27
29
|
let newValue = currentValue;
|
|
28
|
-
|
|
29
30
|
if (processValueCallback) {
|
|
30
31
|
newValue = processValueCallback(immediateValue, newValue);
|
|
31
|
-
}
|
|
32
|
-
// once a truthy value is given
|
|
33
|
-
|
|
32
|
+
}
|
|
34
33
|
|
|
34
|
+
// If so we need to make sure to re-set the immediate value
|
|
35
|
+
// once a truthy value is given
|
|
35
36
|
if (newValue !== immediateValue) {
|
|
36
37
|
setImmediateValue(newValue);
|
|
37
|
-
}
|
|
38
|
-
|
|
38
|
+
}
|
|
39
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
40
|
}, [currentValue]);
|
|
40
41
|
useEffect(() => {
|
|
41
42
|
// Debounce the call to set reducer's state
|
|
42
|
-
debouncedOnChangeCallback(immediateValue);
|
|
43
|
+
debouncedOnChangeCallback(immediateValue);
|
|
44
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
43
45
|
}, [immediateValue]);
|
|
44
|
-
|
|
45
46
|
const handleValueChange = event => {
|
|
46
47
|
let {
|
|
47
48
|
value
|
|
48
49
|
} = event.target;
|
|
49
|
-
|
|
50
50
|
if (processValueCallback) {
|
|
51
51
|
value = processValueCallback(value);
|
|
52
|
-
}
|
|
53
|
-
|
|
52
|
+
}
|
|
54
53
|
|
|
54
|
+
// Immediately set local state for low-latency feedback
|
|
55
55
|
setImmediateValue(value);
|
|
56
56
|
};
|
|
57
|
-
|
|
58
57
|
return [immediateValue, handleValueChange];
|
|
59
58
|
}
|
|
@@ -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 formatMessage from '../../../format-message';
|
|
19
20
|
import { scaleForHeight, scaleForWidth } from '../shared/DimensionUtils';
|
|
20
21
|
import RCEGlobals from '../../RCEGlobals';
|
|
@@ -35,7 +36,6 @@ const sizeByMaximumDimension = {
|
|
|
35
36
|
400: LARGE,
|
|
36
37
|
640: EXTRA_LARGE
|
|
37
38
|
};
|
|
38
|
-
|
|
39
39
|
function parsedOrNull($element, attribute) {
|
|
40
40
|
// when the image is first inserted into the rce, it's size
|
|
41
41
|
// is constrained by a style attribute with max-width, max-height.
|
|
@@ -44,23 +44,19 @@ function parsedOrNull($element, attribute) {
|
|
|
44
44
|
const value = $element.hasAttribute(attribute) ? $element.getAttribute(attribute) : $element[attribute];
|
|
45
45
|
return value ? Math.round(Number.parseInt(value, 10)) : null;
|
|
46
46
|
}
|
|
47
|
-
|
|
48
47
|
function imageSizeFromKnownOptions(imageOptions) {
|
|
49
48
|
const intendedWidth = imageOptions.appliedWidth || imageOptions.naturalWidth;
|
|
50
49
|
const intendedHeight = imageOptions.appliedHeight || imageOptions.naturalHeight;
|
|
51
50
|
const largestDimension = Math.max(intendedWidth, intendedHeight);
|
|
52
51
|
return sizeByMaximumDimension[largestDimension] || CUSTOM;
|
|
53
52
|
}
|
|
54
|
-
|
|
55
53
|
function getPercentageUnitsFromAttributes($element) {
|
|
56
54
|
const getAttribute = attribute => $element.hasAttribute(attribute) ? $element.getAttribute(attribute) : $element[attribute];
|
|
57
|
-
|
|
58
55
|
const widthValue = getAttribute('width');
|
|
59
56
|
const heightValue = getAttribute('height');
|
|
60
57
|
const value = [widthValue, heightValue].find(v => /\d+(?:\.\d+)?%/.test(v));
|
|
61
58
|
return value ? Math.round(Number.parseInt(value, 10)) : null;
|
|
62
59
|
}
|
|
63
|
-
|
|
64
60
|
export function fromImageEmbed($element) {
|
|
65
61
|
const altText = $element.getAttribute('alt');
|
|
66
62
|
const percentageUnits = getPercentageUnitsFromAttributes($element);
|
|
@@ -86,13 +82,10 @@ export function fromVideoEmbed($element) {
|
|
|
86
82
|
let naturalWidth, naturalHeight;
|
|
87
83
|
const $videoIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
|
|
88
84
|
const $tinymceIframeShim = $videoIframe.parentElement;
|
|
89
|
-
|
|
90
85
|
if ($videoIframe.tagName === 'IFRAME') {
|
|
91
86
|
$videoDoc = $videoIframe.contentDocument;
|
|
92
|
-
|
|
93
87
|
if ($videoDoc) {
|
|
94
88
|
$videoElem = $videoDoc.querySelector('video');
|
|
95
|
-
|
|
96
89
|
if ($videoElem && ($videoElem.loadedmetadata || $videoElem.readyState >= 1)) {
|
|
97
90
|
naturalWidth = $videoElem.videoWidth;
|
|
98
91
|
naturalHeight = $videoElem.videoHeight;
|
|
@@ -101,10 +94,10 @@ export function fromVideoEmbed($element) {
|
|
|
101
94
|
naturalHeight = $videoIframe.clientHeight;
|
|
102
95
|
naturalWidth = $videoIframe.clientWidth;
|
|
103
96
|
}
|
|
104
|
-
}
|
|
105
|
-
// but maintains it on the span it adds around it.
|
|
106
|
-
|
|
97
|
+
}
|
|
107
98
|
|
|
99
|
+
// because tinymce doesn't put the title attribute on the iframe,
|
|
100
|
+
// but maintains it on the span it adds around it.
|
|
108
101
|
const title = ($videoIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
|
|
109
102
|
const rect = $element.getBoundingClientRect();
|
|
110
103
|
const videoOptions = {
|
|
@@ -115,29 +108,22 @@ export function fromVideoEmbed($element) {
|
|
|
115
108
|
naturalWidth,
|
|
116
109
|
source: $videoElem && $videoElem.querySelector('source')
|
|
117
110
|
};
|
|
118
|
-
|
|
119
111
|
try {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const trackjson = (_$videoDoc$querySelec = $videoDoc.querySelector('[data-tracks]')) === null || _$videoDoc$querySelec === void 0 ? void 0 : _$videoDoc$querySelec.getAttribute('data-tracks');
|
|
123
|
-
|
|
112
|
+
const trackjson = $videoDoc.querySelector('[data-tracks]')?.getAttribute('data-tracks');
|
|
124
113
|
if (trackjson) {
|
|
125
114
|
videoOptions.tracks = JSON.parse(trackjson);
|
|
126
115
|
}
|
|
127
|
-
} catch (_ignore) {
|
|
116
|
+
} catch (_ignore) {
|
|
117
|
+
// bad json?
|
|
128
118
|
}
|
|
129
|
-
|
|
130
119
|
videoOptions.videoSize = imageSizeFromKnownOptions(videoOptions);
|
|
131
|
-
|
|
132
120
|
if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
|
|
133
121
|
const source = $videoIframe.getAttribute('src');
|
|
134
|
-
const matches = source
|
|
135
|
-
|
|
122
|
+
const matches = source?.match(/\/media_attachments_iframe\/(\d+)/);
|
|
136
123
|
if (matches) {
|
|
137
124
|
videoOptions.attachmentId = matches[1];
|
|
138
125
|
}
|
|
139
126
|
}
|
|
140
|
-
|
|
141
127
|
return videoOptions;
|
|
142
128
|
}
|
|
143
129
|
export function scaleImageForHeight(naturalWidth, naturalHeight, targetHeight) {
|
|
@@ -161,11 +147,7 @@ export function scaleToSize(imageSize, naturalWidth, naturalHeight) {
|
|
|
161
147
|
height: naturalHeight
|
|
162
148
|
};
|
|
163
149
|
}
|
|
164
|
-
|
|
165
|
-
const [dimension] = Object.entries(sizeByMaximumDimension).find(_ref => {
|
|
166
|
-
let [, size] = _ref;
|
|
167
|
-
return size === imageSize;
|
|
168
|
-
});
|
|
150
|
+
const [dimension] = Object.entries(sizeByMaximumDimension).find(([, size]) => size === imageSize);
|
|
169
151
|
const scaleFactor = dimension / Math.max(naturalWidth, naturalHeight);
|
|
170
152
|
return {
|
|
171
153
|
height: Math.round(naturalHeight * scaleFactor),
|
|
@@ -178,22 +160,18 @@ export function labelForImageSize(imageSize) {
|
|
|
178
160
|
{
|
|
179
161
|
return formatMessage('Small');
|
|
180
162
|
}
|
|
181
|
-
|
|
182
163
|
case MEDIUM:
|
|
183
164
|
{
|
|
184
165
|
return formatMessage('Medium');
|
|
185
166
|
}
|
|
186
|
-
|
|
187
167
|
case LARGE:
|
|
188
168
|
{
|
|
189
169
|
return formatMessage('Large');
|
|
190
170
|
}
|
|
191
|
-
|
|
192
171
|
case EXTRA_LARGE:
|
|
193
172
|
{
|
|
194
173
|
return formatMessage('Extra Large');
|
|
195
174
|
}
|
|
196
|
-
|
|
197
175
|
default:
|
|
198
176
|
{
|
|
199
177
|
return formatMessage('Custom');
|
|
@@ -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, instanceOf, number, oneOfType, shape, string, bool } from 'prop-types';
|
|
20
21
|
import { Img } from '@instructure/ui-img';
|
|
@@ -25,39 +26,32 @@ import { View } from '@instructure/ui-view';
|
|
|
25
26
|
import dragHtml from '../../../../sidebar/dragHtml';
|
|
26
27
|
import formatMessage from '../../../../format-message';
|
|
27
28
|
import { renderImage } from '../../../contentRendering';
|
|
28
|
-
export default function Image(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
} = _ref;
|
|
29
|
+
export default function Image({
|
|
30
|
+
focusRef,
|
|
31
|
+
image,
|
|
32
|
+
onClick,
|
|
33
|
+
isIconMaker,
|
|
34
|
+
canvasOrigin
|
|
35
|
+
}) {
|
|
36
36
|
const imgTitle = formatMessage('Click to embed {imageName}', {
|
|
37
37
|
imageName: image.display_name
|
|
38
38
|
});
|
|
39
|
-
|
|
40
39
|
function handleDragStart(event) {
|
|
41
40
|
dragHtml(event, renderImage(image, canvasOrigin));
|
|
42
41
|
}
|
|
43
|
-
|
|
44
42
|
function handleDragEnd() {
|
|
45
43
|
document.body.click();
|
|
46
44
|
}
|
|
47
|
-
|
|
48
45
|
function handleImageClick(event) {
|
|
49
46
|
event.preventDefault();
|
|
50
47
|
onClick(image);
|
|
51
48
|
}
|
|
52
|
-
|
|
53
49
|
let elementRef = null;
|
|
54
|
-
|
|
55
50
|
if (focusRef) {
|
|
56
51
|
elementRef = ref => {
|
|
57
52
|
focusRef.current = ref;
|
|
58
53
|
};
|
|
59
54
|
}
|
|
60
|
-
|
|
61
55
|
return /*#__PURE__*/React.createElement(Link, {
|
|
62
56
|
draggable: false,
|
|
63
57
|
elementRef: elementRef,
|
|
@@ -15,18 +15,18 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import { arrayOf, func, instanceOf, shape, bool, string } from 'prop-types';
|
|
20
21
|
import { Flex } from '@instructure/ui-flex';
|
|
21
22
|
import Image from './Image';
|
|
22
|
-
export default function ImageList(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} = _ref;
|
|
23
|
+
export default function ImageList({
|
|
24
|
+
images,
|
|
25
|
+
lastItemRef,
|
|
26
|
+
onImageClick,
|
|
27
|
+
isIconMaker,
|
|
28
|
+
canvasOrigin
|
|
29
|
+
}) {
|
|
30
30
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
31
31
|
justifyItems: "start",
|
|
32
32
|
height: "100%",
|
|
@@ -35,11 +35,9 @@ export default function ImageList(_ref) {
|
|
|
35
35
|
wrap: "wrap"
|
|
36
36
|
}, images.map((image, index) => {
|
|
37
37
|
let focusRef = null;
|
|
38
|
-
|
|
39
38
|
if (index === images.length - 1) {
|
|
40
39
|
focusRef = lastItemRef;
|
|
41
40
|
}
|
|
42
|
-
|
|
43
41
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
44
42
|
as: "div",
|
|
45
43
|
key: 'image-' + image.id,
|
|
@@ -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 ReactDOM from 'react-dom';
|
|
20
21
|
import bridge from '../../../../bridge';
|
|
@@ -30,63 +31,50 @@ export default class TrayController {
|
|
|
30
31
|
this._renderId = 0;
|
|
31
32
|
this._isIconMaker = false;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
34
|
get $container() {
|
|
35
35
|
let $container = document.getElementById(CONTAINER_ID);
|
|
36
|
-
|
|
37
36
|
if ($container == null) {
|
|
38
37
|
$container = document.createElement('div');
|
|
39
38
|
$container.id = CONTAINER_ID;
|
|
40
39
|
document.body.appendChild($container);
|
|
41
40
|
}
|
|
42
|
-
|
|
43
41
|
return $container;
|
|
44
42
|
}
|
|
45
|
-
|
|
46
43
|
get isOpen() {
|
|
47
44
|
return this._isOpen;
|
|
48
|
-
}
|
|
49
|
-
|
|
45
|
+
}
|
|
50
46
|
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
// Tray may be called to edit an Icon Maker icon alt text
|
|
48
|
+
showTrayForEditor(editor, isIconMaker = false) {
|
|
53
49
|
this._editor = editor;
|
|
54
50
|
this.$img = editor.selection.getNode();
|
|
55
51
|
this._shouldOpen = true;
|
|
56
52
|
this._isIconMaker = isIconMaker;
|
|
57
|
-
|
|
58
53
|
if (bridge.focusedEditor) {
|
|
59
54
|
// Dismiss any content trays that may already be open
|
|
60
55
|
bridge.hideTrays();
|
|
61
56
|
}
|
|
62
|
-
|
|
63
57
|
this._renderTray();
|
|
64
58
|
}
|
|
65
|
-
|
|
66
59
|
hideTrayForEditor(editor) {
|
|
67
60
|
if (this._editor === editor) {
|
|
68
61
|
this._dismissTray();
|
|
69
62
|
}
|
|
70
63
|
}
|
|
71
|
-
|
|
72
64
|
_applyImageOptions(imageOptions) {
|
|
73
65
|
const editor = this._editor;
|
|
74
66
|
const {
|
|
75
67
|
$img
|
|
76
68
|
} = this;
|
|
77
|
-
|
|
78
69
|
if (this._isIconMaker) {
|
|
79
70
|
this._applyIconAltTextChanges($img, editor, imageOptions);
|
|
80
|
-
|
|
81
71
|
this._dismissTray();
|
|
82
|
-
|
|
83
72
|
editor.focus();
|
|
84
73
|
return;
|
|
85
74
|
}
|
|
86
|
-
|
|
87
75
|
if (imageOptions.displayAs === 'embed') {
|
|
88
|
-
updateImage(editor, $img, imageOptions);
|
|
89
|
-
|
|
76
|
+
updateImage(editor, $img, imageOptions);
|
|
77
|
+
// tell tinymce so the context toolbar resets
|
|
90
78
|
editor.fire('ObjectResized', {
|
|
91
79
|
target: $img,
|
|
92
80
|
width: imageOptions.appliedWidth,
|
|
@@ -100,38 +88,30 @@ export default class TrayController {
|
|
|
100
88
|
});
|
|
101
89
|
editor.selection.setContent(link);
|
|
102
90
|
}
|
|
103
|
-
|
|
104
91
|
this._dismissTray();
|
|
105
|
-
|
|
106
92
|
editor.focus();
|
|
107
93
|
}
|
|
108
|
-
|
|
109
94
|
_applyIconAltTextChanges($img, editor, imageOptions) {
|
|
110
95
|
// Workaround: When passing empty string to editor.dom.setAttribs it removes the attribute
|
|
111
96
|
$img.setAttribute('alt', imageOptions.altText);
|
|
112
97
|
editor.dom.setAttribs($img, {
|
|
113
98
|
role: imageOptions.isDecorativeImage ? 'presentation' : null
|
|
114
|
-
});
|
|
99
|
+
});
|
|
115
100
|
|
|
101
|
+
// tell tinymce so the context toolbar resets
|
|
116
102
|
editor.fire('ObjectResized', {
|
|
117
103
|
target: $img,
|
|
118
104
|
width: imageOptions.appliedWidth,
|
|
119
105
|
height: imageOptions.appliedHeight
|
|
120
106
|
});
|
|
121
107
|
}
|
|
122
|
-
|
|
123
108
|
_dismissTray() {
|
|
124
109
|
this._shouldOpen = false;
|
|
125
|
-
|
|
126
110
|
this._renderTray();
|
|
127
|
-
|
|
128
111
|
this.$img = null;
|
|
129
112
|
this._editor = null;
|
|
130
113
|
}
|
|
131
|
-
|
|
132
114
|
_renderTray() {
|
|
133
|
-
var _this$_editor, _this$_editor$selecti;
|
|
134
|
-
|
|
135
115
|
if (this._shouldOpen) {
|
|
136
116
|
/*
|
|
137
117
|
* When the tray is being opened again, it should be rendered fresh
|
|
@@ -140,9 +120,8 @@ export default class TrayController {
|
|
|
140
120
|
*/
|
|
141
121
|
this._renderId++;
|
|
142
122
|
}
|
|
143
|
-
|
|
144
123
|
const io = asImageEmbed(this.$img);
|
|
145
|
-
io.isLinked =
|
|
124
|
+
io.isLinked = this._editor?.selection?.getSel().anchorNode.tagName === 'A';
|
|
146
125
|
const element = /*#__PURE__*/React.createElement(ImageOptionsTray, {
|
|
147
126
|
key: this._renderId,
|
|
148
127
|
imageOptions: io,
|
|
@@ -162,5 +141,4 @@ export default class TrayController {
|
|
|
162
141
|
});
|
|
163
142
|
ReactDOM.render(element, this.$container);
|
|
164
143
|
}
|
|
165
|
-
|
|
166
144
|
}
|
|
@@ -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, { useState, useEffect } from 'react';
|
|
19
20
|
import { bool, func, number, shape, string } from 'prop-types';
|
|
20
21
|
import { Button, CloseButton } from '@instructure/ui-buttons';
|
|
@@ -28,7 +29,7 @@ import ImageOptionsForm from '../../shared/ImageOptionsForm';
|
|
|
28
29
|
import { getTrayHeight, isExternalUrl } from '../../shared/trayUtils';
|
|
29
30
|
import validateURL from '../../instructure_links/validateURL';
|
|
30
31
|
import UrlPanel from '../../shared/Upload/UrlPanel';
|
|
31
|
-
import {
|
|
32
|
+
import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
|
|
32
33
|
export default function ImageOptionsTray(props) {
|
|
33
34
|
const {
|
|
34
35
|
imageOptions,
|
|
@@ -59,26 +60,20 @@ export default function ImageOptionsTray(props) {
|
|
|
59
60
|
minWidth: MIN_WIDTH,
|
|
60
61
|
minPercentage: MIN_PERCENTAGE
|
|
61
62
|
});
|
|
62
|
-
|
|
63
63
|
function handleUrlChange(newUrl) {
|
|
64
64
|
setUrl(newUrl);
|
|
65
65
|
}
|
|
66
|
-
|
|
67
66
|
function handleAltTextChange(event) {
|
|
68
67
|
setAltText(event.target.value);
|
|
69
68
|
}
|
|
70
|
-
|
|
71
69
|
function handleIsDecorativeChange(event) {
|
|
72
70
|
setIsDecorativeImage(event.target.checked);
|
|
73
71
|
}
|
|
74
|
-
|
|
75
72
|
function handleDisplayAsChange(event) {
|
|
76
73
|
setDisplayAs(event.target.value);
|
|
77
74
|
}
|
|
78
|
-
|
|
79
75
|
function handleImageSizeChange(event, selectedOption) {
|
|
80
76
|
setImageSize(selectedOption.value);
|
|
81
|
-
|
|
82
77
|
if (selectedOption.value === CUSTOM) {
|
|
83
78
|
setImageHeight(currentHeight);
|
|
84
79
|
setImageWidth(currentWidth);
|
|
@@ -91,13 +86,11 @@ export default function ImageOptionsTray(props) {
|
|
|
91
86
|
setImageWidth(width);
|
|
92
87
|
}
|
|
93
88
|
}
|
|
94
|
-
|
|
95
89
|
function handleSave(event) {
|
|
96
90
|
event.preventDefault();
|
|
97
91
|
const savedAltText = isDecorativeImage ? '' : altText;
|
|
98
92
|
let appliedHeight = imageHeight;
|
|
99
93
|
let appliedWidth = imageWidth;
|
|
100
|
-
|
|
101
94
|
if (imageSize === CUSTOM) {
|
|
102
95
|
if (dimensionsState.usePercentageUnits) {
|
|
103
96
|
appliedHeight = `${dimensionsState.percentage}%`;
|
|
@@ -107,7 +100,6 @@ export default function ImageOptionsTray(props) {
|
|
|
107
100
|
appliedWidth = dimensionsState.width;
|
|
108
101
|
}
|
|
109
102
|
}
|
|
110
|
-
|
|
111
103
|
onSave({
|
|
112
104
|
url,
|
|
113
105
|
altText: savedAltText,
|
|
@@ -117,26 +109,22 @@ export default function ImageOptionsTray(props) {
|
|
|
117
109
|
isDecorativeImage
|
|
118
110
|
});
|
|
119
111
|
}
|
|
120
|
-
|
|
121
112
|
useEffect(() => {
|
|
122
113
|
if (isIconMaker) {
|
|
123
114
|
setShowUrlField(false);
|
|
124
115
|
return;
|
|
125
116
|
}
|
|
126
|
-
|
|
127
117
|
let isValidURL;
|
|
128
|
-
|
|
129
118
|
try {
|
|
130
119
|
isValidURL = validateURL(url);
|
|
131
120
|
} catch (error) {
|
|
132
121
|
isValidURL = false;
|
|
133
122
|
} finally {
|
|
134
123
|
setShowUrlField(isValidURL ? isExternalUrl(url) : true);
|
|
135
|
-
}
|
|
136
|
-
|
|
124
|
+
}
|
|
125
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
137
126
|
}, [url]);
|
|
138
127
|
const messagesForSize = [];
|
|
139
|
-
|
|
140
128
|
if (imageSize !== CUSTOM) {
|
|
141
129
|
messagesForSize.push({
|
|
142
130
|
text: formatMessage('{width} x {height}px', {
|
|
@@ -146,16 +134,15 @@ export default function ImageOptionsTray(props) {
|
|
|
146
134
|
type: 'hint'
|
|
147
135
|
});
|
|
148
136
|
}
|
|
149
|
-
|
|
150
137
|
const disableForIcons = isIconMaker && !isDecorativeImage && altText === '';
|
|
151
|
-
const disableForImages = url === '' || displayAs === 'embed' && (!isDecorativeImage && altText === '' || imageSize === CUSTOM && !
|
|
138
|
+
const disableForImages = url === '' || displayAs === 'embed' && (!isDecorativeImage && altText === '' || imageSize === CUSTOM && !dimensionsState?.isValid);
|
|
152
139
|
const saveDisabled = isIconMaker ? disableForIcons : disableForImages;
|
|
153
140
|
const trayLabel = isIconMaker ? formatMessage('Icon Options Tray') : formatMessage('Image Options Tray');
|
|
154
141
|
const trayHeading = isIconMaker ? formatMessage('Icon Options') : formatMessage('Image Options');
|
|
155
142
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
156
143
|
"data-mce-component": true,
|
|
157
144
|
label: trayLabel,
|
|
158
|
-
mountNode:
|
|
145
|
+
mountNode: instuiPopupMountNodeFn,
|
|
159
146
|
onDismiss: onRequestClose,
|
|
160
147
|
onEntered: onEntered,
|
|
161
148
|
onExited: onExited,
|
|
@@ -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, { useRef } from 'react';
|
|
19
20
|
import { bool, func, oneOf, shape, string } from 'prop-types';
|
|
20
21
|
import { contentTrayDocumentShape } from '../../shared/fileShape';
|
|
@@ -24,15 +25,12 @@ import { Text } from '@instructure/ui-text';
|
|
|
24
25
|
import { LoadMoreButton, LoadingIndicator, LoadingStatus, useIncrementalLoading } from '../../../../common/incremental-loading';
|
|
25
26
|
import ImageList from '../ImageList';
|
|
26
27
|
import formatMessage from '../../../../format-message';
|
|
27
|
-
|
|
28
28
|
function hasFiles(images) {
|
|
29
29
|
return images.files.length > 0;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
31
|
function isEmpty(images) {
|
|
33
32
|
return !hasFiles(images) && !images.hasMore && !images.isLoading;
|
|
34
33
|
}
|
|
35
|
-
|
|
36
34
|
export default function Images(props) {
|
|
37
35
|
const {
|
|
38
36
|
fetchInitialImages,
|
|
@@ -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 doFileUpload from '../shared/Upload/doFileUpload';
|
|
19
20
|
export default function (ed, document) {
|
|
20
21
|
return doFileUpload(ed, document, {
|