@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
|
@@ -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, { useCallback, useEffect, useRef, useState } from 'react';
|
|
19
20
|
import { bool, element, func, instanceOf, oneOfType, shape, string } from 'prop-types';
|
|
20
21
|
import { Tray } from '@instructure/ui-tray';
|
|
@@ -33,6 +34,7 @@ import { getLinkContentFromEditor } from './ContentSelection';
|
|
|
33
34
|
import { LinkDisplay } from './LinkDisplay';
|
|
34
35
|
import { showFlashAlert } from '../../../common/FlashAlert';
|
|
35
36
|
import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasContentUtils';
|
|
37
|
+
|
|
36
38
|
/**
|
|
37
39
|
* Returns the translated tray label
|
|
38
40
|
* @param {string} contentType - The type of content showing on tray
|
|
@@ -40,51 +42,44 @@ import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasCont
|
|
|
40
42
|
* @param {string} contextType - The user's context
|
|
41
43
|
* @returns {string}
|
|
42
44
|
*/
|
|
43
|
-
|
|
44
45
|
function getTrayLabel(contentType, contentSubtype, contextType) {
|
|
45
46
|
if (contentType === 'links' && contextType === 'course') {
|
|
46
47
|
return formatMessage('Course Links');
|
|
47
48
|
} else if (contentType === 'links' && contextType === 'group') {
|
|
48
49
|
return formatMessage('Group Links');
|
|
49
50
|
}
|
|
50
|
-
|
|
51
51
|
switch (contentSubtype) {
|
|
52
52
|
case ICON_MAKER_ICONS:
|
|
53
53
|
return formatMessage('Icon Maker Icons');
|
|
54
|
-
|
|
55
54
|
case 'images':
|
|
56
55
|
if (contentType === 'course_files') return formatMessage('Course Images');
|
|
57
56
|
if (contentType === 'group_files') return formatMessage('Group Images');
|
|
58
57
|
return formatMessage('User Images');
|
|
59
|
-
|
|
60
58
|
case 'media':
|
|
61
59
|
if (contentType === 'course_files') return formatMessage('Course Media');
|
|
62
60
|
if (contentType === 'group_files') return formatMessage('Group Media');
|
|
63
61
|
return formatMessage('User Media');
|
|
64
|
-
|
|
65
62
|
case 'documents':
|
|
66
63
|
if (contentType === 'course_files') return formatMessage('Course Documents');
|
|
67
64
|
if (contentType === 'group_files') return formatMessage('Group Documents');
|
|
68
65
|
return formatMessage('User Documents');
|
|
69
|
-
|
|
70
66
|
default:
|
|
71
67
|
return formatMessage('Tray');
|
|
72
68
|
// Shouldn't ever get here
|
|
73
69
|
}
|
|
74
70
|
}
|
|
71
|
+
|
|
75
72
|
/**
|
|
76
73
|
* This component is used within various plugins to handle loading in content
|
|
77
74
|
* from Canvas. It is essentially the main component.
|
|
78
75
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
76
|
export default function CanvasContentTray(props) {
|
|
82
77
|
// should the tray be rendered open?
|
|
83
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
78
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
79
|
+
// has the tray fully opened. we use this to defer rendering the content
|
|
84
80
|
// until the tray is open.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
81
|
+
const [hasOpened, setHasOpened] = useState(false);
|
|
82
|
+
// should we close the tray after the user clicks on something in it?
|
|
88
83
|
const [hidingTrayOnAction, setHidingTrayOnAction] = useState(true);
|
|
89
84
|
const trayRef = useRef(null);
|
|
90
85
|
const scrollingAreaRef = useRef(null);
|
|
@@ -100,20 +95,20 @@ export default function CanvasContentTray(props) {
|
|
|
100
95
|
mountNode,
|
|
101
96
|
onTrayClosing,
|
|
102
97
|
storeProps
|
|
103
|
-
} = {
|
|
98
|
+
} = {
|
|
99
|
+
...props
|
|
104
100
|
};
|
|
105
101
|
const handleDismissTray = useCallback(() => {
|
|
106
102
|
// return focus to the RCE if focus was on this tray
|
|
107
103
|
if (trayRef.current && trayRef.current.contains(document.activeElement)) {
|
|
108
104
|
bridge.focusActiveEditor(false);
|
|
109
105
|
}
|
|
110
|
-
|
|
111
106
|
onTrayClosing && onTrayClosing(CanvasContentTray.globalOpenCount); // tell RCEWrapper we're closing if we're open
|
|
112
|
-
|
|
113
107
|
setIsOpen(false);
|
|
114
|
-
}, [bridge, onTrayClosing]);
|
|
115
|
-
// like it should.
|
|
108
|
+
}, [bridge, onTrayClosing]);
|
|
116
109
|
|
|
110
|
+
// this shouldn't be necessary, but INSTUI isn't focusing the close button
|
|
111
|
+
// like it should.
|
|
117
112
|
useEffect(() => {
|
|
118
113
|
if (isOpen && closeButtonRef) {
|
|
119
114
|
closeButtonRef.focus();
|
|
@@ -128,7 +123,6 @@ export default function CanvasContentTray(props) {
|
|
|
128
123
|
++CanvasContentTray.globalOpenCount;
|
|
129
124
|
setFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
|
|
130
125
|
setIsOpen(true);
|
|
131
|
-
|
|
132
126
|
if (plugin === 'course_link_edit') {
|
|
133
127
|
setIsEditTray(true);
|
|
134
128
|
const {
|
|
@@ -150,18 +144,17 @@ export default function CanvasContentTray(props) {
|
|
|
150
144
|
setIsEditTray(false);
|
|
151
145
|
}
|
|
152
146
|
},
|
|
153
|
-
|
|
154
147
|
hideTray(forceClose) {
|
|
155
148
|
if (forceClose || hidingTrayOnAction) {
|
|
156
149
|
handleDismissTray();
|
|
157
150
|
}
|
|
158
151
|
}
|
|
159
|
-
|
|
160
152
|
};
|
|
161
153
|
bridge.attachController(controller, editor.id);
|
|
162
154
|
return () => {
|
|
163
155
|
bridge.detachController(editor.id);
|
|
164
|
-
};
|
|
156
|
+
};
|
|
157
|
+
// it's OK the setFilterSettings is not a dependency
|
|
165
158
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
166
159
|
}, [editor.id, bridge, handleDismissTray, hidingTrayOnAction]);
|
|
167
160
|
useEffect(() => {
|
|
@@ -171,19 +164,16 @@ export default function CanvasContentTray(props) {
|
|
|
171
164
|
}, [hasOpened]);
|
|
172
165
|
useEffect(() => {
|
|
173
166
|
var _trayRef$current;
|
|
174
|
-
|
|
175
167
|
if (!hasOpened) return;
|
|
176
168
|
let c = document.querySelector('[role="main"]');
|
|
177
169
|
let target_w = 0;
|
|
178
170
|
if (!c) return;
|
|
179
171
|
const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
|
|
180
172
|
target_w = c.offsetWidth - ((_trayRef$current = trayRef.current) === null || _trayRef$current === void 0 ? void 0 : _trayRef$current.offsetWidth) + margin;
|
|
181
|
-
|
|
182
173
|
if (target_w >= 320 && target_w < c.offsetWidth) {
|
|
183
174
|
c.style.boxSizing = 'border-box';
|
|
184
175
|
c.style.width = `${target_w}px`;
|
|
185
176
|
}
|
|
186
|
-
|
|
187
177
|
setHidingTrayOnAction(target_w < 320);
|
|
188
178
|
return () => {
|
|
189
179
|
c = document.querySelector('[role="main"]');
|
|
@@ -191,16 +181,13 @@ export default function CanvasContentTray(props) {
|
|
|
191
181
|
c.style.width = '';
|
|
192
182
|
};
|
|
193
183
|
}, [hasOpened]);
|
|
194
|
-
|
|
195
184
|
function handleOpenTray() {
|
|
196
185
|
bridge.focusEditor(editor);
|
|
197
186
|
setHasOpened(true);
|
|
198
187
|
}
|
|
199
|
-
|
|
200
188
|
function handleExitTray() {
|
|
201
189
|
onTrayClosing && onTrayClosing(true); // tell RCEWrapper we're closing
|
|
202
190
|
}
|
|
203
|
-
|
|
204
191
|
function handleCloseTray() {
|
|
205
192
|
// clear the store's saved search string so the tray doesn't
|
|
206
193
|
// reopen with a previous tray instance's search results
|
|
@@ -208,10 +195,10 @@ export default function CanvasContentTray(props) {
|
|
|
208
195
|
setHasOpened(false);
|
|
209
196
|
onTrayClosing && onTrayClosing(false); // tell RCEWrapper we're closed
|
|
210
197
|
}
|
|
211
|
-
|
|
212
198
|
function handleReplaceButton() {
|
|
213
199
|
handleDismissTray();
|
|
214
|
-
const newLink = {
|
|
200
|
+
const newLink = {
|
|
201
|
+
...link,
|
|
215
202
|
forceRename: true,
|
|
216
203
|
text: linkText
|
|
217
204
|
};
|
|
@@ -222,7 +209,6 @@ export default function CanvasContentTray(props) {
|
|
|
222
209
|
srOnly: true
|
|
223
210
|
});
|
|
224
211
|
}
|
|
225
|
-
|
|
226
212
|
function renderFooter() {
|
|
227
213
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
228
214
|
background: "secondary",
|
|
@@ -239,11 +225,10 @@ export default function CanvasContentTray(props) {
|
|
|
239
225
|
"data-testid": "replace-link-button"
|
|
240
226
|
}, formatMessage('Replace')));
|
|
241
227
|
}
|
|
242
|
-
|
|
243
228
|
function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
|
|
244
|
-
const newFilterSettings = {
|
|
229
|
+
const newFilterSettings = {
|
|
230
|
+
...newFilter
|
|
245
231
|
};
|
|
246
|
-
|
|
247
232
|
if (newFilterSettings.sortValue) {
|
|
248
233
|
newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
|
|
249
234
|
onChangeSortBy({
|
|
@@ -251,48 +236,38 @@ export default function CanvasContentTray(props) {
|
|
|
251
236
|
dir: newFilterSettings.sortDir
|
|
252
237
|
});
|
|
253
238
|
}
|
|
254
|
-
|
|
255
239
|
if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
|
|
256
240
|
onChangeSearchString(newFilterSettings.searchString);
|
|
257
241
|
}
|
|
258
|
-
|
|
259
242
|
setFilterSettings(newFilterSettings);
|
|
260
|
-
|
|
261
243
|
if (newFilterSettings.contentType) {
|
|
262
244
|
let contextType, contextId;
|
|
263
|
-
|
|
264
245
|
switch (newFilterSettings.contentType) {
|
|
265
246
|
case 'user_files':
|
|
266
247
|
contextType = 'user';
|
|
267
248
|
contextId = props.containingContext.userId;
|
|
268
249
|
break;
|
|
269
|
-
|
|
270
250
|
case 'group_files':
|
|
271
251
|
contextType = 'group';
|
|
272
252
|
contextId = props.containingContext.contextId;
|
|
273
253
|
break;
|
|
274
|
-
|
|
275
254
|
case 'course_files':
|
|
276
255
|
contextType = props.contextType;
|
|
277
256
|
contextId = props.containingContext.contextId;
|
|
278
257
|
break;
|
|
279
|
-
|
|
280
258
|
case 'links':
|
|
281
259
|
contextType = props.containingContext.contextType;
|
|
282
260
|
contextId = props.containingContext.contextId;
|
|
283
261
|
}
|
|
284
|
-
|
|
285
262
|
onChangeContext({
|
|
286
263
|
contextType,
|
|
287
264
|
contextId
|
|
288
265
|
});
|
|
289
266
|
}
|
|
290
267
|
}
|
|
291
|
-
|
|
292
268
|
function getHeader() {
|
|
293
269
|
return isEditTray ? formatMessage('Edit Course Link') : formatMessage('Add');
|
|
294
270
|
}
|
|
295
|
-
|
|
296
271
|
function renderLinkDisplay() {
|
|
297
272
|
return isEditTray && /*#__PURE__*/React.createElement(LinkDisplay, {
|
|
298
273
|
linkText: linkText,
|
|
@@ -303,7 +278,6 @@ export default function CanvasContentTray(props) {
|
|
|
303
278
|
linkType: link === null || link === void 0 ? void 0 : link.type
|
|
304
279
|
});
|
|
305
280
|
}
|
|
306
|
-
|
|
307
281
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
308
282
|
"data-mce-component": true,
|
|
309
283
|
"data-testid": "CanvasContentTray",
|
|
@@ -382,14 +356,13 @@ export default function CanvasContentTray(props) {
|
|
|
382
356
|
}, storeProps)))), isEditTray && renderFooter())) : null));
|
|
383
357
|
}
|
|
384
358
|
CanvasContentTray.globalOpenCount = 0;
|
|
385
|
-
|
|
386
359
|
function requiredWithoutSource(props, propName, componentName) {
|
|
387
360
|
if (props.source == null && props[propName] == null) {
|
|
388
361
|
throw new Error(`The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`${props[propName]}\`.`);
|
|
389
362
|
}
|
|
390
|
-
}
|
|
391
|
-
|
|
363
|
+
}
|
|
392
364
|
|
|
365
|
+
// Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
|
|
393
366
|
const trayPropsMap = {
|
|
394
367
|
canUploadFiles: bool.isRequired,
|
|
395
368
|
contextId: string.isRequired,
|
|
@@ -421,10 +394,10 @@ CanvasContentTray.propTypes = {
|
|
|
421
394
|
// called with true when the tray starts closing, false once closed
|
|
422
395
|
onEditClick: func,
|
|
423
396
|
...trayPropsMap
|
|
424
|
-
};
|
|
397
|
+
};
|
|
425
398
|
|
|
399
|
+
// the way we define trayProps, eslint doesn't recognize the following as props
|
|
426
400
|
/* eslint-disable react/default-props-match-prop-types */
|
|
427
|
-
|
|
428
401
|
CanvasContentTray.defaultProps = {
|
|
429
402
|
canUploadFiles: false,
|
|
430
403
|
filesTabDisabled: false,
|
|
@@ -15,11 +15,11 @@
|
|
|
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
|
const checkerboardStyle = squareSize => {
|
|
19
20
|
return {
|
|
20
21
|
backgroundImage: `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" fill-opacity=".15"><rect x="200" width="200" height="200"/><rect y="200" width="200" height="200"/></svg>')`,
|
|
21
22
|
backgroundSize: `${squareSize}px ${squareSize}px`
|
|
22
23
|
};
|
|
23
24
|
};
|
|
24
|
-
|
|
25
25
|
export default checkerboardStyle;
|
|
@@ -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, useState } from 'react';
|
|
19
20
|
import { View } from '@instructure/ui-view';
|
|
20
21
|
import { Flex } from '@instructure/ui-flex';
|
|
@@ -85,7 +86,6 @@ const NAMED_COLORS = [{
|
|
|
85
86
|
}, null];
|
|
86
87
|
export const ColorInput = _ref => {
|
|
87
88
|
var _NAMED_COLORS$find;
|
|
88
|
-
|
|
89
89
|
let {
|
|
90
90
|
color,
|
|
91
91
|
label,
|
|
@@ -101,27 +101,25 @@ export const ColorInput = _ref => {
|
|
|
101
101
|
const colorName = (_NAMED_COLORS$find = NAMED_COLORS.find(c => (c === null || c === void 0 ? void 0 : c.color) === color)) === null || _NAMED_COLORS$find === void 0 ? void 0 : _NAMED_COLORS$find.name;
|
|
102
102
|
useEffect(() => {
|
|
103
103
|
setInputValue(color);
|
|
104
|
-
}, [color]);
|
|
104
|
+
}, [color]);
|
|
105
105
|
|
|
106
|
+
// fire onChange in case value is valid
|
|
106
107
|
const handleColorChange = hex => {
|
|
107
108
|
if (isValidHex(hex)) {
|
|
108
109
|
onChange(hex);
|
|
109
110
|
}
|
|
110
|
-
|
|
111
111
|
if (!hex || !hex.length) {
|
|
112
112
|
onChange(null);
|
|
113
113
|
}
|
|
114
|
-
|
|
115
114
|
setInputValue(hex);
|
|
116
|
-
};
|
|
117
|
-
|
|
115
|
+
};
|
|
118
116
|
|
|
117
|
+
// reset the input value on blur if invalid
|
|
119
118
|
const handleInputBlur = () => {
|
|
120
119
|
if (!inputValue || inputValue.length > 0 && !isValidHex(inputValue)) {
|
|
121
120
|
setInputValue(color);
|
|
122
121
|
}
|
|
123
122
|
};
|
|
124
|
-
|
|
125
123
|
const colorPreviews = NAMED_COLORS.map(c => /*#__PURE__*/React.createElement(ColorPreview, {
|
|
126
124
|
key: `${name}-${c === null || c === void 0 ? void 0 : c.color}`,
|
|
127
125
|
color: c === null || c === void 0 ? void 0 : c.color,
|
|
@@ -132,7 +130,6 @@ export const ColorInput = _ref => {
|
|
|
132
130
|
setIsOpen(false);
|
|
133
131
|
}
|
|
134
132
|
}));
|
|
135
|
-
|
|
136
133
|
function renderPopover() {
|
|
137
134
|
const pickerLabel = colorName ? formatMessage('Color Picker ({colorName} selected)', {
|
|
138
135
|
colorName
|
|
@@ -167,7 +164,6 @@ export const ColorInput = _ref => {
|
|
|
167
164
|
"data-testid": `${name}-popover`
|
|
168
165
|
}, requireColor ? colorPreviews.slice(0, -1) : colorPreviews));
|
|
169
166
|
}
|
|
170
|
-
|
|
171
167
|
return /*#__PURE__*/React.createElement(View, {
|
|
172
168
|
as: "div"
|
|
173
169
|
}, /*#__PURE__*/React.createElement(TextInput, {
|
|
@@ -190,7 +186,6 @@ export const ColorInput = _ref => {
|
|
|
190
186
|
interaction: readonly ? 'readonly' : undefined
|
|
191
187
|
}));
|
|
192
188
|
};
|
|
193
|
-
|
|
194
189
|
function ColorPreview(_ref2) {
|
|
195
190
|
let {
|
|
196
191
|
color,
|
|
@@ -216,17 +211,13 @@ function ColorPreview(_ref2) {
|
|
|
216
211
|
testId: `colorPreview-${color || 'none'}`
|
|
217
212
|
}));
|
|
218
213
|
}
|
|
219
|
-
|
|
220
214
|
function isValidHex(color) {
|
|
221
215
|
if (!color) return false;
|
|
222
|
-
|
|
223
216
|
switch (color.length) {
|
|
224
217
|
case 4:
|
|
225
218
|
return /^#[0-9A-F]{3}$/i.test(color);
|
|
226
|
-
|
|
227
219
|
case 7:
|
|
228
220
|
return /^#[0-9A-F]{6}$/i.test(color);
|
|
229
|
-
|
|
230
221
|
default:
|
|
231
222
|
return false;
|
|
232
223
|
}
|
|
@@ -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 { bool, element, oneOfType, arrayOf } from 'prop-types';
|
|
20
21
|
import { Tooltip } from '@instructure/ui-tooltip';
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
|
|
19
|
-
import { isOnlyTextSelected } from '../../contentInsertionUtils'; // eslint-disable-next-line import/no-nodejs-modules
|
|
20
18
|
|
|
21
|
-
import
|
|
19
|
+
import { fromImageEmbed, fromVideoEmbed } from '../instructure_image/ImageEmbedOptions';
|
|
20
|
+
import { isOnlyTextSelected } from '../../contentInsertionUtils';
|
|
22
21
|
import formatMessage from '../../../format-message';
|
|
23
22
|
import { isStudioEmbeddedMedia } from './StudioLtiSupportUtils';
|
|
24
23
|
import RCEGlobals from '../../RCEGlobals';
|
|
24
|
+
import { parseUrlPath } from '../../../util/url-util';
|
|
25
25
|
const FILE_DOWNLOAD_PATH_REGEX = /^\/(courses\/\d+\/)?files\/\d+\/download$/;
|
|
26
26
|
export const LINK_TYPE = 'link';
|
|
27
27
|
export const FILE_LINK_TYPE = 'file-link';
|
|
@@ -35,37 +35,29 @@ export const DISPLAY_AS_EMBED_DISABLED = 'embed-disabled';
|
|
|
35
35
|
export const DISPLAY_AS_DOWNLOAD_LINK = 'download-link';
|
|
36
36
|
export function asImageEmbed($element) {
|
|
37
37
|
const nodeName = $element === null || $element === void 0 ? void 0 : $element.nodeName.toLowerCase();
|
|
38
|
-
|
|
39
38
|
if (nodeName !== 'img') {
|
|
40
39
|
return null;
|
|
41
40
|
}
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
return {
|
|
42
|
+
...fromImageEmbed($element),
|
|
44
43
|
$element,
|
|
45
44
|
type: IMAGE_EMBED_TYPE
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
47
|
export function asLink($element, editor) {
|
|
49
48
|
var _$link;
|
|
50
|
-
|
|
51
49
|
let $link = $element;
|
|
52
|
-
|
|
53
50
|
if (((_$link = $link) === null || _$link === void 0 ? void 0 : _$link.tagName) !== 'A') {
|
|
54
51
|
// the user may have selected some text that is w/in a link
|
|
55
52
|
// but didn't include the <a>. Let's see if that's true
|
|
56
|
-
$link = editor.dom.getParent($link, 'a[href]');
|
|
53
|
+
$link = editor && editor.dom.getParent($link, 'a[href]');
|
|
57
54
|
}
|
|
58
|
-
|
|
59
55
|
if (!$link || $link.tagName !== 'A' || !$link.href) {
|
|
60
56
|
return null;
|
|
61
57
|
}
|
|
62
|
-
|
|
63
|
-
const {
|
|
64
|
-
pathname
|
|
65
|
-
} = url.parse($link.href);
|
|
58
|
+
const pathname = parseUrlPath($link.href);
|
|
66
59
|
const type = FILE_DOWNLOAD_PATH_REGEX.test(pathname) ? FILE_LINK_TYPE : LINK_TYPE;
|
|
67
60
|
let displayAs = DISPLAY_AS_LINK;
|
|
68
|
-
|
|
69
61
|
if ($link.classList.contains('no_preview')) {
|
|
70
62
|
displayAs = DISPLAY_AS_DOWNLOAD_LINK;
|
|
71
63
|
} else if ($link.classList.contains('auto_open')) {
|
|
@@ -73,7 +65,6 @@ export function asLink($element, editor) {
|
|
|
73
65
|
} else if ($link.classList.contains('inline_disabled')) {
|
|
74
66
|
displayAs = DISPLAY_AS_EMBED_DISABLED;
|
|
75
67
|
}
|
|
76
|
-
|
|
77
68
|
const contentType = $link.getAttribute('data-course-type');
|
|
78
69
|
const fileName = $link.getAttribute('title');
|
|
79
70
|
const published = $link.getAttribute('data-published') === 'true';
|
|
@@ -91,7 +82,9 @@ export function asLink($element, editor) {
|
|
|
91
82
|
fileName,
|
|
92
83
|
published
|
|
93
84
|
};
|
|
94
|
-
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// the video element is a bit tricky.
|
|
95
88
|
// tinymce won't let me add many attributes to the iframe,
|
|
96
89
|
// even though I've listed them in tinymce.config.js
|
|
97
90
|
// extended_valid_elements.
|
|
@@ -99,17 +92,14 @@ export function asLink($element, editor) {
|
|
|
99
92
|
// and it's attributes, even though this could change with future
|
|
100
93
|
// tinymce releases.
|
|
101
94
|
// see https://github.com/tinymce/tinymce/issues/5181
|
|
102
|
-
|
|
103
95
|
export function asVideoElement($element) {
|
|
104
96
|
var _$videoElem$parentEle;
|
|
105
|
-
|
|
106
97
|
const $videoElem = findMediaPlayerIframe($element);
|
|
107
|
-
|
|
108
98
|
if (!isVideoElement($videoElem) && !isStudioEmbeddedMedia($videoElem)) {
|
|
109
99
|
return null;
|
|
110
100
|
}
|
|
111
|
-
|
|
112
|
-
|
|
101
|
+
return {
|
|
102
|
+
...fromVideoEmbed($videoElem),
|
|
113
103
|
$element,
|
|
114
104
|
type: VIDEO_EMBED_TYPE,
|
|
115
105
|
id: ((_$videoElem$parentEle = $videoElem.parentElement) === null || _$videoElem$parentEle === void 0 ? void 0 : _$videoElem$parentEle.getAttribute('data-mce-p-data-media-id')) || $videoElem.getAttribute('data-mce-p-data-media-id')
|
|
@@ -117,11 +107,9 @@ export function asVideoElement($element) {
|
|
|
117
107
|
}
|
|
118
108
|
export function asAudioElement($element) {
|
|
119
109
|
var _$element$parentEleme;
|
|
120
|
-
|
|
121
110
|
if (!$element) {
|
|
122
111
|
return null;
|
|
123
112
|
}
|
|
124
|
-
|
|
125
113
|
const $audioIframe = $element.tagName === 'IFRAME' ? $element : $element.firstElementChild;
|
|
126
114
|
const $tinymceIframeShim = $audioIframe.parentElement;
|
|
127
115
|
const title = ($audioIframe.getAttribute('title') || $tinymceIframeShim.getAttribute('data-mce-p-title') || '').replace(formatMessage('Video player for '), '');
|
|
@@ -129,69 +117,55 @@ export function asAudioElement($element) {
|
|
|
129
117
|
titleText: title,
|
|
130
118
|
id: ((_$element$parentEleme = $element.parentElement) === null || _$element$parentEleme === void 0 ? void 0 : _$element$parentEleme.getAttribute('data-mce-p-data-media-id')) || $element.getAttribute('data-mce-p-data-media-id')
|
|
131
119
|
};
|
|
132
|
-
|
|
133
120
|
if ($audioIframe.tagName === 'IFRAME') {
|
|
134
121
|
const audioDoc = $audioIframe.contentDocument;
|
|
135
|
-
|
|
136
122
|
try {
|
|
137
123
|
var _audioDoc$querySelect;
|
|
138
|
-
|
|
139
124
|
const trackSJson = (_audioDoc$querySelect = audioDoc.querySelector('[data-tracks]')) === null || _audioDoc$querySelect === void 0 ? void 0 : _audioDoc$querySelect.getAttribute('data-tracks');
|
|
140
|
-
|
|
141
125
|
if (trackSJson) {
|
|
142
126
|
audioOptions.tracks = JSON.parse(trackSJson);
|
|
143
|
-
}
|
|
144
|
-
|
|
127
|
+
}
|
|
128
|
+
// eslint-disable-next-line no-empty
|
|
145
129
|
} catch (e) {}
|
|
146
130
|
}
|
|
147
|
-
|
|
148
131
|
if (RCEGlobals.getFeatures().media_links_use_attachment_id) {
|
|
149
132
|
const source = $audioIframe.getAttribute('src');
|
|
150
133
|
const matches = source === null || source === void 0 ? void 0 : source.match(/\/media_attachments_iframe\/(\d+)/);
|
|
151
|
-
|
|
152
134
|
if (matches) {
|
|
153
135
|
audioOptions.attachmentId = matches[1];
|
|
154
136
|
}
|
|
155
137
|
}
|
|
156
|
-
|
|
157
138
|
return audioOptions;
|
|
158
139
|
}
|
|
159
|
-
|
|
160
140
|
function asText($element, editor) {
|
|
161
141
|
const text = editor && editor.selection.getContent({
|
|
162
142
|
format: 'text'
|
|
163
143
|
});
|
|
164
|
-
|
|
165
144
|
if (!text) {
|
|
166
145
|
return null;
|
|
167
146
|
}
|
|
168
|
-
|
|
169
147
|
return {
|
|
170
148
|
$element,
|
|
171
149
|
text,
|
|
172
150
|
type: TEXT_TYPE
|
|
173
151
|
};
|
|
174
152
|
}
|
|
175
|
-
|
|
176
153
|
function asNone($element) {
|
|
177
154
|
return {
|
|
178
155
|
$element: $element || null,
|
|
179
156
|
type: NONE_TYPE
|
|
180
157
|
};
|
|
181
158
|
}
|
|
182
|
-
|
|
183
159
|
export function getContentFromElement($element, editor) {
|
|
184
160
|
if (!($element && $element.nodeName)) {
|
|
185
161
|
return asNone();
|
|
186
162
|
}
|
|
187
|
-
|
|
188
163
|
const content = asLink($element, editor) || asImageEmbed($element) || asVideoElement($element) || asText($element, editor) || asNone($element);
|
|
189
164
|
return content;
|
|
190
165
|
}
|
|
191
166
|
export function getContentFromEditor(editor) {
|
|
192
167
|
let expandSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
193
168
|
let $element;
|
|
194
|
-
|
|
195
169
|
if (editor && editor.selection) {
|
|
196
170
|
// tinymce selects the element around the cursor, whether it's
|
|
197
171
|
// content is selected in the copy/paste sense or not.
|
|
@@ -201,15 +175,14 @@ export function getContentFromEditor(editor) {
|
|
|
201
175
|
$element = editor.selection.getNode();
|
|
202
176
|
}
|
|
203
177
|
}
|
|
204
|
-
|
|
205
178
|
if ($element == null) {
|
|
206
179
|
return asNone();
|
|
207
180
|
}
|
|
208
|
-
|
|
209
181
|
return getContentFromElement($element, editor);
|
|
210
|
-
}
|
|
211
|
-
// find the <a> and return it's info
|
|
182
|
+
}
|
|
212
183
|
|
|
184
|
+
// if the selection is somewhere w/in a <a>,
|
|
185
|
+
// find the <a> and return it's info
|
|
213
186
|
export function getLinkContentFromEditor(editor) {
|
|
214
187
|
const $element = editor.selection.getNode();
|
|
215
188
|
return $element ? asLink($element, editor) : null;
|
|
@@ -220,33 +193,25 @@ export function isFileLink($element, editor) {
|
|
|
220
193
|
export function isImageEmbed($element) {
|
|
221
194
|
return !!asImageEmbed($element) && !$element.getAttribute('data-placeholder-for');
|
|
222
195
|
}
|
|
223
|
-
|
|
224
196
|
function isMediaElement($element, mediaType) {
|
|
225
197
|
var _tinymceIframeShim$fi, _tinymceIframeShim$ge;
|
|
226
|
-
|
|
227
198
|
// the video is hosted in an iframe, but tinymce
|
|
228
199
|
// wraps it in a span with swizzled attribute names
|
|
229
200
|
if (!($element !== null && $element !== void 0 && $element.getAttribute) || !$element) {
|
|
230
201
|
return false;
|
|
231
202
|
}
|
|
232
|
-
|
|
233
203
|
const tinymceIframeShim = $element.tagName === 'IFRAME' ? $element.parentElement : $element;
|
|
234
|
-
|
|
235
204
|
if (((_tinymceIframeShim$fi = tinymceIframeShim.firstElementChild) === null || _tinymceIframeShim$fi === void 0 ? void 0 : _tinymceIframeShim$fi.tagName) !== 'IFRAME') {
|
|
236
205
|
return false;
|
|
237
206
|
}
|
|
238
|
-
|
|
239
207
|
const media_obj_id = tinymceIframeShim.getAttribute('data-mce-p-data-media-id');
|
|
240
208
|
const is_media_attachment_iframe = (_tinymceIframeShim$ge = tinymceIframeShim.getAttribute('data-mce-p-src')) === null || _tinymceIframeShim$ge === void 0 ? void 0 : _tinymceIframeShim$ge.includes('media_attachments_iframe');
|
|
241
|
-
|
|
242
209
|
if (!media_obj_id && !is_media_attachment_iframe) {
|
|
243
210
|
return false;
|
|
244
211
|
}
|
|
245
|
-
|
|
246
212
|
const media_type = tinymceIframeShim.getAttribute('data-mce-p-data-media-type');
|
|
247
213
|
return media_type === mediaType;
|
|
248
214
|
}
|
|
249
|
-
|
|
250
215
|
export function isVideoElement($element) {
|
|
251
216
|
return isMediaElement($element, 'video');
|
|
252
217
|
}
|
|
@@ -255,27 +220,21 @@ export function isAudioElement($element) {
|
|
|
255
220
|
}
|
|
256
221
|
export function findMediaPlayerIframe(elem) {
|
|
257
222
|
var _elem$firstElementChi;
|
|
258
|
-
|
|
259
223
|
if (!elem) return null;
|
|
260
|
-
|
|
261
224
|
if (elem.tagName === 'IFRAME') {
|
|
262
225
|
// we have the iframe
|
|
263
226
|
return elem;
|
|
264
227
|
}
|
|
265
|
-
|
|
266
228
|
if (((_elem$firstElementChi = elem.firstElementChild) === null || _elem$firstElementChi === void 0 ? void 0 : _elem$firstElementChi.tagName) === 'IFRAME') {
|
|
267
229
|
// we have the shim tinymce puts around the iframe
|
|
268
230
|
return elem.firstElementChild;
|
|
269
231
|
}
|
|
270
|
-
|
|
271
232
|
if (elem.classList.contains('mce-shim')) {
|
|
272
233
|
var _elem$previousSibling;
|
|
273
|
-
|
|
274
234
|
// tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
|
|
275
235
|
if (((_elem$previousSibling = elem.previousSibling) === null || _elem$previousSibling === void 0 ? void 0 : _elem$previousSibling.tagName) === 'IFRAME') {
|
|
276
236
|
return elem.previousSibling;
|
|
277
237
|
}
|
|
278
238
|
}
|
|
279
|
-
|
|
280
239
|
return null;
|
|
281
240
|
}
|