@instructure/canvas-rce 5.14.1 → 5.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/DEVELOPMENT.md +1 -1
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +12 -34
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +8 -10
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +76 -81
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/styleMock.js +0 -18
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2022 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,11 +16,11 @@ import _pt from "prop-types";
|
|
|
17
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
18
|
*/
|
|
19
|
+
|
|
20
20
|
import React from 'react';
|
|
21
21
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
22
22
|
import formatMessage from '../../../../format-message';
|
|
23
23
|
export let Direction;
|
|
24
|
-
|
|
25
24
|
(function (Direction) {
|
|
26
25
|
Direction[Direction["LEFT"] = 37] = "LEFT";
|
|
27
26
|
Direction[Direction["UP"] = 38] = "UP";
|
|
@@ -29,26 +28,20 @@ export let Direction;
|
|
|
29
28
|
Direction[Direction["DOWN"] = 40] = "DOWN";
|
|
30
29
|
Direction[Direction["NONE"] = 0] = "NONE";
|
|
31
30
|
})(Direction || (Direction = {}));
|
|
32
|
-
|
|
33
31
|
const directionToWord = direction => {
|
|
34
32
|
switch (direction) {
|
|
35
33
|
case Direction.LEFT:
|
|
36
34
|
return formatMessage('Left');
|
|
37
|
-
|
|
38
35
|
case Direction.UP:
|
|
39
36
|
return formatMessage('Up');
|
|
40
|
-
|
|
41
37
|
case Direction.RIGHT:
|
|
42
38
|
return formatMessage('Right');
|
|
43
|
-
|
|
44
39
|
case Direction.DOWN:
|
|
45
40
|
return formatMessage('Down');
|
|
46
|
-
|
|
47
41
|
case Direction.NONE:
|
|
48
42
|
return null;
|
|
49
43
|
}
|
|
50
44
|
};
|
|
51
|
-
|
|
52
45
|
export const DirectionRegion = _ref => {
|
|
53
46
|
let {
|
|
54
47
|
direction
|
|
@@ -30,7 +30,6 @@ import { Controls } from './controls';
|
|
|
30
30
|
import { ImageCropperSettingsPropTypes } from './propTypes';
|
|
31
31
|
import { DirectionRegion } from './DirectionRegion';
|
|
32
32
|
import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
|
|
33
|
-
|
|
34
33
|
const renderBody = (image, settings, dispatch, message, loading) => {
|
|
35
34
|
if (loading) {
|
|
36
35
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
@@ -42,7 +41,6 @@ const renderBody = (image, settings, dispatch, message, loading) => {
|
|
|
42
41
|
size: "large"
|
|
43
42
|
})));
|
|
44
43
|
}
|
|
45
|
-
|
|
46
44
|
return /*#__PURE__*/React.createElement(Flex, {
|
|
47
45
|
direction: "column",
|
|
48
46
|
margin: "none"
|
|
@@ -66,7 +64,6 @@ const renderBody = (image, settings, dispatch, message, loading) => {
|
|
|
66
64
|
direction: settings.direction
|
|
67
65
|
}));
|
|
68
66
|
};
|
|
69
|
-
|
|
70
67
|
const renderFooter = (settings, onClose) => {
|
|
71
68
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
|
|
72
69
|
onClick: onClose,
|
|
@@ -76,7 +73,6 @@ const renderFooter = (settings, onClose) => {
|
|
|
76
73
|
type: "submit"
|
|
77
74
|
}, formatMessage('Save')));
|
|
78
75
|
};
|
|
79
|
-
|
|
80
76
|
export const ImageCropperModal = _ref => {
|
|
81
77
|
let {
|
|
82
78
|
open,
|
|
@@ -93,7 +89,8 @@ export const ImageCropperModal = _ref => {
|
|
|
93
89
|
shape !== settings.shape && dispatch({
|
|
94
90
|
type: actions.SET_SHAPE,
|
|
95
91
|
payload: shape
|
|
96
|
-
});
|
|
92
|
+
});
|
|
93
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
97
94
|
}, [shape]);
|
|
98
95
|
useEffect(() => {
|
|
99
96
|
cropSettings && dispatch({
|
|
@@ -110,9 +107,9 @@ export const ImageCropperModal = _ref => {
|
|
|
110
107
|
open: open,
|
|
111
108
|
onDismiss: onClose,
|
|
112
109
|
onSubmit: e => {
|
|
113
|
-
e.preventDefault();
|
|
110
|
+
e.preventDefault();
|
|
111
|
+
// Direction is only used while in cropper and
|
|
114
112
|
// should not be embedded in the icon's metadata
|
|
115
|
-
|
|
116
113
|
const {
|
|
117
114
|
direction,
|
|
118
115
|
...cropperSettings
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { useEffect, createRef } from 'react';
|
|
19
20
|
import PropTypes from 'prop-types';
|
|
20
21
|
import formatMessage from '../../../../format-message';
|
|
@@ -25,20 +26,17 @@ import { useMouseWheel } from './useMouseWheel';
|
|
|
25
26
|
import { useKeyMouseTouchEvents } from './useKeyMouseEvents';
|
|
26
27
|
import checkerboardStyle from '../CheckerboardStyling';
|
|
27
28
|
import { View } from '@instructure/ui-view';
|
|
29
|
+
|
|
28
30
|
/**
|
|
29
31
|
* Remove the node contents and append the svg element.
|
|
30
32
|
*/
|
|
31
|
-
|
|
32
33
|
function replaceSvg(svg, node) {
|
|
33
34
|
if (!node) return;
|
|
34
|
-
|
|
35
35
|
while (node.firstChild) {
|
|
36
36
|
node.removeChild(node.lastChild);
|
|
37
37
|
}
|
|
38
|
-
|
|
39
38
|
node.appendChild(svg);
|
|
40
39
|
}
|
|
41
|
-
|
|
42
40
|
function getTransformValue(_ref) {
|
|
43
41
|
let {
|
|
44
42
|
translateX,
|
|
@@ -53,7 +51,6 @@ function getTransformValue(_ref) {
|
|
|
53
51
|
if (scaleRatio > 1) values.push(`scale(${scaleRatio})`);
|
|
54
52
|
return values.join(' ');
|
|
55
53
|
}
|
|
56
|
-
|
|
57
54
|
export const Preview = _ref2 => {
|
|
58
55
|
let {
|
|
59
56
|
image,
|
|
@@ -73,8 +70,8 @@ export const Preview = _ref2 => {
|
|
|
73
70
|
const [tempScaleRatio, onWheelCallback] = useMouseWheel(scaleRatio, dispatch);
|
|
74
71
|
const [tempTranslateX, tempTranslateY, onMouseDownCallback, onTouchStartCallback] = useKeyMouseTouchEvents(translateX, translateY, dispatch, imgRef);
|
|
75
72
|
useEffect(() => {
|
|
76
|
-
imgRef.current.ondragstart = () => false;
|
|
77
|
-
|
|
73
|
+
imgRef.current.ondragstart = () => false;
|
|
74
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
78
75
|
}, []);
|
|
79
76
|
useEffect(() => {
|
|
80
77
|
const svg = buildSvg(shape);
|
|
@@ -86,17 +83,16 @@ export const Preview = _ref2 => {
|
|
|
86
83
|
rotation,
|
|
87
84
|
scaleRatio: tempScaleRatio
|
|
88
85
|
});
|
|
89
|
-
|
|
90
86
|
function isSafariVersion15OrLesser() {
|
|
91
87
|
const match = /Version\/(\d+).+Safari/.exec(navigator.userAgent);
|
|
92
88
|
return match ? parseInt(match[1], 10) < 16 : false;
|
|
93
|
-
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Clip is not supported in Safari until v16.
|
|
94
92
|
// It's needed here to prevent a strange screenreader
|
|
95
93
|
// behavior that makes the cropper look bad. 'hidden'
|
|
96
94
|
// suffices when clip is not available, although it's not perfect
|
|
97
95
|
// TODO: remove when Safari versions >= 16 are more commonplace
|
|
98
|
-
|
|
99
|
-
|
|
100
96
|
const overflow = isSafariVersion15OrLesser() ? 'hidden' : 'clip';
|
|
101
97
|
return /*#__PURE__*/React.createElement("div", {
|
|
102
98
|
style: {
|
|
@@ -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 const PREVIEW_BACKGROUND_COLOR = '#394B58';
|
|
19
20
|
export const PREVIEW_WIDTH = 942;
|
|
20
21
|
export const PREVIEW_HEIGHT = 350;
|
|
@@ -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 PropTypes from 'prop-types';
|
|
20
21
|
import { NumberInput } from '@instructure/ui-number-input';
|
|
@@ -37,20 +38,16 @@ export const CustomNumberInput = _ref => {
|
|
|
37
38
|
formatValueCallback,
|
|
38
39
|
onChange
|
|
39
40
|
});
|
|
40
|
-
|
|
41
41
|
const handleChange = (event, newValue) => digestNewValue(newValue.trim());
|
|
42
|
-
|
|
43
42
|
const handleBlur = () => digestCurrentValue();
|
|
44
|
-
|
|
45
43
|
const handleIncrement = () => onChange(processValueCallback(value + 1));
|
|
46
|
-
|
|
47
44
|
const handleDecrement = () => onChange(processValueCallback(value - 1));
|
|
48
|
-
|
|
49
45
|
const messages = hasError ? [{
|
|
50
46
|
text: formatMessage('Invalid entry.'),
|
|
51
47
|
type: 'error'
|
|
52
48
|
}] : [];
|
|
53
49
|
return /*#__PURE__*/React.createElement(NumberInput, {
|
|
50
|
+
allowStringValue: true,
|
|
54
51
|
value: inputValue,
|
|
55
52
|
onChange: handleChange,
|
|
56
53
|
onBlur: handleBlur,
|
|
@@ -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 PropTypes from 'prop-types';
|
|
20
21
|
import { Flex } from '@instructure/ui-flex';
|
|
@@ -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 PropTypes from 'prop-types';
|
|
20
21
|
import { IconButton } from '@instructure/ui-buttons';
|
|
@@ -25,36 +26,26 @@ import { CustomNumberInput } from './CustomNumberInput';
|
|
|
25
26
|
import { calculateRotation, getNearestRectAngle } from './utils';
|
|
26
27
|
import { BUTTON_ROTATION_DEGREES } from '../constants';
|
|
27
28
|
import formatMessage from '../../../../../format-message';
|
|
28
|
-
|
|
29
29
|
const parseRotationText = value => {
|
|
30
30
|
// Matches a positive/negative integer/decimal followed by "º" symbol
|
|
31
31
|
const matches = value.match(/([-|+]?\d+(?:\.\d+)?)º?/);
|
|
32
|
-
|
|
33
32
|
if (!matches) {
|
|
34
33
|
return null;
|
|
35
34
|
}
|
|
36
|
-
|
|
37
35
|
const result = parseInt(matches[1], 10);
|
|
38
|
-
|
|
39
36
|
if (Number.isNaN(result)) {
|
|
40
37
|
return null;
|
|
41
38
|
}
|
|
42
|
-
|
|
43
39
|
return result;
|
|
44
40
|
};
|
|
45
|
-
|
|
46
41
|
const formatRotationText = value => `${value}º`;
|
|
47
|
-
|
|
48
42
|
export const RotationControls = _ref => {
|
|
49
43
|
let {
|
|
50
44
|
rotation,
|
|
51
45
|
onChange
|
|
52
46
|
} = _ref;
|
|
53
|
-
|
|
54
47
|
const rotateLeftCallback = () => onChange(calculateRotation(getNearestRectAngle(rotation, true) - BUTTON_ROTATION_DEGREES));
|
|
55
|
-
|
|
56
48
|
const rotateRightCallback = () => onChange(calculateRotation(getNearestRectAngle(rotation, false) + BUTTON_ROTATION_DEGREES));
|
|
57
|
-
|
|
58
49
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
59
50
|
margin: "0 medium 0 0",
|
|
60
51
|
title: formatMessage('Rotation'),
|
|
@@ -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 PropTypes from 'prop-types';
|
|
20
21
|
import { Flex } from '@instructure/ui-flex';
|
|
@@ -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 { IconZoomInLine, IconZoomOutLine } from '@instructure/ui-icons';
|
|
@@ -28,33 +29,25 @@ import PropTypes from 'prop-types';
|
|
|
28
29
|
import { CustomNumberInput } from './CustomNumberInput';
|
|
29
30
|
import { showFlashAlert } from '../../../../../common/FlashAlert';
|
|
30
31
|
import { debounce } from '@instructure/debounce';
|
|
31
|
-
|
|
32
32
|
const parseZoomText = value => {
|
|
33
33
|
// Matches a positive/negative integer/decimal followed by %" symbol
|
|
34
34
|
const matches = value.match(/([-|+]?\d+(?:\.\d+)?)%?/);
|
|
35
|
-
|
|
36
35
|
if (!matches) {
|
|
37
36
|
return null;
|
|
38
37
|
}
|
|
39
|
-
|
|
40
38
|
const result = parseInt(matches[1], 10);
|
|
41
|
-
|
|
42
39
|
if (Number.isNaN(result)) {
|
|
43
40
|
return null;
|
|
44
41
|
}
|
|
45
|
-
|
|
46
42
|
return result;
|
|
47
43
|
};
|
|
48
|
-
|
|
49
44
|
const formatZoomText = value => `${value}%`;
|
|
50
|
-
|
|
51
45
|
const debouncedAlert = debounce(showFlashAlert, 1000);
|
|
52
46
|
export const ZoomControls = _ref => {
|
|
53
47
|
let {
|
|
54
48
|
scaleRatio,
|
|
55
49
|
onChange
|
|
56
50
|
} = _ref;
|
|
57
|
-
|
|
58
51
|
const onZoomChange = value => {
|
|
59
52
|
const message = {
|
|
60
53
|
message: `${round(value * 100)}% Zoom`,
|
|
@@ -64,17 +57,14 @@ export const ZoomControls = _ref => {
|
|
|
64
57
|
debouncedAlert(message);
|
|
65
58
|
onChange(value);
|
|
66
59
|
};
|
|
67
|
-
|
|
68
60
|
const zoomOutCallback = () => {
|
|
69
61
|
const newScaleRatio = calculateScaleRatio(scaleRatio - BUTTON_SCALE_STEP);
|
|
70
62
|
onZoomChange(newScaleRatio);
|
|
71
63
|
};
|
|
72
|
-
|
|
73
64
|
const zoomInCallback = () => {
|
|
74
65
|
const newScaleRatio = calculateScaleRatio(scaleRatio + BUTTON_SCALE_STEP);
|
|
75
66
|
onZoomChange(newScaleRatio);
|
|
76
67
|
};
|
|
77
|
-
|
|
78
68
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
79
69
|
title: formatMessage('Zoom'),
|
|
80
70
|
role: "toolbar",
|
|
@@ -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 { Flex } from '@instructure/ui-flex';
|
|
20
21
|
import { actions } from '../reducers/imageCropper';
|
|
@@ -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'
|