@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,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,49 @@ 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
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
118
|
var _nextNode$data;
|
|
116
|
-
|
|
117
119
|
// Remove the trailing space
|
|
118
120
|
const nextNode = placeholderElem.nextSibling;
|
|
119
121
|
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
|
-
)) {
|
|
122
|
+
if (isTextNode(nextNode) && nextNode !== null && nextNode !== void 0 && (_nextNode$data = nextNode.data) !== null && _nextNode$data !== void 0 && _nextNode$data.startsWith('\xA0' /* nbsp */)) {
|
|
124
123
|
// Split out the non-breaking-space which only counts as length 1 for splitText
|
|
125
|
-
nextNode.splitText(1);
|
|
124
|
+
nextNode.splitText(1);
|
|
126
125
|
|
|
126
|
+
// Remove the now split text node
|
|
127
127
|
if (placeholderElem.nextSibling) {
|
|
128
128
|
editor.dom.remove(placeholderElem.nextSibling);
|
|
129
129
|
}
|
|
@@ -132,9 +132,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
132
132
|
} else {
|
|
133
133
|
throw new Error('Failed to find placeholder element after inserting it into the editor.');
|
|
134
134
|
}
|
|
135
|
+
const placeholderInfo = await placeholderInfoPromise;
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
// Fully initialize the placeholder. Done separately from inserting to avoid TinyMCE mangling the HTML
|
|
138
138
|
editor.undoManager.ignore(() => {
|
|
139
139
|
// Set up the overall placeholder container
|
|
140
140
|
placeholderElem.setAttribute('aria-label', placeholderInfo.ariaLabel);
|
|
@@ -146,22 +146,21 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
146
146
|
alignItems: 'center',
|
|
147
147
|
borderRadius: '10px',
|
|
148
148
|
overflow: 'hidden'
|
|
149
|
-
});
|
|
149
|
+
});
|
|
150
150
|
|
|
151
|
+
// Create the spinner
|
|
151
152
|
placeholderElem.innerHTML = spinnerSvg(placeholderInfo.type === 'inline' ? 'x-small' : 'medium', placeholderId + '-label');
|
|
152
153
|
const spinnerElem = placeholderElem.firstElementChild;
|
|
153
|
-
|
|
154
154
|
if (!spinnerElem) {
|
|
155
155
|
throw new Error("Couldn't find the Spinner element in the placeholder");
|
|
156
|
-
}
|
|
157
|
-
|
|
156
|
+
}
|
|
158
157
|
|
|
158
|
+
// Create the label
|
|
159
159
|
const labelElem = editor.dom.doc.createElement('div');
|
|
160
160
|
placeholderElem.appendChild(labelElem);
|
|
161
161
|
Object.assign(labelElem.style, {
|
|
162
162
|
color: '#2D3B45',
|
|
163
163
|
zIndex: '1000',
|
|
164
|
-
|
|
165
164
|
/* Restrict text to one line */
|
|
166
165
|
display: 'inline-block',
|
|
167
166
|
maxWidth: 'calc(100% - 10px)',
|
|
@@ -169,8 +168,9 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
169
168
|
whiteSpace: 'nowrap',
|
|
170
169
|
textOverflow: 'ellipsis'
|
|
171
170
|
});
|
|
172
|
-
labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
|
|
171
|
+
labelElem.appendChild(editor.dom.doc.createTextNode(placeholderInfo.visibleLabel));
|
|
173
172
|
|
|
173
|
+
// Handle type specific stying
|
|
174
174
|
switch (placeholderInfo.type) {
|
|
175
175
|
case 'inline':
|
|
176
176
|
Object.assign(placeholderElem.style, {
|
|
@@ -182,7 +182,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
182
182
|
backgroundColor: '#F5F5F5'
|
|
183
183
|
});
|
|
184
184
|
break;
|
|
185
|
-
|
|
186
185
|
case 'block':
|
|
187
186
|
{
|
|
188
187
|
const {
|
|
@@ -203,7 +202,6 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
203
202
|
verticalAlign: vAlign,
|
|
204
203
|
backgroundColor: '#FFFFFF'
|
|
205
204
|
});
|
|
206
|
-
|
|
207
205
|
if (backgroundImageUrl != null) {
|
|
208
206
|
const imageElem = document.createElement('img');
|
|
209
207
|
imageElem.src = backgroundImageUrl;
|
|
@@ -224,13 +222,13 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
224
222
|
}
|
|
225
223
|
}
|
|
226
224
|
break;
|
|
227
|
-
|
|
228
225
|
default:
|
|
229
226
|
// Ensure all valid placeholderInfo types are handled above.
|
|
230
227
|
assertNever(placeholderInfo);
|
|
231
228
|
}
|
|
232
|
-
});
|
|
229
|
+
});
|
|
233
230
|
|
|
231
|
+
// Prevent user interaction with the placeholder elements
|
|
234
232
|
placeholderElem.querySelectorAll('*').forEach(elem => {
|
|
235
233
|
if (elem instanceof HTMLElement) {
|
|
236
234
|
elem.style.pointerEvents = 'none';
|
|
@@ -240,34 +238,35 @@ export async function insertPlaceholder(editor, unencodedName, placeholderInfoPr
|
|
|
240
238
|
});
|
|
241
239
|
return placeholderElem;
|
|
242
240
|
}
|
|
241
|
+
|
|
243
242
|
/**
|
|
244
243
|
* Something for which a placeholder can be added to the editor.
|
|
245
244
|
*/
|
|
246
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Style of placeholder to be inserted into the editor.
|
|
248
|
+
*/
|
|
249
|
+
|
|
247
250
|
let placeholderIdCounter = 0;
|
|
251
|
+
|
|
248
252
|
/**
|
|
249
253
|
* A fully standalone version of InstUI <Spinner> that can be used inside TinyMCE's iframe without access to
|
|
250
254
|
* Canvas's CSS or JS.
|
|
251
255
|
*/
|
|
252
256
|
// language=html
|
|
253
|
-
|
|
254
257
|
function spinnerSvg(size, labelId) {
|
|
255
258
|
const radius = (() => {
|
|
256
259
|
switch (size) {
|
|
257
260
|
case 'x-small':
|
|
258
261
|
return '0.5em';
|
|
259
|
-
|
|
260
262
|
case 'small':
|
|
261
263
|
return '1em';
|
|
262
|
-
|
|
263
264
|
case 'large':
|
|
264
265
|
return '2.25em';
|
|
265
|
-
|
|
266
266
|
default:
|
|
267
267
|
return '1.75em';
|
|
268
268
|
}
|
|
269
269
|
})();
|
|
270
|
-
|
|
271
270
|
return `
|
|
272
271
|
<span class="Spinner-root Spinner-default Spinner-${size}" role="presentation">
|
|
273
272
|
<svg class="Spinner-circle"
|
package/es/util/simpleCache.js
CHANGED
|
@@ -26,16 +26,13 @@ export function simpleCache(compute) {
|
|
|
26
26
|
let cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Map();
|
|
27
27
|
return {
|
|
28
28
|
cache,
|
|
29
|
-
|
|
30
29
|
get(key) {
|
|
31
30
|
if (cache.has(key)) {
|
|
32
31
|
return cache.get(key);
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
const value = compute(key);
|
|
36
34
|
cache.set(key, value);
|
|
37
35
|
return value;
|
|
38
36
|
}
|
|
39
|
-
|
|
40
37
|
};
|
|
41
38
|
}
|
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
63
|
if (!(inputUrlStr !== null && inputUrlStr !== void 0 && inputUrlStr.match(/^https?:/i)) || !(origin !== null && origin !== void 0 && 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 === null || originUrl === void 0 ? void 0 : originUrl.hostname;
|
|
80
|
+
const originHostname = originUrl === null || originUrl === void 0 ? void 0 : 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
87
|
const originUsesHttpPort = originUrl == null || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '80' || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '443' || (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) === '';
|
|
87
88
|
const portCheckNeeded = !(urlUsesHttpPort && originUsesHttpPort);
|
|
88
|
-
|
|
89
89
|
if (portCheckNeeded && (originUrl === null || originUrl === void 0 ? void 0 : originUrl.port) !== (url === null || url === void 0 ? void 0 : url.port)) {
|
|
90
90
|
return inputUrlStr;
|
|
91
91
|
}
|
|
92
|
-
|
|
93
92
|
if (url.hostname === (originHostname === null || originHostname === void 0 ? void 0 : 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
|
}
|