@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,10 +15,10 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import { useEffect, useRef, useState } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
const CHANGE_EVENT_DELAY = 1000;
|
|
21
|
-
|
|
22
22
|
const digestValue = _ref => {
|
|
23
23
|
let {
|
|
24
24
|
parseValueCallback,
|
|
@@ -27,16 +27,13 @@ const digestValue = _ref => {
|
|
|
27
27
|
value
|
|
28
28
|
} = _ref;
|
|
29
29
|
const parsedNewValue = parseValueCallback(value);
|
|
30
|
-
|
|
31
30
|
if (parsedNewValue === null) {
|
|
32
31
|
return [null, null];
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
const processedNewValue = processValueCallback(parsedNewValue);
|
|
36
34
|
const formattedNewTempValue = formatValueCallback(processedNewValue);
|
|
37
35
|
return [formattedNewTempValue, processedNewValue];
|
|
38
36
|
};
|
|
39
|
-
|
|
40
37
|
export function useDebouncedNumericValue(_ref2) {
|
|
41
38
|
let {
|
|
42
39
|
value,
|
|
@@ -47,7 +44,6 @@ export function useDebouncedNumericValue(_ref2) {
|
|
|
47
44
|
} = _ref2;
|
|
48
45
|
const [inputValue, setInputValue] = useState(formatValueCallback(value));
|
|
49
46
|
const [hasError, setHasError] = useState(false);
|
|
50
|
-
|
|
51
47
|
const updateStateAfterDigest = newValue => {
|
|
52
48
|
const [formattedValue, processedValue] = digestValue({
|
|
53
49
|
parseValueCallback,
|
|
@@ -55,40 +51,31 @@ export function useDebouncedNumericValue(_ref2) {
|
|
|
55
51
|
formatValueCallback,
|
|
56
52
|
value: newValue
|
|
57
53
|
});
|
|
58
|
-
|
|
59
54
|
if (formattedValue === null || processedValue === null) {
|
|
60
55
|
setHasError(true);
|
|
61
56
|
return;
|
|
62
57
|
}
|
|
63
|
-
|
|
64
58
|
setHasError(false);
|
|
65
|
-
|
|
66
59
|
if (newValue !== formattedValue) {
|
|
67
60
|
setInputValue(formattedValue);
|
|
68
61
|
}
|
|
69
|
-
|
|
70
62
|
if (processedValue !== value) {
|
|
71
63
|
onChange(processedValue);
|
|
72
64
|
}
|
|
73
65
|
};
|
|
74
|
-
|
|
75
66
|
const debouncedUpdateStateAfterDigest = useRef(debounce(updateStateAfterDigest, CHANGE_EVENT_DELAY));
|
|
76
67
|
useEffect(() => {
|
|
77
68
|
const newTempValue = formatValueCallback(value);
|
|
78
|
-
|
|
79
69
|
if (newTempValue !== inputValue) {
|
|
80
70
|
setInputValue(newTempValue);
|
|
81
71
|
setHasError(false);
|
|
82
|
-
}
|
|
83
|
-
|
|
72
|
+
}
|
|
73
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
84
74
|
}, [value]);
|
|
85
|
-
|
|
86
75
|
const digestCurrentValue = () => updateStateAfterDigest(inputValue);
|
|
87
|
-
|
|
88
76
|
const digestNewValue = rawValue => {
|
|
89
77
|
setInputValue(rawValue);
|
|
90
78
|
debouncedUpdateStateAfterDigest.current(rawValue);
|
|
91
79
|
};
|
|
92
|
-
|
|
93
80
|
return [inputValue, digestCurrentValue, digestNewValue, hasError];
|
|
94
81
|
}
|
|
@@ -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 { BUTTON_ROTATION_DEGREES, MAX_SCALE_RATIO, MIN_SCALE_RATIO } from '../constants';
|
|
19
20
|
import round from '../../round';
|
|
20
21
|
export const calculateScaleRatio = scaleRatio => {
|
|
@@ -29,11 +30,9 @@ export const calculateScalePercentage = scalePercentage => {
|
|
|
29
30
|
};
|
|
30
31
|
export const calculateRotation = rotationAngle => {
|
|
31
32
|
const simplifiedRotationAngle = round(rotationAngle % 360);
|
|
32
|
-
|
|
33
33
|
if (Math.abs(rotationAngle) >= 360) {
|
|
34
34
|
return simplifiedRotationAngle;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
36
|
return rotationAngle;
|
|
38
37
|
};
|
|
39
38
|
export const getNearestRectAngle = (rotationAngle, shouldRotateToLeft) => {
|
|
@@ -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 round from '../round';
|
|
19
20
|
import { buildShapeMask } from './svg/shape';
|
|
20
21
|
import { createSvgElement } from './svg/utils';
|
|
@@ -49,22 +50,18 @@ export async function createCroppedImageSvg(cropperSettings, image) {
|
|
|
49
50
|
rootElement.appendChild(mainGroup);
|
|
50
51
|
return rootElement;
|
|
51
52
|
}
|
|
52
|
-
|
|
53
53
|
const fetchImageMetadata = src => {
|
|
54
54
|
return new Promise(resolve => {
|
|
55
55
|
const img = new Image();
|
|
56
|
-
|
|
57
56
|
img.onload = function () {
|
|
58
57
|
resolve({
|
|
59
58
|
imageWidth: this.naturalWidth,
|
|
60
59
|
imageHeight: this.naturalHeight
|
|
61
60
|
});
|
|
62
61
|
};
|
|
63
|
-
|
|
64
62
|
img.src = src;
|
|
65
63
|
});
|
|
66
64
|
};
|
|
67
|
-
|
|
68
65
|
const createDefsElement = _ref => {
|
|
69
66
|
let {
|
|
70
67
|
shape,
|
|
@@ -82,11 +79,9 @@ const createDefsElement = _ref => {
|
|
|
82
79
|
defs.appendChild(clipPath);
|
|
83
80
|
return defs;
|
|
84
81
|
};
|
|
85
|
-
|
|
86
82
|
const convertTranslationUnits = (translationPixels, imageHeight) => {
|
|
87
83
|
return imageHeight * translationPixels / PREVIEW_HEIGHT;
|
|
88
84
|
};
|
|
89
|
-
|
|
90
85
|
const createMainSvgGroup = _ref2 => {
|
|
91
86
|
let {
|
|
92
87
|
imageWidth,
|
|
@@ -113,7 +108,6 @@ const createMainSvgGroup = _ref2 => {
|
|
|
113
108
|
mainGroup.appendChild(imageElement);
|
|
114
109
|
return mainGroup;
|
|
115
110
|
};
|
|
116
|
-
|
|
117
111
|
export const setTransformAttribute = _ref3 => {
|
|
118
112
|
let {
|
|
119
113
|
imageElement,
|
|
@@ -135,15 +129,12 @@ export const setTransformAttribute = _ref3 => {
|
|
|
135
129
|
const x = round(-horizontalCenter + convertedTranslateX + squareDimension / 2, 2);
|
|
136
130
|
const y = round(-verticalCenter + convertedTranslateY + squareDimension / 2, 2);
|
|
137
131
|
let value = `translate(${x}, ${y})`;
|
|
138
|
-
|
|
139
132
|
if (rotation !== 0) {
|
|
140
133
|
// Rotates image using its center as pivot
|
|
141
134
|
value += ` rotate(${rotation}, ${horizontalCenter}, ${verticalCenter})`;
|
|
142
135
|
}
|
|
143
|
-
|
|
144
136
|
if (scaleRatio !== 1.0) {
|
|
145
137
|
value += ` scale(${scaleRatio})`;
|
|
146
138
|
}
|
|
147
|
-
|
|
148
139
|
imageElement.setAttribute('transform', value);
|
|
149
140
|
};
|
|
@@ -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 PropTypes from 'prop-types';
|
|
19
20
|
export const ImageCropperSettingsPropTypes = PropTypes.shape({
|
|
20
21
|
shape: PropTypes.string,
|
|
@@ -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 { DEFAULT_CROPPER_SETTINGS } from '../constants';
|
|
19
20
|
export const defaultState = DEFAULT_CROPPER_SETTINGS;
|
|
20
21
|
export const actions = {
|
|
@@ -29,43 +30,43 @@ export const actions = {
|
|
|
29
30
|
export const cropperSettingsReducer = (state, action) => {
|
|
30
31
|
switch (action.type) {
|
|
31
32
|
case actions.SET_SHAPE:
|
|
32
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
...state,
|
|
33
35
|
shape: action.payload
|
|
34
36
|
};
|
|
35
|
-
|
|
36
37
|
case actions.SET_ROTATION:
|
|
37
|
-
return {
|
|
38
|
+
return {
|
|
39
|
+
...state,
|
|
38
40
|
rotation: action.payload
|
|
39
41
|
};
|
|
40
|
-
|
|
41
42
|
case actions.SET_SCALE_RATIO:
|
|
42
|
-
return {
|
|
43
|
+
return {
|
|
44
|
+
...state,
|
|
43
45
|
scaleRatio: action.payload
|
|
44
46
|
};
|
|
45
|
-
|
|
46
47
|
case actions.SET_TRANSLATE_X:
|
|
47
|
-
return {
|
|
48
|
+
return {
|
|
49
|
+
...state,
|
|
48
50
|
translateX: action.payload
|
|
49
51
|
};
|
|
50
|
-
|
|
51
52
|
case actions.SET_TRANSLATE_Y:
|
|
52
|
-
return {
|
|
53
|
+
return {
|
|
54
|
+
...state,
|
|
53
55
|
translateY: action.payload
|
|
54
56
|
};
|
|
55
|
-
|
|
56
57
|
case actions.UPDATE_SETTINGS:
|
|
57
|
-
return {
|
|
58
|
+
return {
|
|
59
|
+
...state,
|
|
58
60
|
...action.payload
|
|
59
61
|
};
|
|
60
|
-
|
|
61
62
|
case actions.RESET_SETTINGS:
|
|
62
|
-
return {
|
|
63
|
+
return {
|
|
64
|
+
...state,
|
|
63
65
|
rotation: defaultState.rotation,
|
|
64
66
|
scaleRatio: defaultState.scaleRatio,
|
|
65
67
|
translateX: defaultState.translateX,
|
|
66
68
|
translateY: defaultState.translateY
|
|
67
69
|
};
|
|
68
|
-
|
|
69
70
|
default:
|
|
70
71
|
throw Error('Unknown action for image cropper reducer');
|
|
71
72
|
}
|
|
@@ -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 { createSvgElement } from './utils';
|
|
19
20
|
import { PREVIEW_HEIGHT, SHAPE_CONTAINER_LENGTH, GLUE_WIDTH, PREVIEW_WIDTH, PREVIEW_BACKGROUND_COLOR } from '../constants';
|
|
20
21
|
import { buildShapeMask } from './shape';
|
|
@@ -57,7 +58,6 @@ export function buildSvg(shape) {
|
|
|
57
58
|
mainContainer.appendChild(bgElement);
|
|
58
59
|
return mainContainer;
|
|
59
60
|
}
|
|
60
|
-
|
|
61
61
|
function createSvgContainer() {
|
|
62
62
|
return createSvgElement('svg', {
|
|
63
63
|
xmlns: 'http://www.w3.org/2000/svg',
|
|
@@ -65,7 +65,6 @@ function createSvgContainer() {
|
|
|
65
65
|
height: PREVIEW_HEIGHT
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
|
|
69
68
|
function createMask(settings) {
|
|
70
69
|
const maskElement = createSvgElement('mask', {
|
|
71
70
|
id: 'imageCropperMask'
|
|
@@ -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 round from '../../round';
|
|
19
20
|
import { SHAPE_CONTAINER_LENGTH } from '../constants';
|
|
20
21
|
import { createSvgElement } from './utils';
|
|
@@ -25,37 +26,27 @@ export function buildShapeMask(_ref) {
|
|
|
25
26
|
size
|
|
26
27
|
} = _ref;
|
|
27
28
|
const dimensionSize = size || SHAPE_CONTAINER_LENGTH;
|
|
28
|
-
|
|
29
29
|
switch (shape) {
|
|
30
30
|
case Shape.Square:
|
|
31
31
|
return buildSquare(dimensionSize);
|
|
32
|
-
|
|
33
32
|
case Shape.Circle:
|
|
34
33
|
return buildCircle(dimensionSize);
|
|
35
|
-
|
|
36
34
|
case Shape.Triangle:
|
|
37
35
|
return buildTriangle(dimensionSize);
|
|
38
|
-
|
|
39
36
|
case Shape.Diamond:
|
|
40
37
|
return buildDiamond(dimensionSize);
|
|
41
|
-
|
|
42
38
|
case Shape.Pentagon:
|
|
43
39
|
return buildPentagon(dimensionSize);
|
|
44
|
-
|
|
45
40
|
case Shape.Hexagon:
|
|
46
41
|
return buildHexagon(dimensionSize);
|
|
47
|
-
|
|
48
42
|
case Shape.Octagon:
|
|
49
43
|
return buildOctagon(dimensionSize);
|
|
50
|
-
|
|
51
44
|
case Shape.Star:
|
|
52
45
|
return buildStar(dimensionSize);
|
|
53
|
-
|
|
54
46
|
default:
|
|
55
47
|
throw new Error(`Invalid shape: ${shape}`);
|
|
56
48
|
}
|
|
57
49
|
}
|
|
58
|
-
|
|
59
50
|
function buildSquare(dimensionSize) {
|
|
60
51
|
return createSvgElement('rect', {
|
|
61
52
|
x: 0,
|
|
@@ -65,7 +56,6 @@ function buildSquare(dimensionSize) {
|
|
|
65
56
|
fill: 'black'
|
|
66
57
|
});
|
|
67
58
|
}
|
|
68
|
-
|
|
69
59
|
function buildCircle(dimensionSize) {
|
|
70
60
|
return createSvgElement('circle', {
|
|
71
61
|
cx: dimensionSize / 2,
|
|
@@ -74,19 +64,16 @@ function buildCircle(dimensionSize) {
|
|
|
74
64
|
fill: 'black'
|
|
75
65
|
});
|
|
76
66
|
}
|
|
77
|
-
|
|
78
67
|
function buildTriangle(dimensionSize) {
|
|
79
68
|
return createSvgElement('path', {
|
|
80
69
|
d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize}H0L${dimensionSize / 2} 0Z`
|
|
81
70
|
});
|
|
82
71
|
}
|
|
83
|
-
|
|
84
72
|
function buildDiamond(dimensionSize) {
|
|
85
73
|
return createSvgElement('path', {
|
|
86
74
|
d: `M${dimensionSize / 2} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize / 2} ${dimensionSize}L0 ${dimensionSize / 2}L${dimensionSize / 2} 0Z`
|
|
87
75
|
});
|
|
88
76
|
}
|
|
89
|
-
|
|
90
77
|
function buildPentagon(dimensionSize) {
|
|
91
78
|
const half = round(dimensionSize / 2, 2);
|
|
92
79
|
const alpha = round(0.3906 * dimensionSize, 2);
|
|
@@ -95,14 +82,12 @@ function buildPentagon(dimensionSize) {
|
|
|
95
82
|
d: `M${half} 0L${dimensionSize} ${alpha}L${half + beta} ${dimensionSize}H${half - beta}L0 ${alpha}L${half} 0L${half} 0Z`
|
|
96
83
|
});
|
|
97
84
|
}
|
|
98
|
-
|
|
99
85
|
function buildHexagon(dimensionSize) {
|
|
100
86
|
const leg = round(0.2895 * dimensionSize, 2);
|
|
101
87
|
return createSvgElement('path', {
|
|
102
88
|
d: `M${dimensionSize - leg} 0L${dimensionSize} ${dimensionSize / 2}L${dimensionSize - leg} ${dimensionSize}H${leg}L0 ${dimensionSize / 2}L${leg} 0H${dimensionSize - leg}Z`
|
|
103
89
|
});
|
|
104
90
|
}
|
|
105
|
-
|
|
106
91
|
function buildOctagon(dimensionSize) {
|
|
107
92
|
const leg = round(0.2895 * dimensionSize, 2);
|
|
108
93
|
const side = round(dimensionSize - 2 * leg, 2);
|
|
@@ -110,7 +95,6 @@ function buildOctagon(dimensionSize) {
|
|
|
110
95
|
d: `M0 ${leg}L${leg} 0H${leg + side}L${dimensionSize} ${leg}V${leg + side}L${leg + side} ${dimensionSize}H${leg}L0 ${leg + side}V${leg}Z`
|
|
111
96
|
});
|
|
112
97
|
}
|
|
113
|
-
|
|
114
98
|
function buildStar(dimensionSize) {
|
|
115
99
|
const half = round(dimensionSize / 2, 2);
|
|
116
100
|
const alpha = round(0.1143 * dimensionSize, 2);
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
export function createSvgElement(tag) {
|
|
19
20
|
let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
20
21
|
const element = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
|
@@ -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 { useEffect, useState, useRef, useCallback } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
import { KEY_EVENT_DELAY, KEY_EVENT_ACCELERATION } from './constants';
|
|
@@ -22,25 +23,20 @@ import { actions } from './reducers/imageCropper';
|
|
|
22
23
|
const EVENT_EXCEPTION_ELEMENT_IDS = ['imageCropperHeader', 'imageCropperFooter', 'imageCropperControls'];
|
|
23
24
|
const TOUCH_EVENTS = ['ontouchmove', 'ontouchend', 'ontouchcancel'];
|
|
24
25
|
const MOUSE_EVENTS = ['onmousemove', 'onmouseup', 'onmouseout'];
|
|
25
|
-
|
|
26
26
|
function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch) {
|
|
27
27
|
// Refs that manage the keydown acceleration
|
|
28
28
|
const direction = useRef(0);
|
|
29
29
|
const initialTime = useRef(null);
|
|
30
|
-
|
|
31
30
|
const onKeyDown = event => {
|
|
32
31
|
// 37 = Left, 38 = Up, 39 = Right, 40 = Down
|
|
33
32
|
const {
|
|
34
33
|
keyCode
|
|
35
34
|
} = event;
|
|
36
|
-
|
|
37
35
|
if (![37, 38, 39, 40].includes(keyCode)) {
|
|
38
36
|
return;
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
event.preventDefault();
|
|
42
39
|
let elapsedTime;
|
|
43
|
-
|
|
44
40
|
if (keyCode !== direction.current) {
|
|
45
41
|
elapsedTime = 0;
|
|
46
42
|
initialTime.current = new Date();
|
|
@@ -55,22 +51,18 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
|
|
|
55
51
|
const currentTime = new Date();
|
|
56
52
|
elapsedTime = (currentTime - initialTime.current) / 1000;
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
const translationDiff = Math.floor(KEY_EVENT_ACCELERATION * elapsedTime ** 2) || 1;
|
|
60
|
-
|
|
61
55
|
if ([37, 39].includes(keyCode)) {
|
|
62
56
|
const sign = keyCode === 37 ? -1 : 1;
|
|
63
57
|
const newTranslateX = tempTranslateXRef.current + sign * translationDiff;
|
|
64
58
|
setTempTranslateX(newTranslateX);
|
|
65
59
|
}
|
|
66
|
-
|
|
67
60
|
if ([38, 40].includes(keyCode)) {
|
|
68
61
|
const sign = keyCode === 38 ? -1 : 1;
|
|
69
62
|
const newTranslateY = tempTranslateYRef.current + sign * translationDiff;
|
|
70
63
|
setTempTranslateY(newTranslateY);
|
|
71
64
|
}
|
|
72
65
|
};
|
|
73
|
-
|
|
74
66
|
const stopMovement = useCallback(debounce(() => {
|
|
75
67
|
direction.current = 0;
|
|
76
68
|
initialTime.current = null;
|
|
@@ -83,41 +75,36 @@ function useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tem
|
|
|
83
75
|
// If the active element is in the modal header, footer or controls.
|
|
84
76
|
if (EVENT_EXCEPTION_ELEMENT_IDS.some(id => {
|
|
85
77
|
var _document$getElementB;
|
|
86
|
-
|
|
87
78
|
return (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.contains(document.activeElement);
|
|
88
79
|
})) {
|
|
89
80
|
return;
|
|
90
81
|
}
|
|
91
|
-
|
|
92
82
|
onKeyDown(event);
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
|
|
83
|
+
};
|
|
84
|
+
// Adds the event listener when component did mount
|
|
96
85
|
document.addEventListener('keydown', onKeyDownWrapper);
|
|
97
86
|
return () => {
|
|
98
87
|
// Removes the event listener when component will unmount
|
|
99
88
|
document.removeEventListener('keydown', onKeyDownWrapper);
|
|
100
|
-
};
|
|
89
|
+
};
|
|
90
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
101
91
|
}, []);
|
|
102
92
|
useEffect(() => {
|
|
103
93
|
if (isMoving && direction.current !== 0) {
|
|
104
94
|
stopMovement();
|
|
105
|
-
}
|
|
106
|
-
|
|
95
|
+
}
|
|
96
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
107
97
|
}, [tempTranslateX, tempTranslateY]);
|
|
108
98
|
}
|
|
109
|
-
|
|
110
99
|
function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving) {
|
|
111
100
|
const initialPageX = useRef(0);
|
|
112
101
|
const initialPageY = useRef(0);
|
|
113
102
|
const isDragging = useRef(false);
|
|
114
103
|
const imgElement = useRef(null);
|
|
115
|
-
|
|
116
104
|
const onStopMove = isMouseEvent => () => {
|
|
117
105
|
isDragging.current = false;
|
|
118
106
|
initialPageX.current = 0;
|
|
119
107
|
initialPageY.current = 0;
|
|
120
|
-
|
|
121
108
|
if (imgElement.current) {
|
|
122
109
|
const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
|
|
123
110
|
imgElement.current[move] = null;
|
|
@@ -125,15 +112,12 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
125
112
|
imgElement.current[cancel] = null;
|
|
126
113
|
imgElement.current = null;
|
|
127
114
|
}
|
|
128
|
-
|
|
129
115
|
setIsMoving(false);
|
|
130
116
|
};
|
|
131
|
-
|
|
132
117
|
const onMove = isMouseEvent => e => {
|
|
133
118
|
if (!isDragging.current) {
|
|
134
119
|
return onStopMove();
|
|
135
120
|
}
|
|
136
|
-
|
|
137
121
|
const {
|
|
138
122
|
clientX,
|
|
139
123
|
clientY
|
|
@@ -141,7 +125,6 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
141
125
|
setTempTranslateX(tempTranslateX + clientX - initialPageX.current);
|
|
142
126
|
setTempTranslateY(tempTranslateY + clientY - initialPageY.current);
|
|
143
127
|
};
|
|
144
|
-
|
|
145
128
|
const onStartMove = (e, isMouseEvent) => {
|
|
146
129
|
isDragging.current = true;
|
|
147
130
|
const {
|
|
@@ -155,79 +138,69 @@ function useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslate
|
|
|
155
138
|
initialPageY.current = clientY;
|
|
156
139
|
const [move, end, cancel] = isMouseEvent ? MOUSE_EVENTS : TOUCH_EVENTS;
|
|
157
140
|
target[move] = onMove(isMouseEvent);
|
|
158
|
-
target[end] = onStopMove(isMouseEvent);
|
|
159
|
-
|
|
141
|
+
target[end] = onStopMove(isMouseEvent);
|
|
142
|
+
// Should stop the movement when touch/mouse leaves the preview
|
|
160
143
|
target[cancel] = onStopMove(isMouseEvent);
|
|
161
144
|
imgElement.current = target;
|
|
162
145
|
setIsMoving(true);
|
|
163
146
|
};
|
|
164
|
-
|
|
165
147
|
return [e => onStartMove(e, true), e => onStartMove(e, false)];
|
|
166
148
|
}
|
|
167
|
-
|
|
168
149
|
export function useKeyMouseTouchEvents(translateX, translateY, dispatch) {
|
|
169
150
|
const [tempTranslateX, _setTempTranslateX] = useState(translateX);
|
|
170
151
|
const [tempTranslateY, _setTempTranslateY] = useState(translateY);
|
|
171
|
-
const [isMoving, setIsMoving] = useState(false);
|
|
152
|
+
const [isMoving, setIsMoving] = useState(false);
|
|
172
153
|
|
|
154
|
+
// These are used to get the current values when the callback is called from outside.
|
|
173
155
|
const tempTranslateXRef = useRef(tempTranslateX);
|
|
174
156
|
const tempTranslateYRef = useRef(tempTranslateY);
|
|
175
|
-
|
|
176
157
|
const setTempTranslateX = data => {
|
|
177
158
|
setIsMoving(true);
|
|
178
159
|
tempTranslateXRef.current = data;
|
|
179
|
-
|
|
180
160
|
_setTempTranslateX(data);
|
|
181
161
|
};
|
|
182
|
-
|
|
183
162
|
const setTempTranslateY = data => {
|
|
184
163
|
setIsMoving(true);
|
|
185
164
|
tempTranslateYRef.current = data;
|
|
186
|
-
|
|
187
165
|
_setTempTranslateY(data);
|
|
188
166
|
};
|
|
189
|
-
|
|
190
167
|
useKeysEvents(tempTranslateXRef, tempTranslateYRef, tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, isMoving, setIsMoving, dispatch);
|
|
191
|
-
const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving);
|
|
168
|
+
const [onMouseDown, onTouchStart] = useMouseAndTouchEvents(tempTranslateX, tempTranslateY, setTempTranslateX, setTempTranslateY, setIsMoving);
|
|
192
169
|
|
|
170
|
+
// Updates the reducer state when user stops moving.
|
|
193
171
|
useEffect(() => {
|
|
194
172
|
if (isMoving) {
|
|
195
173
|
return;
|
|
196
174
|
}
|
|
197
|
-
|
|
198
175
|
if (tempTranslateX !== translateX) {
|
|
199
176
|
dispatch({
|
|
200
177
|
type: actions.SET_TRANSLATE_X,
|
|
201
178
|
payload: tempTranslateX
|
|
202
179
|
});
|
|
203
180
|
}
|
|
204
|
-
|
|
205
181
|
if (tempTranslateY !== translateY) {
|
|
206
182
|
dispatch({
|
|
207
183
|
type: actions.SET_TRANSLATE_Y,
|
|
208
184
|
payload: tempTranslateY
|
|
209
185
|
});
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
}, [isMoving]);
|
|
186
|
+
}
|
|
187
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
188
|
+
}, [isMoving]);
|
|
213
189
|
|
|
190
|
+
// Updates the component state when props changed.
|
|
214
191
|
useEffect(() => {
|
|
215
192
|
if (isMoving) {
|
|
216
193
|
return;
|
|
217
194
|
}
|
|
218
|
-
|
|
219
195
|
if (translateX !== tempTranslateX) {
|
|
220
196
|
tempTranslateXRef.current = translateX;
|
|
221
|
-
|
|
222
197
|
_setTempTranslateX(translateX);
|
|
223
198
|
}
|
|
224
|
-
|
|
225
199
|
if (translateY !== tempTranslateY) {
|
|
226
200
|
tempTranslateYRef.current = translateY;
|
|
227
|
-
|
|
228
201
|
_setTempTranslateY(translateY);
|
|
229
|
-
}
|
|
230
|
-
|
|
202
|
+
}
|
|
203
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
231
204
|
}, [translateX, translateY]);
|
|
232
205
|
return [tempTranslateX, tempTranslateY, onMouseDown, onTouchStart];
|
|
233
206
|
}
|
|
@@ -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 { useEffect, useState } from 'react';
|
|
19
20
|
import { debounce } from '@instructure/debounce';
|
|
20
21
|
import { calculateScaleRatio } from './controls/utils';
|
|
@@ -23,35 +24,32 @@ import { actions } from './reducers/imageCropper';
|
|
|
23
24
|
export function useMouseWheel(scaleRatio, dispatch) {
|
|
24
25
|
const [tempScaleRatio, setTempScaleRatio] = useState(scaleRatio);
|
|
25
26
|
const [isScaling, setIsScaling] = useState(false);
|
|
26
|
-
|
|
27
27
|
const onWheelCallback = event => {
|
|
28
28
|
// Couldn't prevent modal body scroll when zoom, when using {passive:false}
|
|
29
29
|
// the zoom event listener makes zoom look like a bouncing effect.
|
|
30
30
|
// https://chromestatus.com/feature/6662647093133312
|
|
31
31
|
// event.preventDefault()
|
|
32
|
-
const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
|
|
33
32
|
|
|
33
|
+
const newScaleRatio = calculateScaleRatio(tempScaleRatio - event.deltaY * WHEEL_SCALE_STEP);
|
|
34
34
|
if (newScaleRatio !== tempScaleRatio) {
|
|
35
35
|
setIsScaling(true);
|
|
36
36
|
setTempScaleRatio(newScaleRatio);
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
-
|
|
40
39
|
const setScalingRatio = () => {
|
|
41
40
|
setIsScaling(false);
|
|
42
41
|
};
|
|
43
|
-
|
|
44
42
|
useEffect(() => {
|
|
45
43
|
if (!isScaling) {
|
|
46
44
|
setTempScaleRatio(scaleRatio);
|
|
47
|
-
}
|
|
48
|
-
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
49
47
|
}, [scaleRatio]);
|
|
50
48
|
useEffect(() => {
|
|
51
49
|
if (isScaling) {
|
|
52
50
|
debounce(setScalingRatio, WHEEL_EVENT_DELAY)();
|
|
53
|
-
}
|
|
54
|
-
|
|
51
|
+
}
|
|
52
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
53
|
}, [tempScaleRatio]);
|
|
56
54
|
useEffect(() => {
|
|
57
55
|
if (!isScaling) {
|
|
@@ -59,8 +57,8 @@ export function useMouseWheel(scaleRatio, dispatch) {
|
|
|
59
57
|
type: actions.SET_SCALE_RATIO,
|
|
60
58
|
payload: tempScaleRatio
|
|
61
59
|
});
|
|
62
|
-
}
|
|
63
|
-
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
62
|
}, [isScaling]);
|
|
65
63
|
return [tempScaleRatio, onWheelCallback];
|
|
66
64
|
}
|
|
@@ -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 { IconButton } from '@instructure/ui-buttons';
|
|
20
21
|
import { SimpleSelect } from '@instructure/ui-simple-select';
|
|
@@ -28,7 +29,6 @@ import { Tooltip } from '@instructure/ui-tooltip';
|
|
|
28
29
|
import { CUSTOM, MIN_HEIGHT, MIN_WIDTH, MIN_PERCENTAGE, imageSizes, labelForImageSize } from '../instructure_image/ImageEmbedOptions';
|
|
29
30
|
import formatMessage from '../../../format-message';
|
|
30
31
|
import DimensionsInput from './DimensionsInput';
|
|
31
|
-
|
|
32
32
|
const ImageOptionsForm = _ref => {
|
|
33
33
|
let {
|
|
34
34
|
imageSize,
|
|
@@ -137,5 +137,4 @@ const ImageOptionsForm = _ref => {
|
|
|
137
137
|
minPercentage: MIN_PERCENTAGE
|
|
138
138
|
})))));
|
|
139
139
|
};
|
|
140
|
-
|
|
141
140
|
export default ImageOptionsForm;
|