@instructure/canvas-rce 5.14.0 → 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 +33 -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/__tests__/sidebar/reducers/all_files.test.js +28 -0
- package/babel.config.js +3 -1
- package/build.sh +7 -7
- 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 +25 -38
- 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/plugins/instructure_rce_external_tools/constants.js +28 -0
- 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 +43 -63
- 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 +77 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/publish_to_npm.sh +1 -1
- 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/common/components/FileTree/File.js +0 -64
- package/es/common/components/FileTree/Folder.js +0 -110
- package/es/common/components/FileTree/index.js +0 -84
- package/es/common/components/FileTree/styles.js +0 -72
- package/es/common/components/Loading.js +0 -83
|
@@ -15,18 +15,19 @@
|
|
|
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 classnames from 'classnames';
|
|
19
20
|
import { renderAudio, renderImage, renderLink, renderLinkedImage, renderVideo } from './contentRendering';
|
|
20
21
|
import { cleanUrl, getAnchorElement, isImageFigure, isOnlyTextSelected } from './contentInsertionUtils';
|
|
21
22
|
import { mediaPlayerURLFromFile } from './plugins/shared/fileTypeUtils';
|
|
22
23
|
import { absoluteToRelativeUrl } from '../common/fileUrl';
|
|
24
|
+
|
|
23
25
|
/** * generic content insertion ** */
|
|
26
|
+
|
|
24
27
|
// when the editor is hidden, just replace the selected portion of the textarea
|
|
25
28
|
// with the content. branching is for cross-browser
|
|
26
|
-
|
|
27
29
|
function replaceTextareaSelection(editor, content) {
|
|
28
30
|
const element = editor.getElement();
|
|
29
|
-
|
|
30
31
|
if ('selectionStart' in element) {
|
|
31
32
|
// mozilla / dom 3.0
|
|
32
33
|
const before = element.value.substr(0, element.selectionStart);
|
|
@@ -41,7 +42,6 @@ function replaceTextareaSelection(editor, content) {
|
|
|
41
42
|
element.value += content;
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
|
-
|
|
45
45
|
export function insertContent(editor, content) {
|
|
46
46
|
if (editor.isHidden()) {
|
|
47
47
|
// replaces the textarea selection with the new image. no element returned
|
|
@@ -57,66 +57,60 @@ export function insertContent(editor, content) {
|
|
|
57
57
|
if (editor.iframeElement) {
|
|
58
58
|
editor.iframeElement.scrollIntoView();
|
|
59
59
|
}
|
|
60
|
-
}, 100);
|
|
60
|
+
}, 100);
|
|
61
|
+
// there's a bug in tinymce where insertContent calls execCommand('mceInsertContent'),
|
|
61
62
|
// but doesn't correctly forward the second "args" argument. Let's go right for
|
|
62
63
|
// execCommand
|
|
63
64
|
// editor.insertContent(content, {skip_focus: true})
|
|
64
|
-
|
|
65
65
|
editor.execCommand('mceInsertContent', false, content, {
|
|
66
66
|
skip_focus: true
|
|
67
67
|
});
|
|
68
68
|
return editor.selection.getEnd();
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
+
|
|
71
72
|
/** * image insertion ** */
|
|
72
73
|
|
|
73
74
|
function isElemImg(elem) {
|
|
74
75
|
return elem && elem.nodeName.toLowerCase() === 'img';
|
|
75
76
|
}
|
|
76
|
-
|
|
77
77
|
function isElemAnchor(elem) {
|
|
78
78
|
return elem && elem.nodeName.toLowerCase() === 'a';
|
|
79
79
|
}
|
|
80
|
+
|
|
80
81
|
/*
|
|
81
82
|
check if we should preserve the parent anchor tag. the criteria is pretty
|
|
82
83
|
strict based on if we have a single image selected with an anchor tag
|
|
83
84
|
surrounding
|
|
84
85
|
*/
|
|
85
|
-
|
|
86
|
-
|
|
87
86
|
function shouldPreserveImgAnchor(editor) {
|
|
88
87
|
const selection = editor.selection;
|
|
89
88
|
const selectedRange = selection.getRng();
|
|
90
89
|
return isElemImg(selection.getNode()) && isElemAnchor(selectedRange.startContainer) && selectedRange.startContainer === selectedRange.endContainer;
|
|
91
90
|
}
|
|
92
|
-
|
|
93
91
|
export function insertImage(editor, image, canvasOrigin) {
|
|
94
92
|
let content = '';
|
|
95
|
-
|
|
96
93
|
if (shouldPreserveImgAnchor(editor)) {
|
|
97
94
|
content = renderLinkedImage(editor.selection.getRng().startContainer, image, canvasOrigin);
|
|
98
95
|
} else {
|
|
99
96
|
// render the image, constraining its size on insertion
|
|
100
|
-
const imgNode = editor.selection.getNode();
|
|
101
|
-
|
|
97
|
+
const imgNode = editor.selection.getNode();
|
|
98
|
+
// apply selected styles only in course/user images
|
|
102
99
|
if (isElemImg(imgNode) && !image['data-inst-icon-maker-icon']) {
|
|
103
100
|
const customStyles = imgNode.style;
|
|
104
101
|
const customWidth = imgNode.getAttribute('width');
|
|
105
102
|
const parseStyles = {};
|
|
106
|
-
|
|
107
103
|
for (let i = 0; i < customStyles.length; ++i) {
|
|
108
104
|
const cssAttribute = customStyles.item(i);
|
|
109
105
|
parseStyles[cssAttribute] = customStyles[cssAttribute];
|
|
110
106
|
}
|
|
111
|
-
|
|
112
107
|
image.width = customWidth;
|
|
113
108
|
image.style = parseStyles;
|
|
114
109
|
}
|
|
115
|
-
|
|
116
|
-
|
|
110
|
+
content = renderImage({
|
|
111
|
+
...image
|
|
117
112
|
}, canvasOrigin);
|
|
118
113
|
}
|
|
119
|
-
|
|
120
114
|
return insertContent(editor, content);
|
|
121
115
|
}
|
|
122
116
|
export function insertEquation(editor, latex) {
|
|
@@ -124,8 +118,9 @@ export function insertEquation(editor, latex) {
|
|
|
124
118
|
const sel = editor.selection.getNode();
|
|
125
119
|
const imgSz = sel ? parseFloat(editor.dom.doc.defaultView.getComputedStyle(sel).getPropertyValue('font-size')) || 1 : docSz;
|
|
126
120
|
const scale = imgSz / docSz;
|
|
127
|
-
const url = `/equation_images/${encodeURIComponent(encodeURIComponent(latex))}?scale=${scale}`;
|
|
121
|
+
const url = `/equation_images/${encodeURIComponent(encodeURIComponent(latex))}?scale=${scale}`;
|
|
128
122
|
|
|
123
|
+
// if I simply create the html string, xsslint fails jenkins
|
|
129
124
|
const img = document.createElement('img');
|
|
130
125
|
img.setAttribute('alt', `LaTeX: ${latex}`);
|
|
131
126
|
img.setAttribute('title', latex);
|
|
@@ -135,41 +130,38 @@ export function insertEquation(editor, latex) {
|
|
|
135
130
|
img.setAttribute('data-ignore-a11y-check', '');
|
|
136
131
|
return insertContent(editor, img.outerHTML);
|
|
137
132
|
}
|
|
133
|
+
|
|
138
134
|
/** * link insertion ** */
|
|
139
|
-
// checks if there's an existing anchor containing the cursor
|
|
140
135
|
|
|
136
|
+
// checks if there's an existing anchor containing the cursor
|
|
141
137
|
function currentLink(editor, link) {
|
|
142
138
|
const cursor = link.selectionDetails && link.selectionDetails.node ? link.selectionDetails.node : editor.selection.getNode(); // This doesn't work in IE 11, but will stop brokeness in other browsers
|
|
143
|
-
|
|
144
139
|
return editor.dom.getParent(cursor, 'a');
|
|
145
|
-
}
|
|
146
|
-
|
|
140
|
+
}
|
|
147
141
|
|
|
142
|
+
// checks if the editor has a current selection (vs. just a cursor position)
|
|
148
143
|
function hasSelection(editor) {
|
|
149
144
|
let selection = editor.selection.getContent();
|
|
150
145
|
selection = editor.dom.decode(selection);
|
|
151
146
|
return !!selection && selection !== '';
|
|
152
147
|
}
|
|
153
|
-
|
|
154
148
|
export function existingContentToLink(editor, link) {
|
|
155
149
|
return !editor.isHidden() && (link && (currentLink(editor, link) || !!link.selectedContent) || hasSelection(editor));
|
|
156
|
-
}
|
|
150
|
+
}
|
|
157
151
|
|
|
152
|
+
// Parses HTML string with support in old browsers because jQuery's parseHTML was added in 1.8.
|
|
158
153
|
function parseHTML(htmlString) {
|
|
159
154
|
const tmp = document.implementation.createHTMLDocument();
|
|
160
155
|
tmp.body.innerHTML = htmlString.trim();
|
|
161
156
|
return tmp.body.children;
|
|
162
157
|
}
|
|
163
|
-
|
|
164
158
|
function selectionIsImg(editor) {
|
|
165
159
|
const selection = editor.selection.getContent();
|
|
166
160
|
return editor.dom.$(parseHTML(selection)).is('img');
|
|
167
161
|
}
|
|
168
|
-
|
|
169
162
|
export function existingContentToLinkIsImg(editor) {
|
|
170
163
|
return !editor.isHidden() && selectionIsImg(editor);
|
|
171
164
|
}
|
|
172
|
-
|
|
173
165
|
function decorateLinkWithEmbed(link) {
|
|
174
166
|
const type = link.embed && link.embed.type;
|
|
175
167
|
link.class = classnames(link.class, {
|
|
@@ -182,34 +174,31 @@ function decorateLinkWithEmbed(link) {
|
|
|
182
174
|
inline_disabled: link.embed && link.embed.disableInlinePreview,
|
|
183
175
|
no_preview: link.embed && link.embed.noPreview
|
|
184
176
|
});
|
|
185
|
-
|
|
186
177
|
if (link.embed.type === 'video' || link.embed.type === 'audio') {
|
|
187
178
|
link.id = `media_comment_${link.embed.id || 'maybe'}`;
|
|
188
179
|
}
|
|
189
180
|
}
|
|
190
|
-
|
|
191
181
|
export function insertLink(editor, link, canvasOrigin) {
|
|
192
|
-
const linkAttrs = {
|
|
182
|
+
const linkAttrs = {
|
|
183
|
+
...link
|
|
193
184
|
};
|
|
194
|
-
|
|
195
185
|
if (linkAttrs.embed) {
|
|
196
186
|
decorateLinkWithEmbed(linkAttrs);
|
|
197
187
|
delete linkAttrs.embed;
|
|
198
188
|
}
|
|
199
|
-
|
|
200
189
|
return insertUndecoratedLink(editor, linkAttrs, canvasOrigin);
|
|
201
190
|
}
|
|
202
|
-
|
|
203
191
|
function textForLink(linkProps, editor, anchorElm) {
|
|
204
192
|
// Some actions (like editing the link text in the link tray)
|
|
205
193
|
// require an explicit update to the link text
|
|
206
|
-
if (linkProps.forceRename) return linkProps.text;
|
|
207
|
-
// the linked file) should use the anchor text if present
|
|
194
|
+
if (linkProps.forceRename) return linkProps.text;
|
|
208
195
|
|
|
196
|
+
// Other actions (link highlighting an existing link and changing
|
|
197
|
+
// the linked file) should use the anchor text if present
|
|
209
198
|
return getAnchorText(editor.selection, anchorElm) || linkProps.text;
|
|
210
|
-
}
|
|
211
|
-
|
|
199
|
+
}
|
|
212
200
|
|
|
201
|
+
// link edit/create logic based on tinymce/plugins/link/plugin.ts
|
|
213
202
|
function insertUndecoratedLink(editor, linkProps, canvasOrigin) {
|
|
214
203
|
const selectedElm = editor.selection.getNode();
|
|
215
204
|
const anchorElm = getAnchorElement(editor, selectedElm);
|
|
@@ -218,8 +207,8 @@ function insertUndecoratedLink(editor, linkProps, canvasOrigin) {
|
|
|
218
207
|
format: 'text'
|
|
219
208
|
});
|
|
220
209
|
const onlyText = isOnlyTextSelected(selectedContent);
|
|
221
|
-
const linkText = onlyText && textForLink(linkProps, editor, anchorElm);
|
|
222
|
-
|
|
210
|
+
const linkText = onlyText && textForLink(linkProps, editor, anchorElm);
|
|
211
|
+
// only keep the props we want as attributes on the <a>
|
|
223
212
|
const linkAttrs = {
|
|
224
213
|
id: linkProps.id,
|
|
225
214
|
href: absoluteToRelativeUrl(cleanUrl(linkProps.href || linkProps.url), canvasOrigin),
|
|
@@ -230,11 +219,9 @@ function insertUndecoratedLink(editor, linkProps, canvasOrigin) {
|
|
|
230
219
|
'data-course-type': linkProps['data-course-type'],
|
|
231
220
|
'data-published': linkProps['data-published']
|
|
232
221
|
};
|
|
233
|
-
|
|
234
222
|
if (linkAttrs.target === '_blank') {
|
|
235
223
|
linkAttrs.rel = 'noopener noreferrer';
|
|
236
224
|
}
|
|
237
|
-
|
|
238
225
|
if (anchorElm && !editor.selection.isCollapsed()) {
|
|
239
226
|
updateLink(editor, anchorElm, linkText, linkAttrs);
|
|
240
227
|
} else if (selectedContent) {
|
|
@@ -246,26 +233,21 @@ function insertUndecoratedLink(editor, linkProps, canvasOrigin) {
|
|
|
246
233
|
} else {
|
|
247
234
|
createLink(editor, selectedElm, linkText, linkAttrs, canvasOrigin);
|
|
248
235
|
}
|
|
249
|
-
|
|
250
236
|
return editor.selection.getEnd(); // this will be the newly created or updated content
|
|
251
237
|
}
|
|
252
|
-
|
|
253
238
|
function getAnchorText(selection, anchorElm) {
|
|
254
239
|
return anchorElm ? anchorElm.innerText : selection.getContent({
|
|
255
240
|
format: 'text'
|
|
256
241
|
});
|
|
257
242
|
}
|
|
258
|
-
|
|
259
243
|
function updateLink(editor, anchorElm, text, linkAttrs) {
|
|
260
244
|
if (text && anchorElm.innerText !== text) {
|
|
261
245
|
anchorElm.innerText = text;
|
|
262
246
|
}
|
|
263
|
-
|
|
264
247
|
editor.dom.setAttribs(anchorElm, linkAttrs);
|
|
265
248
|
editor.selection.select(anchorElm);
|
|
266
249
|
editor.undoManager.add();
|
|
267
250
|
}
|
|
268
|
-
|
|
269
251
|
function createLink(editor, selectedElm, text, linkAttrs, canvasOrigin) {
|
|
270
252
|
if (isImageFigure(selectedElm)) {
|
|
271
253
|
linkImageFigure(editor, selectedElm, linkAttrs, canvasOrigin);
|
|
@@ -277,17 +259,15 @@ function createLink(editor, selectedElm, text, linkAttrs, canvasOrigin) {
|
|
|
277
259
|
editor.execCommand('mceInsertLink', false, linkAttrs);
|
|
278
260
|
}
|
|
279
261
|
}
|
|
280
|
-
|
|
281
262
|
function linkImageFigure(editor, fig, attrs, canvasOrigin) {
|
|
282
263
|
const img = fig.tagName === 'IMG' ? fig : editor.dom.select('img', fig)[0];
|
|
283
|
-
|
|
284
264
|
if (img) {
|
|
285
265
|
const a = renderLink(attrs, img, canvasOrigin);
|
|
286
266
|
img.parentNode.insertBefore(a, img);
|
|
287
267
|
}
|
|
288
268
|
}
|
|
289
|
-
/* ** video insertion ** */
|
|
290
269
|
|
|
270
|
+
/* ** video insertion ** */
|
|
291
271
|
|
|
292
272
|
export function insertVideo(editor, video, canvasOrigin) {
|
|
293
273
|
return insertMedia(editor, video, renderVideo, canvasOrigin);
|
|
@@ -295,30 +275,28 @@ export function insertVideo(editor, video, canvasOrigin) {
|
|
|
295
275
|
export function insertAudio(editor, audio, canvasOrigin) {
|
|
296
276
|
return insertMedia(editor, audio, renderAudio, canvasOrigin);
|
|
297
277
|
}
|
|
298
|
-
|
|
299
278
|
function insertMedia(editor, media, renderMedia, canvasOrigin) {
|
|
300
279
|
const src = mediaPlayerURLFromFile(media, canvasOrigin);
|
|
301
|
-
|
|
302
280
|
if (editor.selection.isCollapsed()) {
|
|
303
281
|
var _result;
|
|
304
|
-
|
|
305
|
-
|
|
282
|
+
let result = insertContent(editor, renderMedia(media, canvasOrigin));
|
|
283
|
+
// for some reason, editor.selection.getEnd() returned from
|
|
306
284
|
// insertContent is parent paragraph when inserting the
|
|
307
285
|
// media iframe. Look for the iframe with the right
|
|
308
286
|
// src attribute. (Aside: tinymce strips the id or data-*
|
|
309
287
|
// attributes from the iframe, that's why we can't look for those)
|
|
288
|
+
result = result.querySelector(`iframe[src="${src}"]`);
|
|
310
289
|
|
|
311
|
-
|
|
290
|
+
// When the iframe is inserted, it doesn't allow the media to play
|
|
312
291
|
// because the wrapping span captures the click events. Setting
|
|
313
292
|
// contentEditable to false disables this behavior.
|
|
314
|
-
|
|
315
293
|
if ((_result = result) !== null && _result !== void 0 && _result.parentElement) {
|
|
316
294
|
editor.dom.setAttrib(result.parentElement, 'contenteditable', false);
|
|
317
295
|
}
|
|
318
|
-
|
|
319
296
|
return result;
|
|
320
297
|
} else {
|
|
321
|
-
return insertLink(editor, {
|
|
298
|
+
return insertLink(editor, {
|
|
299
|
+
...media,
|
|
322
300
|
href: src
|
|
323
301
|
}, canvasOrigin);
|
|
324
302
|
}
|
|
@@ -34,32 +34,30 @@
|
|
|
34
34
|
*/
|
|
35
35
|
export function cleanUrl(input) {
|
|
36
36
|
let url = input;
|
|
37
|
-
|
|
38
37
|
if (input) {
|
|
39
38
|
if (input.match(/@/) && !input.match(/\//) && !input.match(/^mailto:/)) {
|
|
40
39
|
url = 'mailto:' + input;
|
|
41
40
|
} else if (!input.match(/^\w+:\/\//) && !input.match(/^(?:mailto|skype|tel):/) && !input.match(/^\//)) {
|
|
42
41
|
url = 'http://' + input;
|
|
43
42
|
}
|
|
44
|
-
|
|
45
43
|
if (url.indexOf('@') != -1 && url.indexOf('mailto:') != 0 && !url.match(/^http/)) {
|
|
46
44
|
url = 'mailto:' + url;
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
|
-
|
|
50
47
|
return url;
|
|
51
|
-
}
|
|
48
|
+
}
|
|
52
49
|
|
|
50
|
+
// given the current selection, find the containing anchor
|
|
53
51
|
export function getAnchorElement(editor, selectedElm) {
|
|
54
52
|
selectedElm = selectedElm || editor.selection.getNode();
|
|
55
|
-
|
|
56
53
|
if (isImageFigure(selectedElm)) {
|
|
57
54
|
return editor.dom.select('a[href]', selectedElm)[0];
|
|
58
55
|
} else {
|
|
59
56
|
return editor.dom.getParent(selectedElm, 'a[href]');
|
|
60
57
|
}
|
|
61
|
-
}
|
|
58
|
+
}
|
|
62
59
|
|
|
60
|
+
// is the selection only text, or are other elements selected
|
|
63
61
|
const d = document.createElement('div');
|
|
64
62
|
export function isOnlyTextSelected(html) {
|
|
65
63
|
// this regex-based code is lifted from tinymce's link plugin, but I didn't like it.
|
|
@@ -76,10 +74,10 @@ export function isOKToLink(html) {
|
|
|
76
74
|
if (/(?:<(iframe|audio|video)|data-placeholder-for)/.test(html)) {
|
|
77
75
|
return false;
|
|
78
76
|
}
|
|
79
|
-
|
|
80
77
|
return true;
|
|
81
78
|
}
|
|
82
79
|
export function isImageFigure(elm) {
|
|
83
|
-
return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className)
|
|
80
|
+
return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className)
|
|
81
|
+
// (elm.nodeName === 'IMG' || (elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className)))
|
|
84
82
|
;
|
|
85
83
|
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import { renderToStaticMarkup } from 'react-dom/server';
|
|
20
21
|
import { cleanUrl } from './contentInsertionUtils';
|
|
@@ -23,31 +24,31 @@ import { VIDEO_SIZE_DEFAULT, AUDIO_PLAYER_SIZE } from './plugins/instructure_rec
|
|
|
23
24
|
import { mediaPlayerURLFromFile } from './plugins/shared/fileTypeUtils';
|
|
24
25
|
import { prepEmbedSrc, prepLinkedSrc, absoluteToRelativeUrl } from '../common/fileUrl';
|
|
25
26
|
export function renderLink(data, contents, canvasOrigin) {
|
|
26
|
-
const linkAttrs = {
|
|
27
|
+
const linkAttrs = {
|
|
28
|
+
...data
|
|
27
29
|
};
|
|
28
30
|
linkAttrs.href = prepLinkedSrc(linkAttrs.href || linkAttrs.url);
|
|
29
31
|
delete linkAttrs.url;
|
|
30
|
-
|
|
31
32
|
if (linkAttrs.href) {
|
|
32
33
|
linkAttrs.href = absoluteToRelativeUrl(cleanUrl(linkAttrs.href), canvasOrigin);
|
|
33
34
|
}
|
|
34
|
-
|
|
35
35
|
linkAttrs.title = linkAttrs.title || formatMessage('Link');
|
|
36
36
|
const children = contents || linkAttrs.text || linkAttrs.title;
|
|
37
37
|
delete linkAttrs.selectionDetails;
|
|
38
38
|
delete linkAttrs.text;
|
|
39
39
|
linkAttrs.className = linkAttrs.class;
|
|
40
|
-
delete linkAttrs.class;
|
|
40
|
+
delete linkAttrs.class;
|
|
41
41
|
|
|
42
|
+
// renderToStaticMarkup isn't happy with bool attributes
|
|
42
43
|
Object.keys(linkAttrs).forEach(attr => {
|
|
43
44
|
if (typeof linkAttrs[attr] === 'boolean') linkAttrs[attr] = linkAttrs[attr].toString();
|
|
44
45
|
});
|
|
45
|
-
return renderToStaticMarkup(
|
|
46
|
+
return renderToStaticMarkup(/*#__PURE__*/React.createElement("a", linkAttrs, children));
|
|
46
47
|
}
|
|
47
48
|
export function renderLinkedImage(linkElem, image, canvasOrigin) {
|
|
48
49
|
const linkHref = linkElem.getAttribute('href');
|
|
49
50
|
image.href = prepEmbedSrc(image.href, canvasOrigin);
|
|
50
|
-
return renderToStaticMarkup(
|
|
51
|
+
return renderToStaticMarkup(/*#__PURE__*/React.createElement("a", {
|
|
51
52
|
href: absoluteToRelativeUrl(linkHref, canvasOrigin),
|
|
52
53
|
"data-mce-href": linkHref
|
|
53
54
|
}, constructJSXImageElement(image, canvasOrigin, {
|
|
@@ -69,14 +70,11 @@ export function constructJSXImageElement(image, canvasOrigin) {
|
|
|
69
70
|
} = image;
|
|
70
71
|
const imageSrc = absoluteToRelativeUrl(href || url || src, canvasOrigin);
|
|
71
72
|
let altText = alt_text || title || display_name || '';
|
|
72
|
-
|
|
73
73
|
if (isDecorativeImage) {
|
|
74
74
|
altText = '';
|
|
75
75
|
otherAttributes.role = 'presentation';
|
|
76
76
|
}
|
|
77
|
-
|
|
78
77
|
delete otherAttributes.contextType; // react doesn't like these
|
|
79
|
-
|
|
80
78
|
delete otherAttributes.contextId;
|
|
81
79
|
const ret = /*#__PURE__*/React.createElement("img", Object.assign({
|
|
82
80
|
alt: altText,
|
|
@@ -84,7 +82,6 @@ export function constructJSXImageElement(image, canvasOrigin) {
|
|
|
84
82
|
width: image.width,
|
|
85
83
|
height: image.height
|
|
86
84
|
}, otherAttributes));
|
|
87
|
-
|
|
88
85
|
if (link && !opts.doNotLink) {
|
|
89
86
|
return /*#__PURE__*/React.createElement("a", {
|
|
90
87
|
href: absoluteToRelativeUrl(link, canvasOrigin),
|
|
@@ -92,7 +89,6 @@ export function constructJSXImageElement(image, canvasOrigin) {
|
|
|
92
89
|
rel: "noopener noreferrer"
|
|
93
90
|
}, ret);
|
|
94
91
|
}
|
|
95
|
-
|
|
96
92
|
return ret;
|
|
97
93
|
}
|
|
98
94
|
export function renderImage(image, canvasOrigin, opts) {
|
|
@@ -133,7 +129,6 @@ export function getMediaId(media) {
|
|
|
133
129
|
}
|
|
134
130
|
export function updateImage(editor, img, attrs) {
|
|
135
131
|
var _editor$rceWrapper;
|
|
136
|
-
|
|
137
132
|
// Workaround: When passing empty string to editor.dom.setAttribs it removes the attribute
|
|
138
133
|
img.setAttribute('alt', attrs.altText);
|
|
139
134
|
editor.dom.setAttribs(img, {
|
package/es/rce/customEvents.js
CHANGED
package/es/rce/editorLanguage.js
CHANGED
|
@@ -15,8 +15,17 @@
|
|
|
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
|
// if a locale is absent, we don't expect to receive it from canvas, but we'll
|
|
19
20
|
// treat it the same as how we explicitly use english for Maori.
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Mapping of locales to their corresponding TinyMCE language codes.
|
|
24
|
+
* If a locale is absent, we don't expect to receive it from Canvas,
|
|
25
|
+
* but we'll treat it the same as how we explicitly use English for Maori.
|
|
26
|
+
*
|
|
27
|
+
* @type {Object<string, string | undefined>}
|
|
28
|
+
*/
|
|
20
29
|
const mapping = {
|
|
21
30
|
ar: 'ar_SA',
|
|
22
31
|
bg: 'bg_BG',
|
|
@@ -26,7 +35,7 @@ const mapping = {
|
|
|
26
35
|
da: 'da',
|
|
27
36
|
de: 'de',
|
|
28
37
|
el: 'el',
|
|
29
|
-
// returning undefined
|
|
38
|
+
// returning undefined tells tinymce to use its default (en) strings
|
|
30
39
|
en: undefined,
|
|
31
40
|
// tinymce doesn't have Australian strings, so just pretend it's en-GB
|
|
32
41
|
'en-AU': 'en_GB',
|
|
@@ -76,28 +85,31 @@ const mapping = {
|
|
|
76
85
|
'zh-HK': 'zh_TW',
|
|
77
86
|
'zh-Hans': 'zh_CN',
|
|
78
87
|
'zh-Hant': 'zh_TW'
|
|
79
|
-
};
|
|
80
|
-
// add special casing or null interpretation in the future
|
|
88
|
+
};
|
|
81
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Function to return the corresponding TinyMCE language code for a given locale.
|
|
92
|
+
* If the locale is not provided, it will return the default language (English).
|
|
93
|
+
* If the locale contains underscores, they are replaced with hyphens for compatibility.
|
|
94
|
+
* If the locale contains a custom variant (e.g., -x-), the base language is used for mapping.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} [locale] - The locale string.
|
|
97
|
+
* @returns {string | undefined} The corresponding TinyMCE language code, or undefined if not found.
|
|
98
|
+
*/
|
|
82
99
|
function editorLanguage(locale) {
|
|
83
100
|
if (!locale) {
|
|
84
101
|
return mapping.en;
|
|
85
102
|
}
|
|
86
|
-
|
|
87
103
|
if (locale.match('_')) {
|
|
88
104
|
locale = locale.replace('_', '-');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
105
|
+
}
|
|
106
|
+
// tinymce won't know about custom locales, use the base one for mapping
|
|
92
107
|
if (locale.match('-x-')) {
|
|
93
108
|
locale = locale.split('-x-')[0];
|
|
94
109
|
}
|
|
95
|
-
|
|
96
110
|
if (mapping[locale]) {
|
|
97
111
|
return mapping[locale];
|
|
98
112
|
}
|
|
99
|
-
|
|
100
113
|
return mapping[locale.split('-')[0]];
|
|
101
114
|
}
|
|
102
|
-
|
|
103
115
|
module.exports = editorLanguage;
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
import offset from 'bloody-offset'; // the editor's iframe
|
|
19
18
|
|
|
19
|
+
import offset from 'bloody-offset';
|
|
20
|
+
|
|
21
|
+
// the editor's iframe
|
|
20
22
|
function editorIframe(editor) {
|
|
21
23
|
return editor.getContainer().querySelector('iframe');
|
|
22
24
|
}
|
|
23
|
-
|
|
24
25
|
function box(el) {
|
|
25
26
|
const b = el.getBoundingClientRect();
|
|
26
27
|
return {
|
|
@@ -29,12 +30,12 @@ function box(el) {
|
|
|
29
30
|
width: b.right - b.left,
|
|
30
31
|
height: b.bottom - b.top
|
|
31
32
|
};
|
|
32
|
-
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//
|
|
33
36
|
// the shape of the target's sillhouette on the editor's container. have to
|
|
34
37
|
// subtract out the iframe's scroll since the target's position is relative to
|
|
35
38
|
// the iframe's _document_, not its visible window.
|
|
36
|
-
|
|
37
|
-
|
|
38
39
|
export default function indicatorRegion(editor, target) {
|
|
39
40
|
let offsetFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : offset;
|
|
40
41
|
const iframe = editorIframe(editor);
|
|
@@ -15,10 +15,12 @@
|
|
|
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 { getLocaleList } from '../getTranslations';
|
|
20
|
+
|
|
21
|
+
// keys = "qualified" locales old canvas sent, values = corresponding standard
|
|
19
22
|
// locales that canvas now sends. old locales absent from this mapping (e.g.
|
|
20
23
|
// pt-BR) didn't change.
|
|
21
|
-
|
|
22
24
|
const mapping = {
|
|
23
25
|
fa: 'fa-IR',
|
|
24
26
|
uk: 'uk-UA',
|
|
@@ -27,7 +29,6 @@ const mapping = {
|
|
|
27
29
|
};
|
|
28
30
|
export default function normalizeLocale(locale) {
|
|
29
31
|
const recognized = getLocaleList();
|
|
30
|
-
|
|
31
32
|
if (!locale) {
|
|
32
33
|
// default to english
|
|
33
34
|
return 'en';
|
|
@@ -42,6 +43,7 @@ export default function normalizeLocale(locale) {
|
|
|
42
43
|
locale = locale.split('-x-')[0];
|
|
43
44
|
return normalizeLocale(locale);
|
|
44
45
|
} else if (recognized.indexOf(locale.split('-')[0]) >= 0) {
|
|
46
|
+
// pass through base locale if recognized
|
|
45
47
|
return locale.split('-')[0];
|
|
46
48
|
} else {
|
|
47
49
|
// default to english for unrecognized locales
|
package/es/rce/normalizeProps.js
CHANGED
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import wrapInitCb from './wrapInitCb';
|
|
19
20
|
export default function (props, tinymce) {
|
|
20
21
|
const initialEditorOptions = props.editorOptions(tinymce);
|
|
21
22
|
const editorOptions = wrapInitCb(props.mirroredAttrs, initialEditorOptions);
|
|
22
|
-
return {
|
|
23
|
+
return {
|
|
24
|
+
// other props, including overrides
|
|
23
25
|
...props,
|
|
24
26
|
// enforced values, in addition to props and cannot be overridden by
|
|
25
27
|
// props
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
3
|
*
|
|
@@ -17,10 +15,14 @@
|
|
|
17
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
17
|
*/
|
|
20
|
-
|
|
18
|
+
|
|
19
|
+
import { IconArrowOpenDownLine, IconAttachMediaLine, IconBoldLine, IconBulletListAlphaLine, IconBulletListCircleOutlineLine, IconBulletListLine, IconBulletListRomanLine, IconBulletListSquareLine, IconClearTextFormattingLine, IconDocumentLine, IconExitFullScreenLine, IconFullScreenLine, IconImageLine, IconIndentLine, IconItalicLine, IconLinkLine, IconLtiLine, IconNumberedListLine, IconOutdentLine, IconRemoveLinkLine, IconStrikethroughLine, IconTextCenteredLine, IconTextDirectionLtrLine, IconTextDirectionRtlLine, IconTextEndLine, IconTextStartLine, IconTextSubscriptLine, IconTextSuperscriptLine, IconUnderlineLine
|
|
20
|
+
// @ts-expect-error
|
|
21
|
+
} from '@instructure/ui-icons/es/svg';
|
|
21
22
|
import tinymce from 'tinymce';
|
|
22
23
|
tinymce.PluginManager.add('instructure-ui-icons', function (editor) {
|
|
23
24
|
// the keys here are what tinymce calls it. the values are the svgs from instUI
|
|
25
|
+
|
|
24
26
|
// there are few things here that are commented out that are things that we
|
|
25
27
|
// might want to have our own icon for but one doesn't exist in @instructure/ui-icons
|
|
26
28
|
const icons = {
|
|
@@ -55,6 +57,7 @@ tinymce.PluginManager.add('instructure-ui-icons', function (editor) {
|
|
|
55
57
|
// that tinyMCE uses that we'd want to match our table icon. So unless we get instUI versions of all
|
|
56
58
|
// those too, it probably makes sense to just use TinyMCE's for everything table related.
|
|
57
59
|
// table: IconTableLine,
|
|
60
|
+
|
|
58
61
|
// The `tox-icon-*` path ids on these 2 are important. It is what tinyMCE
|
|
59
62
|
// looks for to update the color when you select a new one
|
|
60
63
|
'text-color': {
|
|
@@ -75,6 +78,20 @@ tinymce.PluginManager.add('instructure-ui-icons', function (editor) {
|
|
|
75
78
|
</g>
|
|
76
79
|
</svg>`
|
|
77
80
|
},
|
|
81
|
+
// the new color UI
|
|
82
|
+
color: {
|
|
83
|
+
src: `<svg data-id="color-button" width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
84
|
+
<g clip-path="url(#clip0_13_7929)">
|
|
85
|
+
<path d="M5.52715 0L4.48118 1.01914L5.82475 2.33149L0.672221 7.36027C-0.224074 8.23479 -0.224074 9.6186 0.672221 10.4931L0.74662 10.5671L5.45129 15.1575C6.34759 16.032 7.7673 16.032 8.6636 15.1575L14.3398 9.61917L14.8636 9.1096L7.61763 2.0397L7.02097 1.45754L6.87072 1.31093L5.52715 0ZM6.87072 3.35205L12.7716 9.1096L11.129 10.7123H2.9859L1.71673 9.47398C1.41797 9.18248 1.41797 8.67234 1.71673 8.38083L6.87072 3.35205ZM15.7593 11.6603L15.1611 12.5342C15.1611 12.5342 14.788 13.1167 14.3398 13.7726C14.1158 14.137 13.967 14.4288 13.8176 14.7931C13.6682 15.1575 13.5185 15.3764 13.5185 15.8137C13.5185 16.9797 14.5642 18 15.7593 18C16.9543 18 18 16.9797 18 15.8137C18 15.3764 17.8503 15.0849 17.7009 14.7205C17.5516 14.3562 17.3281 13.9915 17.1787 13.7C16.8052 13.0441 16.3574 12.4616 16.3574 12.4616L15.7593 11.6603Z" fill="currentColor"/>
|
|
86
|
+
</g>
|
|
87
|
+
<defs>
|
|
88
|
+
<clipPath id="clip0_13_7929">
|
|
89
|
+
<rect width="18" height="18" fill="white"/>
|
|
90
|
+
</clipPath>
|
|
91
|
+
</defs>
|
|
92
|
+
</svg>
|
|
93
|
+
`
|
|
94
|
+
},
|
|
78
95
|
unlink: IconRemoveLinkLine,
|
|
79
96
|
'unordered-list': IconBulletListLine,
|
|
80
97
|
ltr: IconTextDirectionLtrLine,
|
|
@@ -117,6 +134,7 @@ tinymce.PluginManager.add('instructure-ui-icons', function (editor) {
|
|
|
117
134
|
}
|
|
118
135
|
};
|
|
119
136
|
Object.keys(icons).forEach(key => {
|
|
137
|
+
// @ts-expect-error
|
|
120
138
|
editor.ui.registry.addIcon(key, icons[key].src);
|
|
121
139
|
});
|
|
122
140
|
});
|