@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,32 +15,33 @@
|
|
|
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 { isAudio, isImage, isVideo } from '../rce/plugins/shared/fileTypeUtils';
|
|
19
20
|
import { AUDIO_PLAYER_SIZE, VIDEO_SIZE_DEFAULT } from '../rce/plugins/instructure_record/VideoOptionsTray/TrayController';
|
|
20
21
|
import formatMessage from '../format-message';
|
|
21
22
|
import { trimmedOrNull } from './string-util';
|
|
22
23
|
import { assertNever } from './assertNever';
|
|
23
24
|
import { isTextNode } from './elem-util';
|
|
25
|
+
|
|
24
26
|
/**
|
|
25
27
|
* Determines what type of placeholder is appropriate for a given file information.
|
|
26
28
|
*/
|
|
27
|
-
|
|
28
29
|
export async function placeholderInfoFor(fileMetaProps) {
|
|
29
30
|
var _fileMetaProps$title, _trimmedOrNull;
|
|
30
|
-
|
|
31
31
|
const fileName = (_fileMetaProps$title = fileMetaProps.title) !== null && _fileMetaProps$title !== void 0 ? _fileMetaProps$title : fileMetaProps.name;
|
|
32
32
|
const visibleLabel = (_trimmedOrNull = trimmedOrNull(fileName)) !== null && _trimmedOrNull !== void 0 ? _trimmedOrNull : formatMessage('Loading...');
|
|
33
33
|
const ariaLabel = formatMessage('Loading placeholder for {fileName}', {
|
|
34
34
|
fileName: fileName !== null && fileName !== void 0 ? fileName : 'unknown filename'
|
|
35
35
|
});
|
|
36
|
-
|
|
36
|
+
if (typeof fileMetaProps.contentType !== 'string') {
|
|
37
|
+
throw new Error('Invalid fileMetaProps.contentType');
|
|
38
|
+
}
|
|
39
|
+
const type = fileMetaProps.contentType || fileMetaProps.type;
|
|
37
40
|
if (isImage(fileMetaProps.contentType) && fileMetaProps.displayAs !== 'link') {
|
|
38
41
|
var _trimmedOrNull2;
|
|
39
|
-
|
|
40
42
|
const imageUrl = (_trimmedOrNull2 = trimmedOrNull(fileMetaProps.domObject.preview)) !== null && _trimmedOrNull2 !== void 0 ? _trimmedOrNull2 : URL.createObjectURL(fileMetaProps.domObject);
|
|
41
43
|
return new Promise((resolve, reject) => {
|
|
42
44
|
const image = new Image();
|
|
43
|
-
|
|
44
45
|
image.onload = () => resolve({
|
|
45
46
|
type: 'block',
|
|
46
47
|
visibleLabel,
|
|
@@ -50,12 +51,10 @@ export async function placeholderInfoFor(fileMetaProps) {
|
|
|
50
51
|
vAlign: 'middle',
|
|
51
52
|
backgroundImageUrl: image.src
|
|
52
53
|
});
|
|
53
|
-
|
|
54
54
|
image.onerror = () => reject(new Error('Failed to load image: ' + imageUrl));
|
|
55
|
-
|
|
56
55
|
image.src = imageUrl;
|
|
57
56
|
});
|
|
58
|
-
} else if (isVideo(
|
|
57
|
+
} else if (typeof type === 'string' && isVideo(type)) {
|
|
59
58
|
return {
|
|
60
59
|
type: 'block',
|
|
61
60
|
visibleLabel,
|
|
@@ -64,7 +63,7 @@ export async function placeholderInfoFor(fileMetaProps) {
|
|
|
64
63
|
height: VIDEO_SIZE_DEFAULT.height,
|
|
65
64
|
vAlign: 'bottom'
|
|
66
65
|
};
|
|
67
|
-
} else if (isAudio(
|
|
66
|
+
} else if (typeof type === 'string' && isAudio(type)) {
|
|
68
67
|
return {
|
|
69
68
|
type: 'block',
|
|
70
69
|
visibleLabel,
|
|
@@ -82,48 +81,48 @@ export async function placeholderInfoFor(fileMetaProps) {
|
|
|
82
81
|
}
|
|
83
82
|
}
|
|
84
83
|
export function removePlaceholder(editor, unencodedName) {
|
|
85
|
-
const placeholderElem = editor.dom.doc.querySelector(`[data-placeholder-for="${encodeURIComponent(unencodedName)}"]`);
|
|
84
|
+
const placeholderElem = editor.dom.doc.querySelector(`[data-placeholder-for="${encodeURIComponent(unencodedName)}"]`);
|
|
86
85
|
|
|
86
|
+
// Fail gracefully
|
|
87
87
|
if (!placeholderElem) return;
|
|
88
88
|
editor.undoManager.ignore(() => {
|
|
89
|
-
editor.dom.remove(placeholderElem);
|
|
89
|
+
editor.dom.remove(placeholderElem);
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
// Cleanup data URIs
|
|
92
|
+
placeholderElem.querySelectorAll('img').forEach(
|
|
93
|
+
// Revoking non-object URLs is safe
|
|
92
94
|
img => URL.revokeObjectURL(img.src));
|
|
93
95
|
});
|
|
94
96
|
}
|
|
97
|
+
|
|
95
98
|
/**
|
|
96
99
|
* Inserts a placeholder into a TinyMCE editor. It should be removed by calling removePlaceholder, to ensure
|
|
97
100
|
* image resources are cleaned up.
|
|
98
101
|
*/
|
|
99
|
-
|
|
100
102
|
export async function insertPlaceholder(editor, unencodedName, placeholderInfoPromise) {
|
|
101
|
-
const placeholderId = `placeholder-${placeholderIdCounter++}`;
|
|
103
|
+
const placeholderId = `placeholder-${placeholderIdCounter++}`;
|
|
102
104
|
|
|
105
|
+
// Insert a minimal placeholder element into the editor.
|
|
103
106
|
editor.undoManager.ignore(() => editor.execCommand('mceInsertContent', false, `<span
|
|
104
107
|
aria-label="${formatMessage('Loading')}"
|
|
105
|
-
data-placeholder-for="${encodeURIComponent(unencodedName)}"
|
|
108
|
+
data-placeholder-for="${encodeURIComponent(unencodedName || '')}"
|
|
106
109
|
id="${placeholderId}"
|
|
107
110
|
class="mceNonEditable"
|
|
108
111
|
style="user-select: none; pointer-events: none; user-focus: none; display: inline-flex;"
|
|
109
|
-
></span> `
|
|
112
|
+
></span> `
|
|
113
|
+
// Without the trailing , tinymce will place the cursor inside the placeholder, which we don't want.
|
|
110
114
|
));
|
|
111
115
|
const placeholderElem = editor.dom.doc.querySelector(`#${placeholderId}`);
|
|
112
|
-
|
|
113
116
|
if (placeholderElem) {
|
|
114
117
|
editor.undoManager.ignore(() => {
|
|
115
|
-
var _nextNode$data;
|
|
116
|
-
|
|
117
118
|
// Remove the trailing space
|
|
118
119
|
const nextNode = placeholderElem.nextSibling;
|
|
119
120
|
placeholderElem.contentEditable = 'false';
|
|
120
|
-
|
|
121
|
-
if (isTextNode(nextNode) && nextNode !== null && nextNode !== void 0 && (_nextNode$data = nextNode.data) !== null && _nextNode$data !== void 0 && _nextNode$data.startsWith('\xA0'
|
|
122
|
-
/* nbsp */
|
|
123
|
-
)) {
|
|
121
|
+
if (isTextNode(nextNode) && nextNode?.data?.startsWith('\xA0' /* nbsp */)) {
|
|
124
122
|
// Split out the non-breaking-space which only counts as length 1 for splitText
|
|
125
|
-
nextNode.splitText(1);
|
|
123
|
+
nextNode.splitText(1);
|
|
126
124
|
|
|
125
|
+
// Remove the now split text node
|
|
127
126
|
if (placeholderElem.nextSibling) {
|
|
128
127
|
editor.dom.remove(placeholderElem.nextSibling);
|
|
129
128
|
}
|
|
@@ -132,9 +131,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
132
131
|
} else {
|
|
133
132
|
throw new Error('Failed to find placeholder element after inserting it into the editor.');
|
|
134
133
|
}
|
|
134
|
+
const placeholderInfo = await placeholderInfoPromise;
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
|
|
136
|
+
// Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
|
|
138
137
|
editor.undoManager.ignore(() => {
|
|
139
138
|
// Set up the overall placeholder container
|
|
140
139
|
placeholderElem.setAttribute('aria-label', placeholderInfo.ariaLabel);
|
|
@@ -146,22 +145,21 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
146
145
|
alignItems: 'center',
|
|
147
146
|
borderRadius: '10px',
|
|
148
147
|
overflow: 'hidden'
|
|
149
|
-
});
|
|
148
|
+
});
|
|
150
149
|
|
|
150
|
+
// Create the spinner
|
|
151
151
|
placeholderElem.innerHTML = spinnerSvg(placeholderInfo.type === 'inline' ? 'x-small' : 'medium', placeholderId + '-label');
|
|
152
152
|
const spinnerElem = placeholderElem.firstElementChild;
|
|
153
|
-
|
|
154
153
|
if (!spinnerElem) {
|
|
155
154
|
throw new Error("Couldn't find the Spinner element in the placeholder");
|
|
156
|
-
}
|
|
157
|
-
|
|
155
|
+
}
|
|
158
156
|
|
|
157
|
+
// Create the label
|
|
159
158
|
const labelElem = editor.dom.doc.createElement('div');
|
|
160
159
|
placeholderElem.appendChild(labelElem);
|
|
161
160
|
Object.assign(labelElem.style, {
|
|
162
161
|
color: '#2D3B45',
|
|
163
162
|
zIndex: '1000',
|
|
164
|
-
|
|
165
163
|
/* Restrict text to one line */
|
|
166
164
|
display: 'inline-block',
|
|
167
165
|
maxWidth: 'calc(100% - 10px)',
|
|
@@ -169,8 +167,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
169
167
|
whiteSpace: 'nowrap',
|
|
170
168
|
textOverflow: 'ellipsis'
|
|
171
169
|
});
|
|
172
|
-
labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
|
|
170
|
+
labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
|
|
173
171
|
|
|
172
|
+
// Handle type specific stying
|
|
174
173
|
switch (placeholderInfo.type) {
|
|
175
174
|
case 'inline':
|
|
176
175
|
Object.assign(placeholderElem.style, {
|
|
@@ -182,7 +181,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
182
181
|
backgroundColor: '#F5F5F5'
|
|
183
182
|
});
|
|
184
183
|
break;
|
|
185
|
-
|
|
186
184
|
case 'block':
|
|
187
185
|
{
|
|
188
186
|
const {
|
|
@@ -203,7 +201,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
203
201
|
verticalAlign: vAlign,
|
|
204
202
|
backgroundColor: '#FFFFFF'
|
|
205
203
|
});
|
|
206
|
-
|
|
207
204
|
if (backgroundImageUrl != null) {
|
|
208
205
|
const imageElem = document.createElement('img');
|
|
209
206
|
imageElem.src = backgroundImageUrl;
|
|
@@ -224,13 +221,13 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
224
221
|
}
|
|
225
222
|
}
|
|
226
223
|
break;
|
|
227
|
-
|
|
228
224
|
default:
|
|
229
225
|
// Ensure all valid placeholderInfo types are handled above.
|
|
230
226
|
assertNever(placeholderInfo);
|
|
231
227
|
}
|
|
232
|
-
});
|
|
228
|
+
});
|
|
233
229
|
|
|
230
|
+
// Prevent user interaction with the placeholder elements
|
|
234
231
|
placeholderElem.querySelectorAll('*').forEach(elem => {
|
|
235
232
|
if (elem instanceof HTMLElement) {
|
|
236
233
|
elem.style.pointerEvents = 'none';
|
|
@@ -240,34 +237,35 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
240
237
|
});
|
|
241
238
|
return placeholderElem;
|
|
242
239
|
}
|
|
240
|
+
|
|
243
241
|
/**
|
|
244
242
|
* Something for which a placeholder can be added to the editor.
|
|
245
243
|
*/
|
|
246
244
|
|
|
245
|
+
/**
|
|
246
|
+
* Style of placeholder to be inserted into the editor.
|
|
247
|
+
*/
|
|
248
|
+
|
|
247
249
|
let placeholderIdCounter = 0;
|
|
250
|
+
|
|
248
251
|
/**
|
|
249
252
|
* A fully standalone version of InstUI <Spinner> that can be used inside TinyMCE's iframe without access to
|
|
250
253
|
* Canvas's CSS or JS.
|
|
251
254
|
*/
|
|
252
255
|
// language=html
|
|
253
|
-
|
|
254
256
|
function spinnerSvg(size, labelId) {
|
|
255
257
|
const radius = (() => {
|
|
256
258
|
switch (size) {
|
|
257
259
|
case 'x-small':
|
|
258
260
|
return '0.5em';
|
|
259
|
-
|
|
260
261
|
case 'small':
|
|
261
262
|
return '1em';
|
|
262
|
-
|
|
263
263
|
case 'large':
|
|
264
264
|
return '2.25em';
|
|
265
|
-
|
|
266
265
|
default:
|
|
267
266
|
return '1.75em';
|
|
268
267
|
}
|
|
269
268
|
})();
|
|
270
|
-
|
|
271
269
|
return `
|
|
272
270
|
<span class="Spinner-root Spinner-default Spinner-${size}" role="presentation">
|
|
273
271
|
<svg class="Spinner-circle"
|
package/es/util/simpleCache.js
CHANGED
|
@@ -22,20 +22,16 @@
|
|
|
22
22
|
* @param compute The function to compute values in the cache
|
|
23
23
|
* @param cache The map to use as a cache
|
|
24
24
|
*/
|
|
25
|
-
export function simpleCache(compute) {
|
|
26
|
-
let cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();
|
|
25
|
+
export function simpleCache(compute, cache = new Map()) {
|
|
27
26
|
return {
|
|
28
27
|
cache,
|
|
29
|
-
|
|
30
28
|
get(key) {
|
|
31
29
|
if (cache.has(key)) {
|
|
32
30
|
return cache.get(key);
|
|
33
31
|
}
|
|
34
|
-
|
|
35
32
|
const value = compute(key);
|
|
36
33
|
cache.set(key, value);
|
|
37
34
|
return value;
|
|
38
35
|
}
|
|
39
|
-
|
|
40
36
|
};
|
|
41
37
|
}
|
package/es/util/string-util.js
CHANGED
|
@@ -26,6 +26,7 @@ export function emptyAsNull(str) {
|
|
|
26
26
|
if (str.length === 0) return null;
|
|
27
27
|
return str;
|
|
28
28
|
}
|
|
29
|
+
|
|
29
30
|
/**
|
|
30
31
|
* Returns null if the string is null, undefined, is empty, or contains only whitespace.
|
|
31
32
|
*
|
|
@@ -39,7 +40,6 @@ export function emptyAsNull(str) {
|
|
|
39
40
|
*
|
|
40
41
|
* @param str
|
|
41
42
|
*/
|
|
42
|
-
|
|
43
43
|
export function trimmedOrNull(str) {
|
|
44
44
|
if (str == null) return null;
|
|
45
45
|
str = str.trim();
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import * as textFieldEdit from 'text-field-edit';
|
|
19
20
|
import { assertNever } from './assertNever';
|
|
21
|
+
|
|
20
22
|
/**
|
|
21
23
|
* Represents a subset of the editing actions that can be taken on a <textarea> using the text-field-edit library.
|
|
22
24
|
*
|
|
@@ -32,23 +34,20 @@ import { assertNever } from './assertNever';
|
|
|
32
34
|
*/
|
|
33
35
|
export function performTextEditActionOnTextarea(textarea, editAction) {
|
|
34
36
|
var _editAction$before, _editAction$after;
|
|
35
|
-
|
|
36
37
|
switch (editAction.action) {
|
|
37
38
|
case 'insert':
|
|
38
39
|
return textFieldEdit.insert(textarea, editAction.text);
|
|
39
|
-
|
|
40
40
|
case 'wrapSelection':
|
|
41
41
|
return textFieldEdit.wrapSelection(textarea, (_editAction$before = editAction.before) !== null && _editAction$before !== void 0 ? _editAction$before : '', (_editAction$after = editAction.after) !== null && _editAction$after !== void 0 ? _editAction$after : '');
|
|
42
|
-
|
|
43
42
|
default:
|
|
44
43
|
assertNever(editAction);
|
|
45
44
|
}
|
|
46
45
|
}
|
|
46
|
+
|
|
47
47
|
/**
|
|
48
48
|
* Executes the given text edit actions on an object representing the important state of textarea editing,
|
|
49
49
|
* the current text, selection start, and selection end.
|
|
50
50
|
*/
|
|
51
|
-
|
|
52
51
|
export function performTextEditActionsOnString(args) {
|
|
53
52
|
let {
|
|
54
53
|
text: currentText,
|
|
@@ -62,11 +61,9 @@ export function performTextEditActionsOnString(args) {
|
|
|
62
61
|
selStart += action.text.length;
|
|
63
62
|
selEnd = selStart;
|
|
64
63
|
break;
|
|
65
|
-
|
|
66
64
|
case 'wrapSelection':
|
|
67
65
|
{
|
|
68
66
|
var _action$before, _action$after;
|
|
69
|
-
|
|
70
67
|
const before = (_action$before = action.before) !== null && _action$before !== void 0 ? _action$before : '';
|
|
71
68
|
const after = (_action$after = action.after) !== null && _action$after !== void 0 ? _action$after : '';
|
|
72
69
|
currentText = currentText.substring(0, selStart) + before + currentText.substring(selStart, selEnd) + after + currentText.substring(selEnd);
|
|
@@ -74,7 +71,6 @@ export function performTextEditActionsOnString(args) {
|
|
|
74
71
|
selEnd += before.length;
|
|
75
72
|
}
|
|
76
73
|
break;
|
|
77
|
-
|
|
78
74
|
default:
|
|
79
75
|
assertNever(action);
|
|
80
76
|
}
|
|
@@ -32,21 +32,16 @@ export function toolbarIconHelperFor(editor, ariaLabel) {
|
|
|
32
32
|
// There are a few different potential button selectors
|
|
33
33
|
const containerSelector = ['.tox-tbtn', '.tox-split-button'].map(buttonSel => `${buttonSel}[aria-label="${CSS.escape(ariaLabel)}"] .tox-icon`).join(',');
|
|
34
34
|
const $svgContainer = editor.$(containerSelector, document);
|
|
35
|
-
|
|
36
35
|
if ($svgContainer.length === 0) {
|
|
37
36
|
console.error(`Failed to find TinyMCE toolbar button for ariaLabel "${ariaLabel}" using selector: ${containerSelector}`);
|
|
38
37
|
}
|
|
39
|
-
|
|
40
38
|
return {
|
|
41
39
|
updateIcon(iconName) {
|
|
42
40
|
const svg = editor.ui.registry.getAll().icons[iconName];
|
|
43
|
-
|
|
44
41
|
if (!svg) {
|
|
45
42
|
console.error(`Invalid icon name given for button labeled "${ariaLabel}": ${iconName}`);
|
|
46
43
|
}
|
|
47
|
-
|
|
48
44
|
$svgContainer.html(svg);
|
|
49
45
|
}
|
|
50
|
-
|
|
51
46
|
};
|
|
52
47
|
}
|
package/es/util/url-util.js
CHANGED
|
@@ -15,18 +15,18 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import * as URI from 'uri-js';
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* Attempts to build a URL from the given string, and returns null if it is not a valid URL, rather than
|
|
21
23
|
* throwing an exception, as the URL constructor does.
|
|
22
24
|
*/
|
|
23
|
-
|
|
24
25
|
export function parseUrlOrNull(url, base) {
|
|
25
26
|
if (!url) return null;
|
|
26
|
-
|
|
27
27
|
try {
|
|
28
28
|
return new URL(url, base);
|
|
29
|
-
} catch (
|
|
29
|
+
} catch (_e) {
|
|
30
30
|
return null;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -38,6 +38,10 @@ export function relativizeUrl(url) {
|
|
|
38
38
|
delete parsed.port;
|
|
39
39
|
return URI.serialize(parsed);
|
|
40
40
|
}
|
|
41
|
+
export function parseUrlPath(url) {
|
|
42
|
+
return URI.parse(url).path;
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
/**
|
|
42
46
|
* Converts the given URL into a relative URL if it meets the following criteria:
|
|
43
47
|
* - is parsable by the browser URL class
|
|
@@ -52,50 +56,46 @@ export function relativizeUrl(url) {
|
|
|
52
56
|
* @param inputUrlStr URL to relativize
|
|
53
57
|
* @param origin Origin to check for
|
|
54
58
|
*/
|
|
55
|
-
|
|
56
59
|
export function relativeHttpUrlForHostname(inputUrlStr, origin) {
|
|
57
60
|
if (inputUrlStr == null || inputUrlStr === '') {
|
|
58
61
|
return inputUrlStr;
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
if (!(inputUrlStr !== null && inputUrlStr !== void 0 && inputUrlStr.match(/^https?:/i)) || !(origin !== null && origin !== void 0 && origin.match(/^https?:/i))) {
|
|
63
|
+
if (!inputUrlStr?.match(/^https?:/i) || !origin?.match(/^https?:/i)) {
|
|
62
64
|
// Already relative or not a http/https protocol url
|
|
63
65
|
return inputUrlStr;
|
|
64
66
|
}
|
|
65
|
-
|
|
66
67
|
const url = parseUrlOrNull(inputUrlStr);
|
|
67
|
-
|
|
68
68
|
if (url == null) {
|
|
69
69
|
return inputUrlStr;
|
|
70
|
-
}
|
|
71
|
-
// new URL("hTTps://CaNvAs.CoM").origin === 'https://canvas.com'
|
|
72
|
-
|
|
70
|
+
}
|
|
73
71
|
|
|
72
|
+
// Handle the simple case of origins matching. Note that the parsed URL will always have a lowercase origin
|
|
73
|
+
// new URL("hTTps://CaNvAs.CoM").origin === 'https://canvas.com'
|
|
74
74
|
if (url.origin === origin.toLowerCase()) {
|
|
75
75
|
return relativizeUrl(inputUrlStr);
|
|
76
|
-
}
|
|
77
|
-
|
|
76
|
+
}
|
|
78
77
|
|
|
78
|
+
// Handle the more complex case of hostname/port matching
|
|
79
79
|
const originUrl = parseUrlOrNull(origin);
|
|
80
|
-
const originHostname = originUrl
|
|
80
|
+
const originHostname = originUrl?.hostname;
|
|
81
|
+
|
|
82
|
+
// Port checks are only needed if the port is not the default port for http or https.
|
|
81
83
|
// If the port isn't an http port, then we don't want equivalence, especially for local origins,
|
|
82
84
|
// since you might be running canvas on "localhost:3000" and some LTI tool on "localhost:4000"
|
|
83
85
|
// But elsewhere, "http://canvas.com:80" and "http://canvas.com" are equivalent
|
|
84
|
-
|
|
85
86
|
const urlUsesHttpPort = url.port === '80' || url.port === '443' || url.port === '';
|
|
86
|
-
const originUsesHttpPort = originUrl == null ||
|
|
87
|
+
const originUsesHttpPort = originUrl == null || originUrl?.port === '80' || originUrl?.port === '443' || originUrl?.port === '';
|
|
87
88
|
const portCheckNeeded = !(urlUsesHttpPort && originUsesHttpPort);
|
|
88
|
-
|
|
89
|
-
if (portCheckNeeded && (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) !== (url === null || url === void 0 ? void 0 : url.port)) {
|
|
89
|
+
if (portCheckNeeded && originUrl?.port !== url?.port) {
|
|
90
90
|
return inputUrlStr;
|
|
91
91
|
}
|
|
92
|
-
|
|
93
|
-
if (url.hostname === (originHostname === null || originHostname === void 0 ? void 0 : originHostname.toLowerCase())) {
|
|
92
|
+
if (url.hostname === originHostname?.toLowerCase()) {
|
|
94
93
|
return relativizeUrl(inputUrlStr);
|
|
95
94
|
} else {
|
|
96
95
|
return inputUrlStr;
|
|
97
96
|
}
|
|
98
97
|
}
|
|
98
|
+
|
|
99
99
|
/**
|
|
100
100
|
* Adds a record of query parameters to a URL. null or undefined values in the record are ignored.
|
|
101
101
|
*
|
|
@@ -105,34 +105,25 @@ export function relativeHttpUrlForHostname(inputUrlStr, origin) {
|
|
|
105
105
|
* @param inputUrlStr The URL string to parse
|
|
106
106
|
* @param queryParams A record containing the query parameters to add
|
|
107
107
|
*/
|
|
108
|
-
|
|
109
108
|
export function addQueryParamsToUrl(inputUrlStr, queryParams) {
|
|
110
109
|
var _parsedUrl$query;
|
|
111
|
-
|
|
112
110
|
if (inputUrlStr == null) {
|
|
113
111
|
return null;
|
|
114
112
|
}
|
|
115
|
-
|
|
116
113
|
const paramEntries = Object.entries(queryParams);
|
|
117
|
-
|
|
118
114
|
if (paramEntries.length === 0) {
|
|
119
115
|
return inputUrlStr;
|
|
120
116
|
}
|
|
121
|
-
|
|
122
117
|
const parsedUrl = URI.parse(inputUrlStr);
|
|
123
|
-
|
|
124
118
|
if (parsedUrl == null) {
|
|
125
119
|
return null;
|
|
126
120
|
}
|
|
127
|
-
|
|
128
121
|
const searchParams = new URLSearchParams((_parsedUrl$query = parsedUrl.query) !== null && _parsedUrl$query !== void 0 ? _parsedUrl$query : '');
|
|
129
|
-
|
|
130
122
|
for (const [paramName, paramValue] of paramEntries) {
|
|
131
123
|
if (paramValue != null) {
|
|
132
124
|
searchParams.set(paramName, paramValue);
|
|
133
125
|
}
|
|
134
126
|
}
|
|
135
|
-
|
|
136
127
|
parsedUrl.query = searchParams.toString();
|
|
137
128
|
return URI.serialize(parsedUrl);
|
|
138
129
|
}
|