@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
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
* Copyright (C) 2019 - present Instructure, Inc.
|
|
5
3
|
*
|
|
@@ -17,10 +15,19 @@
|
|
|
17
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
18
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
17
|
*/
|
|
18
|
+
|
|
20
19
|
import formatMessage from '../../../../format-message';
|
|
21
20
|
import { typedKeyDict } from '../../../../util/TypedDict';
|
|
22
21
|
import { listStyleForSelectionOfEditor } from '../core/ListUtils';
|
|
23
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Supported list style types by the RCE
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* RCE-specific information about a list style type
|
|
29
|
+
*/
|
|
30
|
+
|
|
24
31
|
/**
|
|
25
32
|
* List of list styles supported by the RCE. These will ultimately appear in the toolbar as buttons under the main
|
|
26
33
|
* list button.
|
|
@@ -57,39 +64,39 @@ const listStyleInfos = typedKeyDict({
|
|
|
57
64
|
getTooltipText: () => formatMessage('uppercase Roman numeral ordered list')
|
|
58
65
|
}
|
|
59
66
|
}, 'listStyleType');
|
|
67
|
+
|
|
60
68
|
/**
|
|
61
69
|
* Defines the default `list-style-type` infos for the different list element types.
|
|
62
70
|
*/
|
|
63
|
-
|
|
64
71
|
const defaultStyleInfoForListType = {
|
|
65
72
|
UL: listStyleInfos.byKey.disc,
|
|
66
73
|
OL: listStyleInfos.byKey.decimal
|
|
67
74
|
};
|
|
75
|
+
|
|
68
76
|
/**
|
|
69
77
|
* Determines the inner-most list type for the selection in the given Editor.
|
|
70
78
|
*/
|
|
71
|
-
|
|
72
79
|
function listStyleInfoForSelectionOfEditor(editor) {
|
|
73
80
|
const selectedStyleType = listStyleForSelectionOfEditor(editor);
|
|
74
|
-
if (!selectedStyleType) return null;
|
|
81
|
+
if (!selectedStyleType) return null;
|
|
75
82
|
|
|
83
|
+
// Prefer to use `list-style-type`-based type infos.
|
|
76
84
|
if (selectedStyleType.listStyleType) {
|
|
85
|
+
// @ts-expect-error
|
|
77
86
|
const fromStyleType = listStyleInfos.byKey[selectedStyleType.listStyleType];
|
|
78
87
|
if (fromStyleType) return fromStyleType;
|
|
79
|
-
}
|
|
80
|
-
|
|
88
|
+
}
|
|
81
89
|
|
|
90
|
+
// Default to style based on the list element type
|
|
82
91
|
return defaultStyleInfoForListType[selectedStyleType.listType];
|
|
83
92
|
}
|
|
93
|
+
|
|
84
94
|
/**
|
|
85
95
|
* Get the button label.
|
|
86
96
|
*
|
|
87
97
|
* Note: Needs to be a function because translation files aren't loaded when top-level code runs.
|
|
88
98
|
*/
|
|
89
|
-
|
|
90
|
-
|
|
91
99
|
const getButtonLabel = () => formatMessage('Ordered and Unordered Lists');
|
|
92
|
-
|
|
93
100
|
export default function register(editor) {
|
|
94
101
|
editor.ui.registry.addSplitButton('bullist', {
|
|
95
102
|
tooltip: getButtonLabel(),
|
|
@@ -104,12 +111,14 @@ export default function register(editor) {
|
|
|
104
111
|
}))),
|
|
105
112
|
onAction: () => {
|
|
106
113
|
var _listStyleInfoForSele;
|
|
107
|
-
|
|
108
114
|
return editor.execCommand(((_listStyleInfoForSele = listStyleInfoForSelectionOfEditor(editor)) === null || _listStyleInfoForSele === void 0 ? void 0 : _listStyleInfoForSele.listType) === 'OL' ? 'InsertOrderedList' : 'InsertUnorderedList');
|
|
109
115
|
},
|
|
110
116
|
onItemAction: (splitButtonApi, value) => {
|
|
117
|
+
// @ts-expect-error
|
|
111
118
|
const desiredListStyleInfo = listStyleInfos.byKey[value] || defaultStyleInfoForListType.UL;
|
|
112
|
-
const currentListStyleInfo = listStyleInfoForSelectionOfEditor(editor);
|
|
119
|
+
const currentListStyleInfo = listStyleInfoForSelectionOfEditor(editor);
|
|
120
|
+
|
|
121
|
+
// When the user clicks the list button that matches the current list style in the selection,
|
|
113
122
|
// we want to interpret that as un-list-ifying the selection
|
|
114
123
|
|
|
115
124
|
if ((currentListStyleInfo === null || currentListStyleInfo === void 0 ? void 0 : currentListStyleInfo.listStyleType) !== desiredListStyleInfo.listStyleType) {
|
|
@@ -122,21 +131,19 @@ export default function register(editor) {
|
|
|
122
131
|
},
|
|
123
132
|
select: value => {
|
|
124
133
|
var _listStyleInfoForSele2;
|
|
125
|
-
|
|
126
134
|
return ((_listStyleInfoForSele2 = listStyleInfoForSelectionOfEditor(editor)) === null || _listStyleInfoForSele2 === void 0 ? void 0 : _listStyleInfoForSele2.listStyleType) === value;
|
|
127
135
|
},
|
|
128
136
|
onSetup: api => {
|
|
129
137
|
// Handle updating the icon on the toolbar based on
|
|
130
138
|
// the type of list the user's selection is currently within
|
|
139
|
+
|
|
131
140
|
const $iconSvgContainer = editor.$(`.tox-split-button[aria-label="${getButtonLabel()}"] .tox-icon`, document);
|
|
132
141
|
const allIcons = editor.ui.registry.getAll().icons;
|
|
133
|
-
|
|
134
142
|
const nodeChangeHandler = () => {
|
|
135
143
|
const activeListType = listStyleInfoForSelectionOfEditor(editor);
|
|
136
144
|
api.setActive(!!activeListType);
|
|
137
145
|
$iconSvgContainer.html(allIcons[(activeListType === null || activeListType === void 0 ? void 0 : activeListType.icon) || 'list-bull-default']);
|
|
138
146
|
};
|
|
139
|
-
|
|
140
147
|
nodeChangeHandler();
|
|
141
148
|
editor.on('NodeChange', nodeChangeHandler);
|
|
142
149
|
return () => editor.off('NodeChange', nodeChangeHandler);
|
|
@@ -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 formatMessage from '../../../../format-message';
|
|
19
20
|
import { toolbarIconHelperFor } from '../../../../util/tinymce-plugin-util';
|
|
20
21
|
export default function register(editor) {
|
|
@@ -41,13 +42,11 @@ export default function register(editor) {
|
|
|
41
42
|
}))),
|
|
42
43
|
onSetup: api => {
|
|
43
44
|
const iconHelper = toolbarIconHelperFor(editor, buttonLabel);
|
|
44
|
-
|
|
45
45
|
function nodeChangeHandler() {
|
|
46
46
|
const activeStyleInfo = styleInfos.find(b => editor.formatter.match(b.icon));
|
|
47
47
|
api.setActive(!!activeStyleInfo);
|
|
48
48
|
iconHelper.updateIcon((activeStyleInfo === null || activeStyleInfo === void 0 ? void 0 : activeStyleInfo.icon) || defaultIcon);
|
|
49
49
|
}
|
|
50
|
-
|
|
51
50
|
nodeChangeHandler();
|
|
52
51
|
editor.on('NodeChange', nodeChangeHandler);
|
|
53
52
|
return () => editor.off('NodeChange', nodeChangeHandler);
|
|
@@ -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 doFileUpload from '../shared/Upload/doFileUpload';
|
|
19
20
|
export default function (ed, document) {
|
|
20
21
|
return doFileUpload(ed, document, {
|
|
@@ -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, { useRef } from 'react';
|
|
19
20
|
import { func, shape, string, oneOf } from 'prop-types';
|
|
20
21
|
import { contentTrayDocumentShape } from '../../shared/fileShape';
|
|
@@ -23,23 +24,18 @@ import { Text } from '@instructure/ui-text';
|
|
|
23
24
|
import { View } from '@instructure/ui-view';
|
|
24
25
|
import Link from './Link';
|
|
25
26
|
import { LoadMoreButton, LoadingIndicator, LoadingStatus, useIncrementalLoading } from '../../../../common/incremental-loading';
|
|
26
|
-
|
|
27
27
|
function hasFiles(documents) {
|
|
28
28
|
return documents.files.length > 0;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
30
|
function isEmpty(documents) {
|
|
32
31
|
return !hasFiles(documents) && !documents.hasMore && !documents.isLoading;
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
function renderLinks(files, handleClick, lastItemRef) {
|
|
36
34
|
return files.map((f, index) => {
|
|
37
35
|
let focusRef = null;
|
|
38
|
-
|
|
39
36
|
if (index === files.length - 1) {
|
|
40
37
|
focusRef = lastItemRef;
|
|
41
38
|
}
|
|
42
|
-
|
|
43
39
|
return /*#__PURE__*/React.createElement(Link, Object.assign({
|
|
44
40
|
key: f.id
|
|
45
41
|
}, f, {
|
|
@@ -48,7 +44,6 @@ function renderLinks(files, handleClick, lastItemRef) {
|
|
|
48
44
|
}));
|
|
49
45
|
});
|
|
50
46
|
}
|
|
51
|
-
|
|
52
47
|
function renderLoadingError(_error) {
|
|
53
48
|
return /*#__PURE__*/React.createElement(View, {
|
|
54
49
|
as: "div",
|
|
@@ -58,7 +53,6 @@ function renderLoadingError(_error) {
|
|
|
58
53
|
color: "danger"
|
|
59
54
|
}, formatMessage('Loading failed.')));
|
|
60
55
|
}
|
|
61
|
-
|
|
62
56
|
export default function DocumentsPanel(props) {
|
|
63
57
|
const {
|
|
64
58
|
fetchInitialDocs,
|
|
@@ -86,11 +80,9 @@ export default function DocumentsPanel(props) {
|
|
|
86
80
|
sortBy,
|
|
87
81
|
searchString
|
|
88
82
|
});
|
|
89
|
-
|
|
90
83
|
const handleDocClick = file => {
|
|
91
84
|
props.onLinkClick(file);
|
|
92
85
|
};
|
|
93
|
-
|
|
94
86
|
return /*#__PURE__*/React.createElement(View, {
|
|
95
87
|
as: "div",
|
|
96
88
|
"data-testid": "instructure_links-DocumentsPanel"
|
|
@@ -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, { useState } from 'react';
|
|
19
20
|
import { func, instanceOf, shape } from 'prop-types';
|
|
20
21
|
import { fileOrMediaObjectShape } from '../../shared/fileShape';
|
|
@@ -33,7 +34,6 @@ import { applyTimezoneOffsetToDate } from '../../shared/dateUtils';
|
|
|
33
34
|
import RCEGlobals from '../../../RCEGlobals';
|
|
34
35
|
export default function Link(props) {
|
|
35
36
|
var _RCEGlobals$getConfig;
|
|
36
|
-
|
|
37
37
|
const [isHovering, setIsHovering] = useState(false);
|
|
38
38
|
const {
|
|
39
39
|
filename,
|
|
@@ -46,12 +46,11 @@ export default function Link(props) {
|
|
|
46
46
|
disabledMessage
|
|
47
47
|
} = props;
|
|
48
48
|
const Icon = getIconFromType(content_type);
|
|
49
|
-
const color = published ? 'success' : 'primary';
|
|
50
|
-
|
|
49
|
+
const color = published ? 'success' : 'primary';
|
|
50
|
+
// Uses user locale and timezone
|
|
51
51
|
const configuredTimezone = (_RCEGlobals$getConfig = RCEGlobals.getConfig()) === null || _RCEGlobals$getConfig === void 0 ? void 0 : _RCEGlobals$getConfig.timezone;
|
|
52
52
|
const dateString = formatMessage.date(applyTimezoneOffsetToDate(date, configuredTimezone), 'long');
|
|
53
53
|
const publishedMsg = published ? formatMessage('published') : formatMessage('unpublished');
|
|
54
|
-
|
|
55
54
|
function linkAttrsFromDoc() {
|
|
56
55
|
const canPreview = isPreviewable(props.content_type);
|
|
57
56
|
const clazz = classnames('instructure_file_link', {
|
|
@@ -73,44 +72,35 @@ export default function Link(props) {
|
|
|
73
72
|
embedded_iframe_url: props.embedded_iframe_url,
|
|
74
73
|
media_entry_id: props.media_entry_id
|
|
75
74
|
};
|
|
76
|
-
|
|
77
75
|
if (canPreview) {
|
|
78
76
|
attrs['data-canvas-previewable'] = true;
|
|
79
77
|
}
|
|
80
|
-
|
|
81
78
|
return attrs;
|
|
82
79
|
}
|
|
83
|
-
|
|
84
80
|
function handleLinkClick(e) {
|
|
85
81
|
e.preventDefault();
|
|
86
82
|
props.onClick(linkAttrsFromDoc());
|
|
87
83
|
}
|
|
88
|
-
|
|
89
84
|
function handleLinkKey(e) {
|
|
90
85
|
// press the button on enter or space
|
|
91
86
|
if (e.keyCode === 13 || e.keyCode === 32) {
|
|
92
87
|
handleLinkClick(e);
|
|
93
88
|
}
|
|
94
89
|
}
|
|
95
|
-
|
|
96
90
|
function handleDragStart(e) {
|
|
97
91
|
const linkAttrs = linkAttrsFromDoc();
|
|
98
92
|
dragHtml(e, renderLinkHtml(linkAttrs, linkAttrs.text));
|
|
99
93
|
}
|
|
100
|
-
|
|
101
94
|
function handleDragEnd(_e) {
|
|
102
95
|
document.body.click();
|
|
103
96
|
}
|
|
104
|
-
|
|
105
97
|
function handleHover(e) {
|
|
106
98
|
setIsHovering(e.type === 'mouseenter');
|
|
107
99
|
}
|
|
108
|
-
|
|
109
100
|
function buildCallback(callback) {
|
|
110
101
|
if (disabled) return;
|
|
111
102
|
return callback;
|
|
112
103
|
}
|
|
113
|
-
|
|
114
104
|
function dateOrMessage(str) {
|
|
115
105
|
if (disabled && disabledMessage) {
|
|
116
106
|
return /*#__PURE__*/React.createElement(View, {
|
|
@@ -121,27 +111,22 @@ export default function Link(props) {
|
|
|
121
111
|
fontStyle: "italic"
|
|
122
112
|
}, disabledMessage)));
|
|
123
113
|
}
|
|
124
|
-
|
|
125
114
|
if (str) {
|
|
126
115
|
return /*#__PURE__*/React.createElement(View, {
|
|
127
116
|
as: "div"
|
|
128
117
|
}, str);
|
|
129
118
|
}
|
|
130
119
|
}
|
|
131
|
-
|
|
132
120
|
function textStyles() {
|
|
133
121
|
if (disabled) return {
|
|
134
122
|
color: 'gray'
|
|
135
123
|
};
|
|
136
124
|
return {};
|
|
137
125
|
}
|
|
138
|
-
|
|
139
126
|
let elementRef = null;
|
|
140
|
-
|
|
141
127
|
if (props.focusRef) {
|
|
142
128
|
elementRef = ref => props.focusRef.current = ref;
|
|
143
129
|
}
|
|
144
|
-
|
|
145
130
|
return /*#__PURE__*/React.createElement("div", {
|
|
146
131
|
"data-testid": "instructure_links-Link",
|
|
147
132
|
draggable: true,
|
|
@@ -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 formatMessage from '../../../format-message';
|
|
19
20
|
import clickCallback from './clickCallback';
|
|
20
21
|
import bridge from '../../../bridge';
|
|
@@ -23,14 +24,12 @@ import tinymce from 'tinymce';
|
|
|
23
24
|
const COURSE_PLUGIN_KEY = 'course_documents';
|
|
24
25
|
const USER_PLUGIN_KEY = 'user_documents';
|
|
25
26
|
const GROUP_PLUGIN_KEY = 'group_documents';
|
|
26
|
-
|
|
27
27
|
function getMenuItems(ed) {
|
|
28
28
|
const contextType = ed.settings.canvas_rce_user_context.type;
|
|
29
29
|
const items = [{
|
|
30
30
|
text: formatMessage('Upload Document'),
|
|
31
31
|
value: 'instructure_upload_document'
|
|
32
32
|
}];
|
|
33
|
-
|
|
34
33
|
if (contextType === 'course') {
|
|
35
34
|
items.push({
|
|
36
35
|
text: formatMessage('Course Documents'),
|
|
@@ -42,45 +41,41 @@ function getMenuItems(ed) {
|
|
|
42
41
|
value: 'instructure_group_document'
|
|
43
42
|
});
|
|
44
43
|
}
|
|
45
|
-
|
|
46
44
|
items.push({
|
|
47
45
|
text: formatMessage('User Documents'),
|
|
48
46
|
value: 'instructure_user_document'
|
|
49
47
|
});
|
|
50
48
|
return items;
|
|
51
49
|
}
|
|
52
|
-
|
|
53
50
|
function doMenuItem(ed, value) {
|
|
54
51
|
switch (value) {
|
|
55
52
|
case 'instructure_upload_document':
|
|
56
53
|
ed.execCommand('mceInstructureDocuments');
|
|
57
54
|
break;
|
|
58
|
-
|
|
59
55
|
case 'instructure_course_document':
|
|
60
56
|
ed.focus(true);
|
|
61
57
|
ed.execCommand('instructureTrayForDocuments', false, COURSE_PLUGIN_KEY);
|
|
62
58
|
break;
|
|
63
|
-
|
|
64
59
|
case 'instructure_user_document':
|
|
65
60
|
ed.focus(true);
|
|
66
61
|
ed.execCommand('instructureTrayForDocuments', false, USER_PLUGIN_KEY);
|
|
67
62
|
break;
|
|
68
|
-
|
|
69
63
|
case 'instructure_group_document':
|
|
70
64
|
ed.focus(true);
|
|
71
65
|
ed.execCommand('instructureTrayForDocuments', false, GROUP_PLUGIN_KEY);
|
|
72
66
|
break;
|
|
73
67
|
}
|
|
74
|
-
}
|
|
75
|
-
|
|
68
|
+
}
|
|
76
69
|
|
|
70
|
+
// Register plugin
|
|
77
71
|
tinymce.PluginManager.add('instructure_documents', function (ed) {
|
|
78
72
|
// Register commands
|
|
79
73
|
ed.addCommand('mceInstructureDocuments', () => clickCallback(ed, document));
|
|
80
74
|
ed.addCommand('instructureTrayForDocuments', (ui, plugin_key) => {
|
|
81
75
|
bridge.showTrayForPlugin(plugin_key, ed.id);
|
|
82
|
-
});
|
|
76
|
+
});
|
|
83
77
|
|
|
78
|
+
// Register menu items
|
|
84
79
|
ed.ui.registry.addNestedMenuItem('instructure_document', {
|
|
85
80
|
text: formatMessage('Document'),
|
|
86
81
|
icon: 'document',
|
|
@@ -95,8 +90,9 @@ tinymce.PluginManager.add('instructure_documents', function (ed) {
|
|
|
95
90
|
}
|
|
96
91
|
};
|
|
97
92
|
})
|
|
98
|
-
});
|
|
93
|
+
});
|
|
99
94
|
|
|
95
|
+
// Register toolbar button
|
|
100
96
|
ed.ui.registry.addMenuButton('instructure_documents', {
|
|
101
97
|
tooltip: formatMessage('Documents'),
|
|
102
98
|
icon: 'document',
|
|
@@ -106,18 +102,15 @@ tinymce.PluginManager.add('instructure_documents', function (ed) {
|
|
|
106
102
|
value: item.value,
|
|
107
103
|
onAction: () => doMenuItem(ed, item.value)
|
|
108
104
|
}))),
|
|
109
|
-
|
|
110
105
|
onSetup(api) {
|
|
111
106
|
function handleNodeChange() {
|
|
112
107
|
api.setDisabled(!isOKToLink(ed.selection.getContent()));
|
|
113
108
|
}
|
|
114
|
-
|
|
115
109
|
setTimeout(handleNodeChange);
|
|
116
110
|
ed.on('NodeChange', handleNodeChange);
|
|
117
111
|
return () => {
|
|
118
112
|
ed.off('NodeChange', handleNodeChange);
|
|
119
113
|
};
|
|
120
114
|
}
|
|
121
|
-
|
|
122
115
|
});
|
|
123
116
|
});
|
|
@@ -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 { memoize } from 'lodash';
|
|
20
|
+
|
|
21
|
+
// These commands all work fine with MathJax but either don't work, don't work well
|
|
19
22
|
// (bad UX for editing), or look strange when rendered by Mathlive. Add new ones
|
|
20
23
|
// here if you discover anything else or customers report unexpected experiences.
|
|
21
|
-
|
|
22
24
|
const advancedOnlyCommands = ['begin', 'end', 'cases', 'cr', 'rm', 'text', 'hbox', 'mbox', 'unicode', 'cal', 'frak', 'it', 'scr', 'sf', '#', 'def', 'newcommand', 'operatorname', 'DeclareMathOperator', 'displaystyle', 'textstyle', 'scriptstyle', 'scriptscriptstyle', 'displaylines', 'abovewithdelims', 'array', 'bmatrix', 'buildrel', 'ddddot', 'dddot', 'eqalign', 'eqalignno', 'gcd', 'genfrac', 'hdashline', 'hfil', 'hfill', 'hfilll', 'hline', 'idotsint', 'iiiint', 'injlim', 'kern', 'label', 'LaTeX', 'leftroot', 'lgroup', 'lower', 'mathchoice', 'mathfrak', 'matrix', 'mit', 'mkern', 'mspace', 'negmedspace', 'negthickspace', 'negthinspace', 'newline', 'nobreakspace', 'oldstyle', 'overset', 'pmatrix', 'raise', 'rgroup', 'rule', 'Rule', 'skew', 'space', 'tag', 'TeX', 'underbrace', 'uproot', 'varinjlim', 'varliminf', 'varlimsup', 'varprojlim', 'vcenter', 'vmatrix'];
|
|
23
25
|
const advancedOnlyRegex = new RegExp(advancedOnlyCommands.join('|'), 'm');
|
|
24
26
|
const containsAdvancedSyntax = memoize(latex => advancedOnlyRegex.test(latex));
|
|
@@ -15,8 +15,8 @@
|
|
|
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
|
-
export const STORAGE_KEY = 'NEE_should_reopen_advanced';
|
|
19
18
|
|
|
19
|
+
export const STORAGE_KEY = 'NEE_should_reopen_advanced';
|
|
20
20
|
function wrapInErrorHandling(func) {
|
|
21
21
|
try {
|
|
22
22
|
return {
|
|
@@ -31,7 +31,6 @@ function wrapInErrorHandling(func) {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
export const isSet = () => {
|
|
36
35
|
const result = wrapInErrorHandling(() => {
|
|
37
36
|
const value = window.sessionStorage.getItem(STORAGE_KEY) || 'null';
|
|
@@ -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, { Component } from 'react';
|
|
19
20
|
import PropTypes from 'prop-types';
|
|
20
21
|
import { TextArea } from '@instructure/ui-text-area';
|
|
@@ -33,9 +34,10 @@ import { instuiPopupMountNode } from '../../../../util/fullscreenHelpers';
|
|
|
33
34
|
import { css } from 'aphrodite';
|
|
34
35
|
import { MathJaxDirective, Mathml } from '../../../../enhance-user-content/mathml';
|
|
35
36
|
import styles from './styles';
|
|
36
|
-
import RCEGlobals from '../../../RCEGlobals';
|
|
37
|
-
// the relevant math fonts from mathlive
|
|
37
|
+
import RCEGlobals from '../../../RCEGlobals';
|
|
38
38
|
|
|
39
|
+
// Import the <math-field> container and all
|
|
40
|
+
// the relevant math fonts from mathlive
|
|
39
41
|
import '../mathlive';
|
|
40
42
|
import { insertTextIntoLatexTextarea } from './latexTextareaUtil';
|
|
41
43
|
export default class EquationEditorModal extends Component {
|
|
@@ -47,14 +49,11 @@ export default class EquationEditorModal extends Component {
|
|
|
47
49
|
};
|
|
48
50
|
this.previewElement = /*#__PURE__*/React.createRef();
|
|
49
51
|
this.advancedEditor = /*#__PURE__*/React.createRef();
|
|
50
|
-
|
|
51
52
|
this.executeCommand = (cmd, advancedCmd) => {
|
|
52
53
|
if (this.state.advanced) {
|
|
53
54
|
var _this$advancedEditor$;
|
|
54
|
-
|
|
55
55
|
const insertionText = advancedCmd || cmd;
|
|
56
56
|
const textarea = (_this$advancedEditor$ = this.advancedEditor.current) === null || _this$advancedEditor$ === void 0 ? void 0 : _this$advancedEditor$._textarea;
|
|
57
|
-
|
|
58
57
|
if (textarea) {
|
|
59
58
|
insertTextIntoLatexTextarea(textarea, insertionText);
|
|
60
59
|
this.setState({
|
|
@@ -67,25 +66,20 @@ export default class EquationEditorModal extends Component {
|
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
68
|
};
|
|
70
|
-
|
|
71
69
|
this.handleModalCancel = () => {
|
|
72
70
|
this.props.onModalDismiss();
|
|
73
71
|
};
|
|
74
|
-
|
|
75
72
|
this.handleModalDone = () => {
|
|
76
73
|
const {
|
|
77
74
|
onModalDismiss,
|
|
78
75
|
onEquationSubmit
|
|
79
76
|
} = this.props;
|
|
80
77
|
const output = this.state.advanced ? this.state.workingFormula : this.getMathFiled();
|
|
81
|
-
|
|
82
78
|
if (output) {
|
|
83
79
|
onEquationSubmit(output);
|
|
84
80
|
}
|
|
85
|
-
|
|
86
81
|
onModalDismiss();
|
|
87
82
|
};
|
|
88
|
-
|
|
89
83
|
this.renderMathInAdvancedPreview = debounce(() => {
|
|
90
84
|
if (this.previewElement.current) {
|
|
91
85
|
this.previewElement.current.innerHTML = String.raw`\(${this.state.workingFormula}\)`;
|
|
@@ -95,7 +89,6 @@ export default class EquationEditorModal extends Component {
|
|
|
95
89
|
leading: false,
|
|
96
90
|
trailing: true
|
|
97
91
|
});
|
|
98
|
-
|
|
99
92
|
this.toggleAdvanced = () => {
|
|
100
93
|
this.setState(state => {
|
|
101
94
|
if (state.advanced) {
|
|
@@ -113,12 +106,10 @@ export default class EquationEditorModal extends Component {
|
|
|
113
106
|
});
|
|
114
107
|
this.setPreviewElementContent();
|
|
115
108
|
};
|
|
116
|
-
|
|
117
109
|
this.toggleAndUpdatePreference = () => {
|
|
118
110
|
this.toggleAdvanced();
|
|
119
111
|
advancedPreference.isSet() ? advancedPreference.remove() : advancedPreference.set();
|
|
120
112
|
};
|
|
121
|
-
|
|
122
113
|
this.registerBasicEditorListener = () => {
|
|
123
114
|
const basicEditor = document.querySelector('math-field');
|
|
124
115
|
basicEditor.addEventListener('input', e => {
|
|
@@ -130,11 +121,9 @@ export default class EquationEditorModal extends Component {
|
|
|
130
121
|
}
|
|
131
122
|
});
|
|
132
123
|
};
|
|
133
|
-
|
|
134
124
|
this.handleFieldRef = node => {
|
|
135
125
|
this.mathField = node;
|
|
136
126
|
};
|
|
137
|
-
|
|
138
127
|
this.renderFooter = () => {
|
|
139
128
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
|
|
140
129
|
"data-testid": "equation-editor-modal-cancel",
|
|
@@ -146,7 +135,6 @@ export default class EquationEditorModal extends Component {
|
|
|
146
135
|
color: "primary"
|
|
147
136
|
}, formatMessage('Done')));
|
|
148
137
|
};
|
|
149
|
-
|
|
150
138
|
this.renderToggle = () => {
|
|
151
139
|
const lockToggle = this.state.advanced && this.advancedModeOnly(this.state.workingFormula);
|
|
152
140
|
return /*#__PURE__*/React.createElement(ConditionalTooltip, {
|
|
@@ -162,10 +150,8 @@ export default class EquationEditorModal extends Component {
|
|
|
162
150
|
"data-testid": "advanced-toggle"
|
|
163
151
|
}));
|
|
164
152
|
};
|
|
165
|
-
|
|
166
153
|
this.render = () => {
|
|
167
154
|
var _RCEGlobals$getFeatur;
|
|
168
|
-
|
|
169
155
|
const {
|
|
170
156
|
onModalClose
|
|
171
157
|
} = this.props;
|
|
@@ -237,13 +223,12 @@ export default class EquationEditorModal extends Component {
|
|
|
237
223
|
className: (_RCEGlobals$getFeatur = RCEGlobals.getFeatures()) !== null && _RCEGlobals$getFeatur !== void 0 && _RCEGlobals$getFeatur.explicit_latex_typesetting ? MathJaxDirective.Process : null
|
|
238
224
|
})))), /*#__PURE__*/React.createElement(Modal.Footer, null, this.renderFooter()));
|
|
239
225
|
};
|
|
240
|
-
|
|
241
226
|
this.mathml = new Mathml(RCEGlobals.getFeatures(), RCEGlobals.getConfig());
|
|
242
227
|
}
|
|
243
|
-
|
|
244
228
|
// **************** //
|
|
245
229
|
// Helper functions //
|
|
246
230
|
// **************** //
|
|
231
|
+
|
|
247
232
|
insertNewRange() {
|
|
248
233
|
const {
|
|
249
234
|
editor,
|
|
@@ -260,15 +245,15 @@ export default class EquationEditorModal extends Component {
|
|
|
260
245
|
range.setEnd(startContainer, rightIndex);
|
|
261
246
|
editor.selection.setRng(range);
|
|
262
247
|
}
|
|
263
|
-
|
|
264
248
|
advancedModeOnly(latex) {
|
|
265
249
|
const normalizedLatex = latex.replace(/\s+/, '');
|
|
266
250
|
return containsAdvancedSyntax(normalizedLatex);
|
|
267
|
-
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ********* //
|
|
268
254
|
// Callbacks //
|
|
269
255
|
// ********* //
|
|
270
256
|
|
|
271
|
-
|
|
272
257
|
setPreviewElementContent() {
|
|
273
258
|
if (this.state.workingFormula) {
|
|
274
259
|
this.renderMathInAdvancedPreview();
|
|
@@ -277,6 +262,10 @@ export default class EquationEditorModal extends Component {
|
|
|
277
262
|
}
|
|
278
263
|
}
|
|
279
264
|
|
|
265
|
+
// ******************* //
|
|
266
|
+
// Rendering functions //
|
|
267
|
+
// ******************* //
|
|
268
|
+
|
|
280
269
|
componentDidMount() {
|
|
281
270
|
this.registerBasicEditorListener();
|
|
282
271
|
this.setPreviewElementContent();
|
|
@@ -284,16 +273,13 @@ export default class EquationEditorModal extends Component {
|
|
|
284
273
|
if (!this.state.advanced) this.setMathField(this.state.workingFormula);
|
|
285
274
|
this.insertNewRange();
|
|
286
275
|
}
|
|
287
|
-
|
|
288
276
|
componentDidUpdate(prevProps, prevState) {
|
|
289
277
|
if (this.state.workingFormula !== prevState.workingFormula) {
|
|
290
278
|
this.setPreviewElementContent();
|
|
291
279
|
}
|
|
292
280
|
}
|
|
293
|
-
|
|
294
281
|
stubMacros() {
|
|
295
282
|
var _this$mathField;
|
|
296
|
-
|
|
297
283
|
// Mathlive's macros exist for a different use case;
|
|
298
284
|
// we don't intend for our users to utilize them.
|
|
299
285
|
// This effectively disables all of them to prevent
|
|
@@ -302,15 +288,12 @@ export default class EquationEditorModal extends Component {
|
|
|
302
288
|
macros: {}
|
|
303
289
|
});
|
|
304
290
|
}
|
|
305
|
-
|
|
306
291
|
setMathField(formula) {
|
|
307
292
|
this.mathField.setValue(formula);
|
|
308
293
|
}
|
|
309
|
-
|
|
310
294
|
getMathFiled() {
|
|
311
295
|
return this.mathField.getValue();
|
|
312
296
|
}
|
|
313
|
-
|
|
314
297
|
}
|
|
315
298
|
EquationEditorModal.debounceRate = 1000;
|
|
316
299
|
EquationEditorModal.propTypes = {
|