@instructure/canvas-rce 5.14.1 → 5.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -15,9 +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
|
-
|
|
19
|
-
/* eslint-disable jest/valid-describe */
|
|
20
18
|
// our own imported describe function confuses eslint
|
|
19
|
+
|
|
21
20
|
import React from 'react';
|
|
22
21
|
import { LiveAnnouncer, LiveMessage } from 'react-aria-live';
|
|
23
22
|
import { Button, CloseButton, IconButton } from '@instructure/ui-buttons';
|
|
@@ -45,15 +44,14 @@ import checkNode from '../node-checker';
|
|
|
45
44
|
import formatMessage from '../../../../format-message';
|
|
46
45
|
import { clearIndicators } from '../utils/indicate';
|
|
47
46
|
import { getTrayHeight } from '../../shared/trayUtils';
|
|
48
|
-
import {
|
|
47
|
+
import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
|
|
49
48
|
|
|
49
|
+
// safari still doesn't support the standard api
|
|
50
50
|
const FS_CHANGEEVENT = document.exitFullscreen ? 'fullscreenchange' : 'webkitfullscreenchange';
|
|
51
|
-
|
|
52
51
|
const noop = () => {};
|
|
53
|
-
|
|
54
52
|
export default class Checker extends React.Component {
|
|
55
|
-
constructor() {
|
|
56
|
-
super(...
|
|
53
|
+
constructor(...args) {
|
|
54
|
+
super(...args);
|
|
57
55
|
this.state = {
|
|
58
56
|
open: false,
|
|
59
57
|
checking: false,
|
|
@@ -64,25 +62,21 @@ export default class Checker extends React.Component {
|
|
|
64
62
|
config: {},
|
|
65
63
|
showWhyPopover: false
|
|
66
64
|
};
|
|
67
|
-
|
|
68
65
|
this.onFullscreenChange = _event => {
|
|
69
66
|
this.selectCurrent();
|
|
70
67
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
target
|
|
75
|
-
} = _ref;
|
|
68
|
+
this.updateFormState = ({
|
|
69
|
+
target
|
|
70
|
+
}) => {
|
|
76
71
|
this.setState(prevState => {
|
|
77
|
-
const formState = {
|
|
72
|
+
const formState = {
|
|
73
|
+
...prevState.formState
|
|
78
74
|
};
|
|
79
|
-
|
|
80
75
|
if (target.type === 'checkbox') {
|
|
81
76
|
formState[target.name] = target.checked;
|
|
82
77
|
} else {
|
|
83
78
|
formState[target.name] = target.value;
|
|
84
79
|
}
|
|
85
|
-
|
|
86
80
|
return {
|
|
87
81
|
formState,
|
|
88
82
|
formStateValid: this.formStateValid(formState)
|
|
@@ -90,7 +84,6 @@ export default class Checker extends React.Component {
|
|
|
90
84
|
});
|
|
91
85
|
};
|
|
92
86
|
}
|
|
93
|
-
|
|
94
87
|
componentDidMount() {
|
|
95
88
|
this.props.editor.on('Remove', _editor => {
|
|
96
89
|
this.setState({
|
|
@@ -100,7 +93,6 @@ export default class Checker extends React.Component {
|
|
|
100
93
|
});
|
|
101
94
|
});
|
|
102
95
|
}
|
|
103
|
-
|
|
104
96
|
componentDidUpdate(_prevProps, prevState) {
|
|
105
97
|
if (prevState.open !== this.state.open) {
|
|
106
98
|
if (this.state.open) {
|
|
@@ -110,13 +102,11 @@ export default class Checker extends React.Component {
|
|
|
110
102
|
}
|
|
111
103
|
}
|
|
112
104
|
}
|
|
113
|
-
|
|
114
105
|
setConfig(config) {
|
|
115
106
|
this.setState({
|
|
116
107
|
config
|
|
117
108
|
});
|
|
118
109
|
}
|
|
119
|
-
|
|
120
110
|
check(done) {
|
|
121
111
|
if (typeof done !== 'function') done = noop;
|
|
122
112
|
this.setState({
|
|
@@ -144,10 +134,8 @@ export default class Checker extends React.Component {
|
|
|
144
134
|
}
|
|
145
135
|
});
|
|
146
136
|
}
|
|
147
|
-
|
|
148
137
|
_check(done) {
|
|
149
138
|
const node = this.props.getBody();
|
|
150
|
-
|
|
151
139
|
const checkDone = errors => {
|
|
152
140
|
this.setState({
|
|
153
141
|
errorIndex: 0,
|
|
@@ -158,43 +146,34 @@ export default class Checker extends React.Component {
|
|
|
158
146
|
done();
|
|
159
147
|
});
|
|
160
148
|
};
|
|
161
|
-
|
|
162
149
|
checkNode(node, checkDone, this.state.config, this.props.additionalRules);
|
|
163
150
|
}
|
|
164
|
-
|
|
165
151
|
firstError() {
|
|
166
152
|
if (this.state.errors.length > 0) {
|
|
167
153
|
this.setErrorIndex(0);
|
|
168
154
|
}
|
|
169
155
|
}
|
|
170
|
-
|
|
171
156
|
nextError() {
|
|
172
157
|
const next = (this.state.errorIndex + 1) % this.state.errors.length;
|
|
173
158
|
this.setErrorIndex(next);
|
|
174
159
|
}
|
|
175
|
-
|
|
176
160
|
prevError() {
|
|
177
161
|
const len = this.state.errors.length;
|
|
178
162
|
const prev = (len + this.state.errorIndex - 1) % len;
|
|
179
163
|
this.setErrorIndex(prev);
|
|
180
164
|
}
|
|
181
|
-
|
|
182
165
|
setErrorIndex(errorIndex) {
|
|
183
166
|
this.onLeaveError();
|
|
184
|
-
|
|
185
167
|
if (errorIndex >= this.state.errors.length) {
|
|
186
168
|
errorIndex = 0;
|
|
187
169
|
}
|
|
188
|
-
|
|
189
170
|
this.setState({
|
|
190
171
|
errorIndex
|
|
191
172
|
}, () => this.selectCurrent());
|
|
192
173
|
}
|
|
193
|
-
|
|
194
174
|
selectCurrent() {
|
|
195
175
|
clearIndicators(this.props.editor.dom.doc);
|
|
196
176
|
const errorNode = this.errorNode();
|
|
197
|
-
|
|
198
177
|
if (errorNode) {
|
|
199
178
|
this.getFormState();
|
|
200
179
|
dom.select(errorNode);
|
|
@@ -202,44 +181,35 @@ export default class Checker extends React.Component {
|
|
|
202
181
|
this.firstError();
|
|
203
182
|
}
|
|
204
183
|
}
|
|
205
|
-
|
|
206
184
|
error() {
|
|
207
185
|
return this.state.errors[this.state.errorIndex];
|
|
208
186
|
}
|
|
209
|
-
|
|
210
187
|
errorNode() {
|
|
211
188
|
const error = this.error();
|
|
212
189
|
return error && error.node;
|
|
213
190
|
}
|
|
214
|
-
|
|
215
191
|
errorRootNode() {
|
|
216
192
|
const rule = this.errorRule();
|
|
217
193
|
const rootNode = rule && rule.rootNode && rule.rootNode(this.errorNode());
|
|
218
194
|
return rootNode || this.errorNode();
|
|
219
195
|
}
|
|
220
|
-
|
|
221
196
|
updateErrorNode(elem) {
|
|
222
197
|
const error = this.error();
|
|
223
|
-
|
|
224
198
|
if (error) {
|
|
225
199
|
error.node = elem;
|
|
226
200
|
}
|
|
227
201
|
}
|
|
228
|
-
|
|
229
202
|
errorRule() {
|
|
230
203
|
const error = this.error();
|
|
231
204
|
return error && error.rule;
|
|
232
205
|
}
|
|
233
|
-
|
|
234
206
|
errorMessage() {
|
|
235
207
|
const rule = this.errorRule();
|
|
236
208
|
return rule && rule.message();
|
|
237
209
|
}
|
|
238
|
-
|
|
239
210
|
getFormState() {
|
|
240
211
|
const rule = this.errorRule();
|
|
241
212
|
const node = this.errorNode();
|
|
242
|
-
|
|
243
213
|
if (rule && node) {
|
|
244
214
|
this.setState({
|
|
245
215
|
formState: rule.data(node),
|
|
@@ -247,39 +217,30 @@ export default class Checker extends React.Component {
|
|
|
247
217
|
});
|
|
248
218
|
}
|
|
249
219
|
}
|
|
250
|
-
|
|
251
220
|
formStateValid(formState) {
|
|
252
221
|
formState = formState || this.state.formState;
|
|
253
222
|
let node = this.tempNode(true);
|
|
254
223
|
const rule = this.errorRule();
|
|
255
|
-
|
|
256
224
|
if (!node || !rule) {
|
|
257
225
|
return false;
|
|
258
226
|
}
|
|
259
|
-
|
|
260
227
|
node = rule.update(node, formState);
|
|
261
|
-
|
|
262
228
|
if (this._tempNode === this._tempTestNode) {
|
|
263
229
|
this._tempNode = node;
|
|
264
230
|
}
|
|
265
|
-
|
|
266
231
|
this._tempTestNode = node;
|
|
267
232
|
return rule.test(node);
|
|
268
233
|
}
|
|
269
|
-
|
|
270
234
|
fixIssue() {
|
|
271
235
|
const rule = this.errorRule();
|
|
272
236
|
const node = this.errorNode();
|
|
273
|
-
|
|
274
237
|
if (rule && node) {
|
|
275
238
|
this.removeTempNode();
|
|
276
239
|
rule.update(node, this.state.formState);
|
|
277
240
|
this.updateErrorNode(node);
|
|
278
|
-
|
|
279
241
|
if (this._closeButtonRef) {
|
|
280
242
|
this._closeButtonRef.focus();
|
|
281
243
|
}
|
|
282
|
-
|
|
283
244
|
const errorIndex = this.state.errorIndex;
|
|
284
245
|
this.check(() => {
|
|
285
246
|
this.setErrorIndex(errorIndex);
|
|
@@ -287,23 +248,17 @@ export default class Checker extends React.Component {
|
|
|
287
248
|
});
|
|
288
249
|
}
|
|
289
250
|
}
|
|
290
|
-
|
|
291
251
|
newTempRootNode(rootNode) {
|
|
292
252
|
const newTempRootNode = rootNode.cloneNode(true);
|
|
293
253
|
const path = dom.pathForNode(rootNode, this.errorNode());
|
|
294
254
|
this._tempTestNode = dom.nodeByPath(newTempRootNode, path);
|
|
295
255
|
return newTempRootNode;
|
|
296
256
|
}
|
|
297
|
-
|
|
298
|
-
tempNode() {
|
|
299
|
-
let refresh = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
300
|
-
|
|
257
|
+
tempNode(refresh = false) {
|
|
301
258
|
if (!this._tempNode || refresh) {
|
|
302
259
|
const rootNode = this.errorRootNode();
|
|
303
|
-
|
|
304
260
|
if (rootNode) {
|
|
305
261
|
const newTempRtNode = this.newTempRootNode(rootNode);
|
|
306
|
-
|
|
307
262
|
if (refresh && this._tempNode) {
|
|
308
263
|
const parent = this._tempNode.parentNode;
|
|
309
264
|
parent.insertBefore(newTempRtNode, this._tempNode);
|
|
@@ -313,17 +268,13 @@ export default class Checker extends React.Component {
|
|
|
313
268
|
parent.insertBefore(newTempRtNode, rootNode);
|
|
314
269
|
parent.removeChild(rootNode);
|
|
315
270
|
}
|
|
316
|
-
|
|
317
271
|
this._tempNode = newTempRtNode;
|
|
318
272
|
}
|
|
319
273
|
}
|
|
320
|
-
|
|
321
274
|
return this._tempTestNode;
|
|
322
275
|
}
|
|
323
|
-
|
|
324
276
|
removeTempNode() {
|
|
325
277
|
const node = this.errorRootNode();
|
|
326
|
-
|
|
327
278
|
if (this._tempNode && node) {
|
|
328
279
|
const parent = this._tempNode.parentNode;
|
|
329
280
|
parent.insertBefore(node, this._tempNode);
|
|
@@ -332,11 +283,9 @@ export default class Checker extends React.Component {
|
|
|
332
283
|
this._tempTestNode = null;
|
|
333
284
|
}
|
|
334
285
|
}
|
|
335
|
-
|
|
336
286
|
onLeaveError() {
|
|
337
287
|
this.removeTempNode();
|
|
338
288
|
}
|
|
339
|
-
|
|
340
289
|
handleClose() {
|
|
341
290
|
this.onLeaveError();
|
|
342
291
|
clearIndicators(this.props.editor.dom.doc);
|
|
@@ -346,7 +295,6 @@ export default class Checker extends React.Component {
|
|
|
346
295
|
this.props.onClose();
|
|
347
296
|
});
|
|
348
297
|
}
|
|
349
|
-
|
|
350
298
|
render() {
|
|
351
299
|
const rule = this.errorRule();
|
|
352
300
|
const issueNumberMessage = formatMessage('Issue { num }/{ total }', {
|
|
@@ -482,14 +430,12 @@ export default class Checker extends React.Component {
|
|
|
482
430
|
margin: "medium auto"
|
|
483
431
|
}))))));
|
|
484
432
|
}
|
|
485
|
-
|
|
486
433
|
renderField(f) {
|
|
487
434
|
const disabled = !!f.disabledIf && f.disabledIf(this.state.formState);
|
|
488
|
-
|
|
489
435
|
switch (true) {
|
|
490
436
|
case !!f.options:
|
|
491
437
|
return /*#__PURE__*/React.createElement(SimpleSelect, {
|
|
492
|
-
mountNode:
|
|
438
|
+
mountNode: instuiPopupMountNodeFn(),
|
|
493
439
|
disabled: disabled,
|
|
494
440
|
onChange: (e, option) => {
|
|
495
441
|
this.updateFormState({
|
|
@@ -506,7 +452,6 @@ export default class Checker extends React.Component {
|
|
|
506
452
|
id: o[0],
|
|
507
453
|
value: o[0]
|
|
508
454
|
}, o[1])));
|
|
509
|
-
|
|
510
455
|
case f.checkbox:
|
|
511
456
|
return /*#__PURE__*/React.createElement(Checkbox, {
|
|
512
457
|
label: f.label,
|
|
@@ -515,7 +460,6 @@ export default class Checker extends React.Component {
|
|
|
515
460
|
onChange: this.updateFormState,
|
|
516
461
|
disabled: disabled
|
|
517
462
|
});
|
|
518
|
-
|
|
519
463
|
case f.color:
|
|
520
464
|
return /*#__PURE__*/React.createElement(ColorField, {
|
|
521
465
|
label: f.label,
|
|
@@ -524,7 +468,6 @@ export default class Checker extends React.Component {
|
|
|
524
468
|
onChange: this.updateFormState,
|
|
525
469
|
key: this.state.formState.id
|
|
526
470
|
});
|
|
527
|
-
|
|
528
471
|
case f.textarea:
|
|
529
472
|
return /*#__PURE__*/React.createElement(TextArea, {
|
|
530
473
|
label: f.label,
|
|
@@ -533,13 +476,11 @@ export default class Checker extends React.Component {
|
|
|
533
476
|
onChange: this.updateFormState,
|
|
534
477
|
disabled: disabled
|
|
535
478
|
});
|
|
536
|
-
|
|
537
479
|
case f.alert:
|
|
538
480
|
return this.state.formState.action === 'elem-only' && /*#__PURE__*/React.createElement(Alert, {
|
|
539
481
|
name: f.dataKey,
|
|
540
482
|
variant: f.variant
|
|
541
483
|
}, f.message);
|
|
542
|
-
|
|
543
484
|
default:
|
|
544
485
|
return /*#__PURE__*/React.createElement(TextInput, {
|
|
545
486
|
renderLabel: f.label,
|
|
@@ -550,7 +491,6 @@ export default class Checker extends React.Component {
|
|
|
550
491
|
});
|
|
551
492
|
}
|
|
552
493
|
}
|
|
553
|
-
|
|
554
494
|
}
|
|
555
495
|
Checker.defaultProps = {
|
|
556
496
|
additionalRules: [],
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import { ColorWrap, Saturation, Hue, Alpha } from 'react-color/lib/components/common';
|
|
20
21
|
import Pointer from './pointer';
|
|
21
22
|
import PointerCircle from 'react-color/lib/components/photoshop/PhotoshopPointerCircle';
|
|
22
|
-
|
|
23
23
|
function ColorPicker(props) {
|
|
24
24
|
return /*#__PURE__*/React.createElement("div", {
|
|
25
25
|
"data-testid": props['data-testid']
|
|
@@ -55,5 +55,4 @@ function ColorPicker(props) {
|
|
|
55
55
|
pointer: Pointer
|
|
56
56
|
}))));
|
|
57
57
|
}
|
|
58
|
-
|
|
59
58
|
export default ColorWrap(ColorPicker);
|
|
@@ -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
|
export default function PlaceholderSVG() {
|
|
20
21
|
return /*#__PURE__*/React.createElement("svg", {
|
|
@@ -15,22 +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
|
import * as dom from './utils/dom';
|
|
19
20
|
import rules from './rules';
|
|
20
|
-
export default function checkNode(node, done) {
|
|
21
|
-
let config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
22
|
-
let additionalRules = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
23
|
-
|
|
21
|
+
export default function checkNode(node, done, config = {}, additionalRules = []) {
|
|
24
22
|
if (!node) {
|
|
25
23
|
return;
|
|
26
24
|
}
|
|
27
|
-
|
|
28
25
|
const errors = [];
|
|
29
|
-
|
|
30
26
|
const childNodeCheck = child => {
|
|
31
27
|
if (child.hasAttribute('data-ignore-a11y-check')) return;
|
|
32
28
|
const composedRules = rules.concat(additionalRules);
|
|
33
|
-
|
|
34
29
|
for (const rule of composedRules) {
|
|
35
30
|
// eslint-disable-next-line promise/catch-or-return
|
|
36
31
|
Promise.resolve(rule.test(child, config)).then(result => {
|
|
@@ -43,12 +38,10 @@ export default function checkNode(node, done) {
|
|
|
43
38
|
});
|
|
44
39
|
}
|
|
45
40
|
};
|
|
46
|
-
|
|
47
41
|
const checkDone = () => {
|
|
48
42
|
if (typeof done === 'function') {
|
|
49
43
|
done(errors);
|
|
50
44
|
}
|
|
51
45
|
};
|
|
52
|
-
|
|
53
46
|
dom.walk(node, childNodeCheck, checkDone);
|
|
54
47
|
}
|
|
@@ -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 ReactDOM from 'react-dom';
|
|
20
21
|
import Checker from './components/checker';
|
|
@@ -28,30 +29,25 @@ container.className = 'tinymce-a11y-checker-container';
|
|
|
28
29
|
document.body.appendChild(container);
|
|
29
30
|
tinymce.create('tinymce.plugins.AccessibilityChecker', {
|
|
30
31
|
init(ed) {
|
|
31
|
-
ed.addCommand('openAccessibilityChecker', function (ui,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
} = _ref;
|
|
40
|
-
|
|
32
|
+
ed.addCommand('openAccessibilityChecker', function (ui, {
|
|
33
|
+
done,
|
|
34
|
+
config,
|
|
35
|
+
additionalRules,
|
|
36
|
+
mountNode,
|
|
37
|
+
triggerElementId,
|
|
38
|
+
onFixError
|
|
39
|
+
}) {
|
|
41
40
|
if (!isCheckerOpen) {
|
|
42
|
-
ReactDOM.render(
|
|
41
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(Checker, {
|
|
43
42
|
getBody: ed.getBody.bind(ed),
|
|
44
43
|
editor: ed,
|
|
45
44
|
additionalRules: additionalRules,
|
|
46
45
|
mountNode: mountNode,
|
|
47
46
|
onClose: () => {
|
|
48
47
|
isCheckerOpen = false;
|
|
49
|
-
|
|
50
48
|
if (triggerElementId) {
|
|
51
|
-
var _button$;
|
|
52
|
-
|
|
53
49
|
const button = document.querySelectorAll(`[data-btn-id=${triggerElementId}]`);
|
|
54
|
-
|
|
50
|
+
button[0]?.focus();
|
|
55
51
|
}
|
|
56
52
|
},
|
|
57
53
|
onFixError: onFixError
|
|
@@ -68,12 +64,11 @@ tinymce.create('tinymce.plugins.AccessibilityChecker', {
|
|
|
68
64
|
isCheckerOpen = true;
|
|
69
65
|
}
|
|
70
66
|
});
|
|
71
|
-
ed.addCommand('checkAccessibility', function (ui,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
} = _ref2;
|
|
67
|
+
ed.addCommand('checkAccessibility', function (ui, {
|
|
68
|
+
done,
|
|
69
|
+
config,
|
|
70
|
+
additionalRules
|
|
71
|
+
}) {
|
|
77
72
|
checkNode(ed.getBody(), done, config, additionalRules);
|
|
78
73
|
});
|
|
79
74
|
ed.ui.registry.addButton('check_a11y', {
|
|
@@ -82,15 +77,14 @@ tinymce.create('tinymce.plugins.AccessibilityChecker', {
|
|
|
82
77
|
icon: 'a11y'
|
|
83
78
|
});
|
|
84
79
|
}
|
|
80
|
+
});
|
|
85
81
|
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
// Register plugin
|
|
88
83
|
tinymce.PluginManager.add('a11y_checker', tinymce.plugins.AccessibilityChecker);
|
|
89
84
|
export function getInstance(cb) {
|
|
90
85
|
if (instance != null) {
|
|
91
86
|
return cb(instance);
|
|
92
87
|
}
|
|
93
|
-
|
|
94
88
|
pendingInstanceCallbacks.push(cb);
|
|
95
89
|
}
|
|
96
90
|
export function setLocale(locale) {
|
|
@@ -15,59 +15,46 @@
|
|
|
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 formatMessage from '../../../../format-message';
|
|
19
18
|
|
|
19
|
+
import formatMessage from '../../../../format-message';
|
|
20
20
|
const shouldMergeAnchors = (elem1, elem2) => {
|
|
21
21
|
if (!elem1 || !elem2 || elem1.tagName !== 'A' || elem2.tagName !== 'A') {
|
|
22
22
|
return false;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
24
|
return elem1.getAttribute('href') === elem2.getAttribute('href');
|
|
26
25
|
};
|
|
27
|
-
|
|
28
26
|
const notWhitespace = node => {
|
|
29
27
|
return node.nodeType !== Node.TEXT_NODE || node.textContent.match(/\S/);
|
|
30
28
|
};
|
|
31
|
-
|
|
32
29
|
const onlyChild = parent => {
|
|
33
30
|
const child = parent.firstElementChild;
|
|
34
|
-
|
|
35
31
|
if (!child) {
|
|
36
32
|
return null;
|
|
37
33
|
}
|
|
38
|
-
|
|
39
34
|
if ([...parent.childNodes].filter(notWhitespace).length > 1) {
|
|
40
35
|
return null;
|
|
41
36
|
}
|
|
42
|
-
|
|
43
37
|
return child;
|
|
44
38
|
};
|
|
45
|
-
|
|
46
39
|
const solitaryDescendantImage = link => {
|
|
47
40
|
let parent = link;
|
|
48
41
|
let child = onlyChild(parent);
|
|
49
|
-
|
|
50
42
|
while (child) {
|
|
51
43
|
if (child.tagName === 'IMG') {
|
|
52
44
|
return child;
|
|
53
45
|
}
|
|
54
|
-
|
|
55
46
|
parent = child;
|
|
56
47
|
child = onlyChild(parent);
|
|
57
48
|
}
|
|
58
|
-
|
|
59
49
|
return null;
|
|
60
50
|
};
|
|
61
|
-
|
|
62
51
|
const normalizeText = text => {
|
|
63
52
|
// normalize whitespace and trim leading and trailing whitespace
|
|
64
53
|
return text.replace(/\s+/g, ' ').trim();
|
|
65
54
|
};
|
|
66
|
-
|
|
67
55
|
const descendantImageWithRedundantAltText = (left, right) => {
|
|
68
56
|
const leftImage = solitaryDescendantImage(left);
|
|
69
57
|
const rightImage = solitaryDescendantImage(right);
|
|
70
|
-
|
|
71
58
|
if (leftImage && !rightImage && normalizeText(leftImage.getAttribute('alt')) === normalizeText(right.textContent)) {
|
|
72
59
|
return leftImage;
|
|
73
60
|
} else if (rightImage && !leftImage && normalizeText(rightImage.getAttribute('alt')) === normalizeText(left.textContent)) {
|
|
@@ -76,18 +63,14 @@ const descendantImageWithRedundantAltText = (left, right) => {
|
|
|
76
63
|
return null;
|
|
77
64
|
}
|
|
78
65
|
};
|
|
79
|
-
|
|
80
66
|
export default {
|
|
81
67
|
id: 'adjacent-links',
|
|
82
|
-
|
|
83
68
|
test(elem) {
|
|
84
69
|
if (elem.tagName != 'A') {
|
|
85
70
|
return true;
|
|
86
71
|
}
|
|
87
|
-
|
|
88
72
|
return !shouldMergeAnchors(elem, elem.nextElementSibling);
|
|
89
73
|
},
|
|
90
|
-
|
|
91
74
|
data: _elem => {
|
|
92
75
|
return {
|
|
93
76
|
combine: false
|
|
@@ -98,30 +81,24 @@ export default {
|
|
|
98
81
|
checkbox: true,
|
|
99
82
|
dataKey: 'combine'
|
|
100
83
|
}],
|
|
101
|
-
|
|
102
84
|
update(elem, data) {
|
|
103
85
|
const rootElem = elem.parentNode;
|
|
104
|
-
|
|
105
86
|
if (data.combine) {
|
|
106
|
-
const next = elem.nextElementSibling;
|
|
87
|
+
const next = elem.nextElementSibling;
|
|
107
88
|
|
|
89
|
+
// https://www.w3.org/TR/WCAG20-TECHS/H2.html
|
|
108
90
|
const image = descendantImageWithRedundantAltText(elem, next);
|
|
109
|
-
|
|
110
91
|
if (image) {
|
|
111
92
|
image.setAttribute('alt', '');
|
|
112
93
|
}
|
|
113
|
-
|
|
114
94
|
rootElem.removeChild(next);
|
|
115
95
|
elem.innerHTML += ` ${next.innerHTML}`;
|
|
116
96
|
}
|
|
117
|
-
|
|
118
97
|
return elem;
|
|
119
98
|
},
|
|
120
|
-
|
|
121
99
|
rootNode(elem) {
|
|
122
100
|
return elem.parentNode;
|
|
123
101
|
},
|
|
124
|
-
|
|
125
102
|
message: () => formatMessage('Adjacent links with the same URL should be a single link.'),
|
|
126
103
|
why: () => formatMessage('Keyboards navigate to links using the Tab key. Two adjacent links that direct to the same destination can be confusing to keyboard users.'),
|
|
127
104
|
link: 'https://www.w3.org/TR/WCAG20-TECHS/H2.html',
|