@instructure/canvas-rce 5.14.1 → 5.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -15,33 +15,29 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import ReactDOM from 'react-dom';
|
|
20
21
|
import Bridge from '../../../bridge';
|
|
21
22
|
import { StoreProvider } from '../shared/StoreContext';
|
|
22
23
|
import formatMessage from '../../../format-message';
|
|
23
24
|
import { headerFor, originFromHost } from '../../../rcs/api';
|
|
24
|
-
import {
|
|
25
|
+
import { instuiPopupMountNodeFn } from '../../../util/fullscreenHelpers';
|
|
25
26
|
import RCEGlobals from '../../RCEGlobals';
|
|
26
27
|
export const handleUpload = (error, uploadData, onUploadComplete, uploadBookmark) => {
|
|
27
28
|
let err_msg = error && Bridge.uploadMediaTranslations.UploadMediaStrings.UPLOADING_ERROR;
|
|
28
|
-
|
|
29
|
-
if ((error === null || error === void 0 ? void 0 : error.name) === 'FileSizeError') {
|
|
29
|
+
if (error?.name === 'FileSizeError') {
|
|
30
30
|
err_msg = formatMessage('Size of caption file is greater than the maximum {max} kb allowed file size.', {
|
|
31
31
|
max: error.maxBytes / 1000
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
const editorComponent = Bridge.activeEditor();
|
|
36
35
|
let newBookmark;
|
|
37
|
-
|
|
38
36
|
if (uploadBookmark) {
|
|
39
37
|
newBookmark = editorComponent.editor.selection.getBookmark(2, true);
|
|
40
38
|
editorComponent.editor.selection.moveToBookmark(uploadBookmark);
|
|
41
39
|
}
|
|
42
|
-
|
|
43
40
|
onUploadComplete(err_msg, uploadData);
|
|
44
|
-
|
|
45
41
|
if (newBookmark) {
|
|
46
42
|
editorComponent.editor.selection.moveToBookmark(newBookmark);
|
|
47
43
|
}
|
|
@@ -50,61 +46,53 @@ export default function (ed, document) {
|
|
|
50
46
|
return import('@instructure/canvas-media').then(CanvasMedia => {
|
|
51
47
|
const UploadMedia = CanvasMedia.default;
|
|
52
48
|
let container = document.querySelector('.canvas-rce-media-upload');
|
|
53
|
-
|
|
54
49
|
if (!container) {
|
|
55
50
|
container = document.createElement('div');
|
|
56
51
|
container.className = 'canvas-rce-media-upload';
|
|
57
52
|
document.body.appendChild(container);
|
|
58
53
|
}
|
|
59
|
-
|
|
60
54
|
const handleDismiss = () => {
|
|
61
55
|
ReactDOM.unmountComponentAtNode(container);
|
|
62
56
|
ed.focus(false);
|
|
63
|
-
};
|
|
64
|
-
// while the upload happens.
|
|
57
|
+
};
|
|
65
58
|
|
|
59
|
+
// We need to have a place to store the bookmark location
|
|
60
|
+
// while the upload happens.
|
|
61
|
+
let uploadBookmark = null;
|
|
66
62
|
|
|
67
|
-
|
|
63
|
+
// redux's activateMediaUpload action does the image placeholder,
|
|
68
64
|
// but it also does the upload. We need to separate them if we
|
|
69
65
|
// want to stay within the redux approach
|
|
70
|
-
|
|
71
66
|
const handleStartUpload = fileProps => {
|
|
72
|
-
var _editorComponent$edit;
|
|
73
|
-
|
|
74
67
|
Bridge.focusEditor(ed.rceWrapper);
|
|
75
68
|
const editorComponent = Bridge.activeEditor();
|
|
76
|
-
uploadBookmark = editorComponent
|
|
69
|
+
uploadBookmark = editorComponent?.editor?.selection.getBookmark(2, true);
|
|
77
70
|
Bridge.insertImagePlaceholder(fileProps);
|
|
78
71
|
handleDismiss();
|
|
79
72
|
};
|
|
80
|
-
|
|
81
73
|
const trayProps = Bridge.trayProps.get(ed);
|
|
82
|
-
ReactDOM.render(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
media_links_use_attachment_id: RCEGlobals.getFeatures().media_links_use_attachment_id,
|
|
106
|
-
useStudioPlayer: (_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) === null || _RCEGlobals$getFeatur === void 0 ? void 0 : _RCEGlobals$getFeatur.consolidated_media_player
|
|
107
|
-
});
|
|
108
|
-
}), container);
|
|
74
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(StoreProvider, trayProps, contentProps => /*#__PURE__*/React.createElement(UploadMedia, {
|
|
75
|
+
"data-mce-component": true,
|
|
76
|
+
rcsConfig: {
|
|
77
|
+
contextType: ed.settings.canvas_rce_user_context.type,
|
|
78
|
+
contextId: ed.settings.canvas_rce_user_context.id,
|
|
79
|
+
origin: originFromHost(contentProps.host),
|
|
80
|
+
headers: headerFor(contentProps.jwt)
|
|
81
|
+
},
|
|
82
|
+
userLocale: Bridge.userLocale,
|
|
83
|
+
mountNode: instuiPopupMountNodeFn,
|
|
84
|
+
open: true,
|
|
85
|
+
liveRegion: () => document.getElementById('flash_screenreader_holder'),
|
|
86
|
+
onStartUpload: fileProps => handleStartUpload(fileProps),
|
|
87
|
+
onUploadComplete: (err, data) => handleUpload(err, data, contentProps.mediaUploadComplete, uploadBookmark),
|
|
88
|
+
onDismiss: handleDismiss,
|
|
89
|
+
tabs: {
|
|
90
|
+
record: true,
|
|
91
|
+
upload: true
|
|
92
|
+
},
|
|
93
|
+
uploadMediaTranslations: Bridge.uploadMediaTranslations,
|
|
94
|
+
media_links_use_attachment_id: RCEGlobals.getFeatures().media_links_use_attachment_id,
|
|
95
|
+
useStudioPlayer: RCEGlobals.getFeatures()?.consolidated_media_player
|
|
96
|
+
})), container);
|
|
109
97
|
});
|
|
110
98
|
}
|
|
@@ -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
|
// IMPORTANT!
|
|
19
20
|
// Do not import this file directly, but get it via Bridge.uploadMediaTranslations
|
|
20
21
|
// This is because the locale, which is lazy imported, has to be loaded and
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
* Copyright (C) 2018 - present Instructure, Inc.
|
|
5
3
|
*
|
|
@@ -17,6 +15,7 @@
|
|
|
17
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
17
|
*/
|
|
18
|
+
|
|
20
19
|
import clickCallback from './clickCallback';
|
|
21
20
|
import bridge from '../../../bridge';
|
|
22
21
|
import formatMessage from '../../../format-message';
|
|
@@ -31,10 +30,10 @@ const COURSE_PLUGIN_KEY = 'course_media';
|
|
|
31
30
|
const USER_PLUGIN_KEY = 'user_media';
|
|
32
31
|
const GROUP_PLUGIN_KEY = 'group_media';
|
|
33
32
|
|
|
33
|
+
// @ts-expect-error
|
|
34
34
|
function getMenuItems(ed) {
|
|
35
35
|
const contextType = ed.settings.canvas_rce_user_context.type;
|
|
36
36
|
const items = [];
|
|
37
|
-
|
|
38
37
|
if (ed.getParam('show_media_upload')) {
|
|
39
38
|
// test if it's ok
|
|
40
39
|
items.push({
|
|
@@ -42,7 +41,6 @@ function getMenuItems(ed) {
|
|
|
42
41
|
value: 'instructure_upload_media'
|
|
43
42
|
});
|
|
44
43
|
}
|
|
45
|
-
|
|
46
44
|
if (contextType === 'course') {
|
|
47
45
|
items.push({
|
|
48
46
|
text: formatMessage('Course Media'),
|
|
@@ -54,7 +52,6 @@ function getMenuItems(ed) {
|
|
|
54
52
|
value: 'instructure_group_media'
|
|
55
53
|
});
|
|
56
54
|
}
|
|
57
|
-
|
|
58
55
|
items.push({
|
|
59
56
|
text: formatMessage('User Media'),
|
|
60
57
|
value: 'instructure_user_media'
|
|
@@ -62,36 +59,35 @@ function getMenuItems(ed) {
|
|
|
62
59
|
return items;
|
|
63
60
|
}
|
|
64
61
|
|
|
62
|
+
// @ts-expect-error
|
|
65
63
|
function doMenuItem(ed, value) {
|
|
66
64
|
switch (value) {
|
|
67
65
|
case 'instructure_upload_media':
|
|
68
66
|
ed.execCommand('instructureRecord');
|
|
69
67
|
break;
|
|
70
|
-
|
|
71
68
|
case 'instructure_course_media':
|
|
72
69
|
ed.focus(true);
|
|
73
70
|
ed.execCommand('instructureTrayForMedia', false, COURSE_PLUGIN_KEY);
|
|
74
71
|
break;
|
|
75
|
-
|
|
76
72
|
case 'instructure_group_media':
|
|
77
73
|
ed.focus(true);
|
|
78
74
|
ed.execCommand('instructureTrayForMedia', false, GROUP_PLUGIN_KEY);
|
|
79
75
|
break;
|
|
80
|
-
|
|
81
76
|
case 'instructure_user_media':
|
|
82
77
|
ed.focus(true);
|
|
83
78
|
ed.execCommand('instructureTrayForMedia', false, USER_PLUGIN_KEY);
|
|
84
79
|
break;
|
|
85
80
|
}
|
|
86
|
-
}
|
|
87
|
-
|
|
81
|
+
}
|
|
88
82
|
|
|
83
|
+
// Register plugin
|
|
89
84
|
tinymce.PluginManager.add('instructure_record', function (ed) {
|
|
90
85
|
ed.addCommand('instructureRecord', () => clickCallback(ed, document));
|
|
91
86
|
ed.addCommand('instructureTrayForMedia', (ui, plugin_key) => {
|
|
92
87
|
bridge.showTrayForPlugin(plugin_key, ed.id);
|
|
93
|
-
});
|
|
88
|
+
});
|
|
94
89
|
|
|
90
|
+
// Register menu items
|
|
95
91
|
ed.ui.registry.addNestedMenuItem('instructure_media', {
|
|
96
92
|
text: formatMessage('Media'),
|
|
97
93
|
icon: 'video',
|
|
@@ -106,8 +102,9 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
|
|
|
106
102
|
}
|
|
107
103
|
};
|
|
108
104
|
})
|
|
109
|
-
});
|
|
105
|
+
});
|
|
110
106
|
|
|
107
|
+
// Register buttons
|
|
111
108
|
ed.ui.registry.addMenuButton('instructure_record', {
|
|
112
109
|
tooltip: formatMessage('Record/Upload Media'),
|
|
113
110
|
icon: 'video',
|
|
@@ -117,32 +114,29 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
|
|
|
117
114
|
value: item.value,
|
|
118
115
|
onAction: () => doMenuItem(ed, item.value)
|
|
119
116
|
}))),
|
|
120
|
-
|
|
121
117
|
onSetup(api) {
|
|
118
|
+
// @ts-expect-error
|
|
122
119
|
function handleNodeChange(_e) {
|
|
123
120
|
api.setDisabled(!isOKToLink(ed.selection.getContent()));
|
|
124
121
|
}
|
|
125
|
-
|
|
126
122
|
setTimeout(handleNodeChange);
|
|
127
123
|
ed.on('NodeChange', handleNodeChange);
|
|
128
124
|
return () => {
|
|
129
125
|
ed.off('NodeChange', handleNodeChange);
|
|
130
126
|
};
|
|
131
127
|
}
|
|
132
|
-
|
|
133
128
|
});
|
|
129
|
+
|
|
134
130
|
/*
|
|
135
131
|
* Register the Video "Options" button that will open the Video Options
|
|
136
132
|
* tray.
|
|
137
133
|
*/
|
|
138
|
-
|
|
139
134
|
const buttonAriaLabel = formatMessage('Show video options');
|
|
140
135
|
ed.ui.registry.addButton('instructure-video-options', {
|
|
141
136
|
onAction() {
|
|
142
137
|
// show the tray
|
|
143
138
|
videoTrayController.showTrayForEditor(ed);
|
|
144
139
|
},
|
|
145
|
-
|
|
146
140
|
text: formatMessage('Video Options'),
|
|
147
141
|
tooltip: buttonAriaLabel
|
|
148
142
|
});
|
|
@@ -156,7 +150,6 @@ tinymce.PluginManager.add('instructure_record', function (ed) {
|
|
|
156
150
|
onAction() {
|
|
157
151
|
audioTrayController.showTrayForEditor(ed);
|
|
158
152
|
},
|
|
159
|
-
|
|
160
153
|
text: formatMessage('Audio Options'),
|
|
161
154
|
tooltip: formatMessage('Show audio options')
|
|
162
155
|
});
|
|
@@ -15,33 +15,29 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import ReactDOM from 'react-dom';
|
|
20
21
|
import FindReplaceController from './components/FindReplaceTrayController';
|
|
21
22
|
import { getSelectionContext } from './getSelectionContext';
|
|
22
23
|
const CONTAINER_ID = 'instructure-find-replace-tray-container';
|
|
23
24
|
export default function (editor, document) {
|
|
24
|
-
var _editor$selection, _editor$selection2;
|
|
25
|
-
|
|
26
25
|
const plugin = editor.plugins.searchreplace;
|
|
27
|
-
const initalSelection =
|
|
26
|
+
const initalSelection = editor.selection?.getContent({
|
|
28
27
|
format: 'text'
|
|
29
28
|
});
|
|
30
|
-
if (initalSelection)
|
|
29
|
+
if (initalSelection) editor.selection?.collapse(true);
|
|
31
30
|
let container = document.getElementById(CONTAINER_ID);
|
|
32
|
-
|
|
33
31
|
if (container == null) {
|
|
34
32
|
container = document.createElement('div');
|
|
35
33
|
container.id = CONTAINER_ID;
|
|
36
34
|
document.body.appendChild(container);
|
|
37
35
|
}
|
|
38
|
-
|
|
39
36
|
const handleDismiss = () => {
|
|
40
37
|
if (container) ReactDOM.unmountComponentAtNode(container);
|
|
41
38
|
editor.focus(false);
|
|
42
39
|
};
|
|
43
|
-
|
|
44
|
-
ReactDOM.render( /*#__PURE__*/React.createElement(FindReplaceController, {
|
|
40
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(FindReplaceController, {
|
|
45
41
|
plugin: plugin,
|
|
46
42
|
onDismiss: handleDismiss,
|
|
47
43
|
initialText: initalSelection,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,31 +16,32 @@ 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, { useEffect, useRef, useState } from 'react';
|
|
21
21
|
import { Button, CloseButton } from '@instructure/ui-buttons';
|
|
22
22
|
import { Flex } from '@instructure/ui-flex';
|
|
23
23
|
import { Heading } from '@instructure/ui-heading';
|
|
24
|
+
import { IconWarningSolid } from '@instructure/ui-icons';
|
|
24
25
|
import { getTrayHeight } from '../../shared/trayUtils';
|
|
25
26
|
import { View } from '@instructure/ui-view';
|
|
26
|
-
import {
|
|
27
|
+
import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
|
|
27
28
|
import formatMessage from '../../../../format-message';
|
|
28
29
|
import { Tray } from '@instructure/ui-tray';
|
|
29
30
|
import { TextInput } from '@instructure/ui-text-input';
|
|
30
31
|
import { Text } from '@instructure/ui-text';
|
|
31
32
|
import { ScreenReaderContent } from '@instructure/ui-a11y-content';
|
|
32
33
|
import { Alert } from '@instructure/ui-alerts';
|
|
33
|
-
export default function FindReplaceTray(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
} = _ref;
|
|
34
|
+
export default function FindReplaceTray({
|
|
35
|
+
onNext,
|
|
36
|
+
onPrevious,
|
|
37
|
+
onFind,
|
|
38
|
+
onRequestClose,
|
|
39
|
+
onReplace,
|
|
40
|
+
index,
|
|
41
|
+
max,
|
|
42
|
+
initialText = '',
|
|
43
|
+
selectionContext = ['', '']
|
|
44
|
+
}) {
|
|
45
45
|
const [findText, setFindText] = useState(initialText);
|
|
46
46
|
const [replaceText, setReplaceText] = useState('');
|
|
47
47
|
const [hasOpened, setHasOpened] = useState(false);
|
|
@@ -50,23 +50,19 @@ export default function FindReplaceTray(_ref) {
|
|
|
50
50
|
const [alertReplaceText, setAlertReplaceText] = useState('');
|
|
51
51
|
const trayRef = useRef(null);
|
|
52
52
|
const liveRegionKey = useRef(0);
|
|
53
|
-
const srDupKey = useRef(0);
|
|
54
|
-
|
|
53
|
+
const srDupKey = useRef(0);
|
|
54
|
+
// moves RCE when tray opens/closes, copied from CanvasContentTray
|
|
55
55
|
useEffect(() => {
|
|
56
|
-
var _trayRef$current;
|
|
57
|
-
|
|
58
56
|
if (!hasOpened) return;
|
|
59
57
|
let c = document.querySelector('[role="main"]');
|
|
60
58
|
let target_w = 0;
|
|
61
59
|
if (!c) return;
|
|
62
60
|
const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
|
|
63
|
-
target_w = c.offsetWidth -
|
|
64
|
-
|
|
61
|
+
target_w = c.offsetWidth - trayRef.current?.offsetWidth + margin;
|
|
65
62
|
if (target_w >= 320 && target_w < c.offsetWidth) {
|
|
66
63
|
c.style.boxSizing = 'border-box';
|
|
67
64
|
c.style.width = `${target_w}px`;
|
|
68
65
|
}
|
|
69
|
-
|
|
70
66
|
return () => {
|
|
71
67
|
c = document.querySelector('[role="main"]');
|
|
72
68
|
if (!c) return;
|
|
@@ -76,10 +72,9 @@ export default function FindReplaceTray(_ref) {
|
|
|
76
72
|
useEffect(() => {
|
|
77
73
|
if (initialText) {
|
|
78
74
|
onFind(initialText);
|
|
79
|
-
}
|
|
80
|
-
|
|
75
|
+
}
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
81
77
|
}, []);
|
|
82
|
-
|
|
83
78
|
function usePrevious(value) {
|
|
84
79
|
const ref = useRef();
|
|
85
80
|
useEffect(() => {
|
|
@@ -87,7 +82,6 @@ export default function FindReplaceTray(_ref) {
|
|
|
87
82
|
}, [value]);
|
|
88
83
|
return ref.current;
|
|
89
84
|
}
|
|
90
|
-
|
|
91
85
|
const prepend = selectionContext[0];
|
|
92
86
|
const append = selectionContext[1];
|
|
93
87
|
const srContextMsg = formatMessage('{prepend}{findText}{append}', {
|
|
@@ -97,15 +91,12 @@ export default function FindReplaceTray(_ref) {
|
|
|
97
91
|
});
|
|
98
92
|
const previousSrMsg = usePrevious(srContextMsg);
|
|
99
93
|
const previousFindText = usePrevious(findText);
|
|
100
|
-
|
|
101
94
|
const handleTextChange = e => {
|
|
102
95
|
setFindText(e.target.value);
|
|
103
96
|
onFind(e.target.value);
|
|
104
97
|
};
|
|
105
|
-
|
|
106
98
|
const handleFindKeyDown = e => {
|
|
107
99
|
if (e.key !== 'Enter') return;
|
|
108
|
-
|
|
109
100
|
if (e.shiftKey) {
|
|
110
101
|
if (isButtonDisabled('previous')) return;
|
|
111
102
|
onPrevious();
|
|
@@ -115,33 +106,27 @@ export default function FindReplaceTray(_ref) {
|
|
|
115
106
|
onFind(findText);
|
|
116
107
|
return;
|
|
117
108
|
}
|
|
118
|
-
|
|
119
109
|
if (isButtonDisabled('next')) return;
|
|
120
110
|
onNext();
|
|
121
111
|
}
|
|
122
112
|
};
|
|
123
|
-
|
|
124
113
|
const handleReplaceKeyDown = e => {
|
|
125
114
|
if (e.key !== 'Enter') return;
|
|
126
115
|
if (isButtonDisabled('replace')) return;
|
|
127
116
|
const forward = !e.shiftKey;
|
|
128
117
|
replace(replaceText, forward, false);
|
|
129
118
|
};
|
|
130
|
-
|
|
131
119
|
const replace = (newText, forward, all) => {
|
|
132
120
|
onReplace(newText, forward, all);
|
|
133
|
-
|
|
134
121
|
if (all) {
|
|
135
122
|
setShowReplaceAlert('replaceAll');
|
|
136
123
|
} else {
|
|
137
124
|
setShowReplaceAlert('replace');
|
|
138
125
|
}
|
|
139
|
-
|
|
140
126
|
setAlertFindText(findText);
|
|
141
127
|
setAlertReplaceText(newText);
|
|
142
128
|
liveRegionKey.current++;
|
|
143
129
|
};
|
|
144
|
-
|
|
145
130
|
const alertText = showReplaceAlert === '' ? '' : showReplaceAlert === 'replace' ? formatMessage('Replaced {alertFindText} with {alertReplaceText}', {
|
|
146
131
|
alertFindText,
|
|
147
132
|
alertReplaceText
|
|
@@ -149,13 +134,11 @@ export default function FindReplaceTray(_ref) {
|
|
|
149
134
|
alertFindText,
|
|
150
135
|
alertReplaceText
|
|
151
136
|
});
|
|
152
|
-
|
|
153
137
|
const renderReplaceAlert = () => {
|
|
154
138
|
if (!showReplaceAlert) {
|
|
155
139
|
liveRegionKey.current = 0;
|
|
156
140
|
return /*#__PURE__*/React.createElement(React.Fragment, null);
|
|
157
141
|
}
|
|
158
|
-
|
|
159
142
|
return /*#__PURE__*/React.createElement(Alert, {
|
|
160
143
|
variant: "success",
|
|
161
144
|
renderCloseButtonLabel: "Close Alert",
|
|
@@ -165,26 +148,31 @@ export default function FindReplaceTray(_ref) {
|
|
|
165
148
|
timeout: 3000
|
|
166
149
|
}, alertText);
|
|
167
150
|
};
|
|
168
|
-
|
|
169
151
|
const renderScreenReaderAlert = () => {
|
|
170
152
|
return /*#__PURE__*/React.createElement(ScreenReaderContent, null, alertText);
|
|
171
153
|
};
|
|
172
|
-
|
|
173
|
-
|
|
154
|
+
const errMsg = /*#__PURE__*/React.createElement(Flex, {
|
|
155
|
+
gap: "xx-small",
|
|
156
|
+
alignItems: "center"
|
|
157
|
+
}, /*#__PURE__*/React.createElement(IconWarningSolid, {
|
|
158
|
+
color: "error",
|
|
159
|
+
"data-testid": "error-icon"
|
|
160
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
161
|
+
color: "danger",
|
|
162
|
+
size: "small"
|
|
163
|
+
}, formatMessage('No results found')));
|
|
174
164
|
const messages = findText && max === 0 ? [{
|
|
175
165
|
text: errMsg,
|
|
176
166
|
type: 'error'
|
|
177
167
|
}] : [];
|
|
178
|
-
|
|
179
168
|
const resultText = () => {
|
|
180
|
-
const srErrMsg = messages.length === 0 ? '' : errMsg;
|
|
181
|
-
|
|
169
|
+
const srErrMsg = messages.length === 0 ? '' : errMsg;
|
|
170
|
+
// resolves issue where focus is lost when this (dis)appears
|
|
182
171
|
if (max === 0) {
|
|
183
172
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ScreenReaderContent, {
|
|
184
173
|
"aria-live": "polite"
|
|
185
174
|
}, srErrMsg), /*#__PURE__*/React.createElement(Text, null));
|
|
186
175
|
}
|
|
187
|
-
|
|
188
176
|
const msg = formatMessage('{index} of {max}', {
|
|
189
177
|
index,
|
|
190
178
|
max
|
|
@@ -192,12 +180,12 @@ export default function FindReplaceTray(_ref) {
|
|
|
192
180
|
const srResultMsg = formatMessage('Result {index} of {max}.', {
|
|
193
181
|
index,
|
|
194
182
|
max
|
|
195
|
-
});
|
|
183
|
+
});
|
|
196
184
|
|
|
185
|
+
// necessary to force screen reader to read the same message while typing
|
|
197
186
|
if (srContextMsg === previousSrMsg && previousFindText != findText) {
|
|
198
187
|
srDupKey.current++;
|
|
199
188
|
} else srDupKey.current = 0;
|
|
200
|
-
|
|
201
189
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(View, {
|
|
202
190
|
as: "span",
|
|
203
191
|
key: srDupKey.current,
|
|
@@ -208,28 +196,23 @@ export default function FindReplaceTray(_ref) {
|
|
|
208
196
|
"aria-hidden": "true"
|
|
209
197
|
}, msg));
|
|
210
198
|
};
|
|
211
|
-
|
|
212
199
|
const isButtonDisabled = button => {
|
|
213
200
|
switch (button) {
|
|
214
201
|
case 'next':
|
|
215
202
|
case 'previous':
|
|
216
203
|
return max < 2;
|
|
217
|
-
|
|
218
204
|
case 'replace':
|
|
219
205
|
return !replaceText || index === 0;
|
|
220
|
-
|
|
221
206
|
case 'replaceAll':
|
|
222
207
|
return !replaceText || max < 2 || index === 0;
|
|
223
|
-
|
|
224
208
|
default:
|
|
225
209
|
return false;
|
|
226
210
|
}
|
|
227
211
|
};
|
|
228
|
-
|
|
229
212
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
230
213
|
"data-mce-component": true,
|
|
231
214
|
label: formatMessage('Find and Replace'),
|
|
232
|
-
mountNode:
|
|
215
|
+
mountNode: instuiPopupMountNodeFn(),
|
|
233
216
|
onDismiss: onRequestClose,
|
|
234
217
|
open: true,
|
|
235
218
|
placement: "end",
|
package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
|
|
3
2
|
/*
|
|
4
3
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
4
|
*
|
|
@@ -17,29 +16,26 @@ 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, { useState } from 'react';
|
|
21
21
|
import FindReplaceTray from './FindReplaceTray';
|
|
22
|
-
export default function FindReplaceTrayController(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
} = _ref;
|
|
22
|
+
export default function FindReplaceTrayController({
|
|
23
|
+
plugin,
|
|
24
|
+
onDismiss,
|
|
25
|
+
initialText = '',
|
|
26
|
+
undoManager,
|
|
27
|
+
getSelectionContext
|
|
28
|
+
}) {
|
|
30
29
|
// this component really just exists to make the index easier to track
|
|
31
30
|
const [findIndex, setFindIndex] = useState(0);
|
|
32
31
|
const [findCount, setFindCount] = useState(0);
|
|
33
32
|
const [selectionContext, setSelectionContext] = useState(['', '']);
|
|
34
|
-
|
|
35
33
|
const updateSelectionContext = () => {
|
|
36
34
|
const srText = getSelectionContext();
|
|
37
35
|
setSelectionContext(srText);
|
|
38
36
|
};
|
|
39
|
-
|
|
40
37
|
const newFindIndex = direction => {
|
|
41
38
|
let newIndex = 0;
|
|
42
|
-
|
|
43
39
|
if (findCount === 0) {
|
|
44
40
|
newIndex = 0;
|
|
45
41
|
} else if (direction === 1) {
|
|
@@ -53,34 +49,28 @@ export default function FindReplaceTrayController(_ref) {
|
|
|
53
49
|
newIndex = findCount;
|
|
54
50
|
} else newIndex = findIndex - 1;
|
|
55
51
|
}
|
|
56
|
-
|
|
57
52
|
return newIndex;
|
|
58
53
|
};
|
|
59
|
-
|
|
60
54
|
const done = () => {
|
|
61
55
|
plugin.done(false);
|
|
62
56
|
setFindCount(0);
|
|
63
57
|
setFindIndex(0);
|
|
64
58
|
setSelectionContext([]);
|
|
65
59
|
};
|
|
66
|
-
|
|
67
60
|
const handleDismiss = () => {
|
|
68
61
|
done();
|
|
69
62
|
onDismiss();
|
|
70
63
|
};
|
|
71
|
-
|
|
72
64
|
const handleNext = () => {
|
|
73
65
|
plugin.next();
|
|
74
66
|
setFindIndex(newFindIndex(1));
|
|
75
67
|
updateSelectionContext();
|
|
76
68
|
};
|
|
77
|
-
|
|
78
69
|
const handlePrevious = () => {
|
|
79
70
|
plugin.prev();
|
|
80
71
|
setFindIndex(newFindIndex(-1));
|
|
81
72
|
updateSelectionContext();
|
|
82
73
|
};
|
|
83
|
-
|
|
84
74
|
const handleFind = text => {
|
|
85
75
|
if (!text) {
|
|
86
76
|
done();
|
|
@@ -92,34 +82,26 @@ export default function FindReplaceTrayController(_ref) {
|
|
|
92
82
|
updateSelectionContext();
|
|
93
83
|
}
|
|
94
84
|
};
|
|
95
|
-
|
|
96
|
-
const handleReplace = function (text) {
|
|
97
|
-
let forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
98
|
-
let all = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
85
|
+
const handleReplace = (text, forward = true, all = false) => {
|
|
99
86
|
if (!text) return;
|
|
100
|
-
undoManager
|
|
87
|
+
undoManager?.add();
|
|
101
88
|
plugin.replace(text, forward, all);
|
|
102
|
-
|
|
103
89
|
if (findCount === 1 || all) {
|
|
104
90
|
done();
|
|
105
91
|
return;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
92
|
+
}
|
|
93
|
+
// we can't just find again, because that will reset index to 1
|
|
109
94
|
let newIndex;
|
|
110
95
|
const newFindCount = findCount - 1;
|
|
111
|
-
|
|
112
96
|
if (forward) {
|
|
113
97
|
newIndex = findIndex === findCount ? 1 : findIndex;
|
|
114
98
|
} else {
|
|
115
99
|
newIndex = findIndex === 1 ? newFindCount : findIndex - 1;
|
|
116
100
|
}
|
|
117
|
-
|
|
118
101
|
setFindCount(newFindCount);
|
|
119
102
|
setFindIndex(newIndex);
|
|
120
103
|
updateSelectionContext();
|
|
121
104
|
};
|
|
122
|
-
|
|
123
105
|
return /*#__PURE__*/React.createElement(FindReplaceTray, {
|
|
124
106
|
onRequestClose: handleDismiss,
|
|
125
107
|
onNext: handleNext,
|