@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,49 +15,42 @@
|
|
|
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
|
-
const NUMBER_OF_WORDS = 10;
|
|
19
18
|
|
|
19
|
+
const NUMBER_OF_WORDS = 10;
|
|
20
20
|
const countWords = text => {
|
|
21
21
|
// ignore text before the first whitespace because it is part of the selected text
|
|
22
22
|
const countText = text.split(/\s+/).slice(1).join(' ');
|
|
23
23
|
const count = countText.trim().split(/\s+/).length;
|
|
24
24
|
return count;
|
|
25
25
|
};
|
|
26
|
-
|
|
27
26
|
const getAfterText = startingElement => {
|
|
28
27
|
let text = '';
|
|
29
28
|
let element = startingElement.nextSibling;
|
|
30
|
-
|
|
31
29
|
while (element) {
|
|
32
30
|
text += element.textContent;
|
|
33
31
|
element = element.nextSibling;
|
|
34
32
|
}
|
|
35
|
-
|
|
36
33
|
if (text.includes('.')) {
|
|
37
34
|
const index = text.indexOf('.');
|
|
38
35
|
text = text.substring(0, index + 1);
|
|
39
36
|
}
|
|
40
|
-
|
|
41
37
|
if (countWords(text) > NUMBER_OF_WORDS) {
|
|
42
38
|
text = text.split(/\s+/).slice(0, NUMBER_OF_WORDS + 1).join(' ');
|
|
43
39
|
}
|
|
44
|
-
|
|
45
40
|
return text;
|
|
46
41
|
};
|
|
47
|
-
|
|
48
42
|
const getBeforeText = (startingElement, wordCount) => {
|
|
49
43
|
let text = '';
|
|
50
44
|
let element = startingElement.previousSibling;
|
|
51
|
-
|
|
52
45
|
while (element) {
|
|
53
46
|
text = element.textContent + text;
|
|
54
47
|
element = element.previousSibling;
|
|
55
48
|
}
|
|
56
|
-
|
|
57
49
|
text = text.split(/\s+/).slice(-wordCount - 1).join(' ');
|
|
58
50
|
return text;
|
|
59
51
|
};
|
|
60
52
|
|
|
53
|
+
// eslint-disable-next-line no-undef
|
|
61
54
|
export const getSelectionContext = elements => {
|
|
62
55
|
const firstSelected = elements[0];
|
|
63
56
|
const lastSelected = elements[elements.length - 1];
|
|
@@ -15,19 +15,16 @@
|
|
|
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 tinymce from 'tinymce';
|
|
19
20
|
import formatMessage from '../../../format-message';
|
|
20
21
|
import clickCallback from './clickCallback';
|
|
21
22
|
tinymce.PluginManager.add('instructure_search_and_replace', function (editor) {
|
|
22
|
-
var _editor$plugins;
|
|
23
|
-
|
|
24
23
|
// We use the searchreplace plugins API
|
|
25
|
-
if (!
|
|
26
|
-
|
|
24
|
+
if (!editor.plugins?.searchreplace) return;
|
|
27
25
|
const launchFindModal = ed => () => {
|
|
28
26
|
clickCallback(ed, document);
|
|
29
27
|
};
|
|
30
|
-
|
|
31
28
|
editor.addCommand('launch_instructure_search_and_replace', launchFindModal(editor));
|
|
32
29
|
editor.ui.registry.addMenuItem('instructure_search_and_replace', {
|
|
33
30
|
text: formatMessage('Find and Replace'),
|
|
@@ -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 tinymce from 'tinymce';
|
|
19
20
|
import { isStudioEmbeddedMedia, handleBeforeObjectSelected } from '../shared/StudioLtiSupportUtils';
|
|
20
21
|
import VideoTrayController from '../instructure_record/VideoOptionsTray/TrayController';
|
|
@@ -25,7 +26,6 @@ tinymce.PluginManager.add('instructure_studio_media_options', function (ed) {
|
|
|
25
26
|
onAction() {
|
|
26
27
|
studioTrayController.showTrayForEditor(ed);
|
|
27
28
|
},
|
|
28
|
-
|
|
29
29
|
text: formatMessage('Studio Media Options'),
|
|
30
30
|
tooltip: formatMessage('Show Studio media options')
|
|
31
31
|
});
|
|
@@ -15,32 +15,28 @@
|
|
|
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 { generateRows, HEADERS } from './utils/tableContent';
|
|
21
22
|
const MODAL_ID = 'canvas-rce-wordcount-container';
|
|
22
23
|
export default function (ed, document, options) {
|
|
23
|
-
return import('./components/WordCountModal').then(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} = _ref;
|
|
24
|
+
return import('./components/WordCountModal').then(({
|
|
25
|
+
WordCountModal
|
|
26
|
+
}) => {
|
|
27
27
|
let container = document.querySelector(`#${MODAL_ID}`);
|
|
28
|
-
|
|
29
28
|
if (!container) {
|
|
30
29
|
container = document.createElement('div');
|
|
31
30
|
container.id = MODAL_ID;
|
|
32
31
|
document.body.appendChild(container);
|
|
33
32
|
}
|
|
34
|
-
|
|
35
33
|
const handleDismiss = () => {
|
|
36
34
|
if (container) {
|
|
37
35
|
ReactDOM.unmountComponentAtNode(container);
|
|
38
36
|
}
|
|
39
|
-
|
|
40
37
|
ed.focus(options.skipEditorFocus);
|
|
41
38
|
};
|
|
42
|
-
|
|
43
|
-
ReactDOM.render( /*#__PURE__*/React.createElement(WordCountModal, {
|
|
39
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(WordCountModal, {
|
|
44
40
|
headers: HEADERS,
|
|
45
41
|
rows: generateRows(ed),
|
|
46
42
|
onDismiss: handleDismiss
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import _pt from "prop-types";
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
|
|
4
2
|
/*
|
|
5
3
|
* Copyright (C) 2022 - present Instructure, Inc.
|
|
6
4
|
*
|
|
@@ -18,53 +16,45 @@ import _pt from "prop-types";
|
|
|
18
16
|
* You should have received a copy of the GNU Affero General Public License along
|
|
19
17
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
18
|
*/
|
|
19
|
+
|
|
21
20
|
import React from 'react';
|
|
22
21
|
import { Modal } from '@instructure/ui-modal';
|
|
23
22
|
import { BaseButton, CloseButton } from '@instructure/ui-buttons';
|
|
24
23
|
import { Heading } from '@instructure/ui-heading';
|
|
25
24
|
import { Table } from '@instructure/ui-table';
|
|
26
25
|
import formatMessage from '../../../../format-message';
|
|
27
|
-
import {
|
|
28
|
-
|
|
26
|
+
import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
|
|
29
27
|
const renderBody = (headers, rows) => {
|
|
30
28
|
return /*#__PURE__*/React.createElement(Table, {
|
|
31
29
|
caption: formatMessage('Word Count')
|
|
32
|
-
}, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, headers.map(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}, label), /*#__PURE__*/React.createElement(Table.Cell, {
|
|
52
|
-
key: "document"
|
|
53
|
-
}, documentCount), /*#__PURE__*/React.createElement(Table.Cell, {
|
|
54
|
-
key: "selection"
|
|
55
|
-
}, selectionCount));
|
|
56
|
-
})));
|
|
30
|
+
}, /*#__PURE__*/React.createElement(Table.Head, null, /*#__PURE__*/React.createElement(Table.Row, null, headers.map(({
|
|
31
|
+
id,
|
|
32
|
+
getLabel
|
|
33
|
+
}) => /*#__PURE__*/React.createElement(Table.ColHeader, {
|
|
34
|
+
key: id,
|
|
35
|
+
id: id
|
|
36
|
+
}, getLabel())))), /*#__PURE__*/React.createElement(Table.Body, null, rows.map(({
|
|
37
|
+
label,
|
|
38
|
+
documentCount,
|
|
39
|
+
selectionCount
|
|
40
|
+
}) => /*#__PURE__*/React.createElement(Table.Row, {
|
|
41
|
+
key: label
|
|
42
|
+
}, /*#__PURE__*/React.createElement(Table.Cell, {
|
|
43
|
+
key: "label"
|
|
44
|
+
}, label), /*#__PURE__*/React.createElement(Table.Cell, {
|
|
45
|
+
key: "document"
|
|
46
|
+
}, documentCount), /*#__PURE__*/React.createElement(Table.Cell, {
|
|
47
|
+
key: "selection"
|
|
48
|
+
}, selectionCount)))));
|
|
57
49
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
onDismiss
|
|
64
|
-
} = _ref3;
|
|
50
|
+
export const WordCountModal = ({
|
|
51
|
+
headers,
|
|
52
|
+
rows,
|
|
53
|
+
onDismiss
|
|
54
|
+
}) => {
|
|
65
55
|
return /*#__PURE__*/React.createElement(Modal, {
|
|
66
56
|
label: formatMessage('Word Count'),
|
|
67
|
-
mountNode:
|
|
57
|
+
mountNode: instuiPopupMountNodeFn(),
|
|
68
58
|
open: true,
|
|
69
59
|
"data-mce-component": true
|
|
70
60
|
}, /*#__PURE__*/React.createElement(Modal.Header, null, /*#__PURE__*/React.createElement(CloseButton, {
|
|
@@ -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 tinymce from 'tinymce';
|
|
19
20
|
import formatMessage from '../../../format-message';
|
|
20
21
|
import clickCallback from './clickCallback';
|
|
@@ -15,40 +15,36 @@
|
|
|
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
|
export const IGNORE_WORDCOUNT_ATTRIBUTE = 'data-ignore-wordcount';
|
|
19
20
|
export const countWords = node => {
|
|
20
21
|
if (node.getAttribute(IGNORE_WORDCOUNT_ATTRIBUTE) === 'chars-only') return 0;
|
|
21
|
-
const textContent =
|
|
22
|
+
const textContent = node?.innerText || '';
|
|
22
23
|
const trimmedTextContent = textContent.trim();
|
|
23
24
|
if (trimmedTextContent.length === 0) return 0;
|
|
24
25
|
return trimmedTextContent.split(/\s+/).length;
|
|
25
26
|
};
|
|
26
27
|
export const countCharsNoSpaces = node => {
|
|
27
|
-
const textContent =
|
|
28
|
+
const textContent = node?.innerText || '';
|
|
28
29
|
const matches = textContent.match(/ /g); // a single space
|
|
29
|
-
|
|
30
30
|
const spaces = matches ? matches.length : 0;
|
|
31
31
|
return countChars(node) - spaces;
|
|
32
32
|
};
|
|
33
33
|
export const countChars = node => {
|
|
34
|
-
const textContent =
|
|
34
|
+
const textContent = node?.innerText || '';
|
|
35
35
|
const iterator = textContent[Symbol.iterator]();
|
|
36
36
|
let count = 0;
|
|
37
|
-
|
|
38
37
|
while (!iterator.next().done) {
|
|
39
38
|
count++;
|
|
40
39
|
}
|
|
41
|
-
|
|
42
40
|
return count;
|
|
43
41
|
};
|
|
44
42
|
export const callbackForCategory = category => {
|
|
45
43
|
switch (category) {
|
|
46
44
|
case 'words':
|
|
47
45
|
return countWords;
|
|
48
|
-
|
|
49
46
|
case 'chars-no-spaces':
|
|
50
47
|
return countCharsNoSpaces;
|
|
51
|
-
|
|
52
48
|
case 'chars':
|
|
53
49
|
return countChars;
|
|
54
50
|
}
|
|
@@ -61,14 +57,11 @@ export const countShouldIgnore = (ed, scope, category) => {
|
|
|
61
57
|
};
|
|
62
58
|
export const getTinymceCount = (ed, scope, category) => {
|
|
63
59
|
const wc = ed.plugins.wordcount[scope];
|
|
64
|
-
|
|
65
60
|
switch (category) {
|
|
66
61
|
case 'words':
|
|
67
62
|
return wc.getWordCount();
|
|
68
|
-
|
|
69
63
|
case 'chars-no-spaces':
|
|
70
64
|
return wc.getCharacterCountWithoutSpaces();
|
|
71
|
-
|
|
72
65
|
case 'chars':
|
|
73
66
|
return wc.getCharacterCount();
|
|
74
67
|
}
|
|
@@ -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 { countContent } from './countContent';
|
|
19
20
|
import formatMessage from '../../../../format-message';
|
|
20
21
|
export const HEADERS = [{
|
|
@@ -29,12 +30,9 @@ export const HEADERS = [{
|
|
|
29
30
|
}];
|
|
30
31
|
const ROW_LABELS = [['words', () => formatMessage('Words')], ['chars-no-spaces', () => formatMessage('Characters (no spaces)')], ['chars', () => formatMessage('Characters')]];
|
|
31
32
|
export const generateRows = ed => {
|
|
32
|
-
return ROW_LABELS.map(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
selectionCount: countContent(ed, 'selection', category)
|
|
38
|
-
};
|
|
39
|
-
});
|
|
33
|
+
return ROW_LABELS.map(([category, getLabel]) => ({
|
|
34
|
+
label: getLabel(),
|
|
35
|
+
documentCount: countContent(ed, 'body', category),
|
|
36
|
+
selectionCount: countContent(ed, 'selection', category)
|
|
37
|
+
}));
|
|
40
38
|
};
|
|
@@ -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, { useCallback, useEffect, useRef, useState } from 'react';
|
|
19
20
|
import { bool, element, func, instanceOf, oneOfType, shape, string } from 'prop-types';
|
|
20
21
|
import { Tray } from '@instructure/ui-tray';
|
|
@@ -33,6 +34,7 @@ import { getLinkContentFromEditor } from './ContentSelection';
|
|
|
33
34
|
import { LinkDisplay } from './LinkDisplay';
|
|
34
35
|
import { showFlashAlert } from '../../../common/FlashAlert';
|
|
35
36
|
import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasContentUtils';
|
|
37
|
+
|
|
36
38
|
/**
|
|
37
39
|
* Returns the translated tray label
|
|
38
40
|
* @param {string} contentType - The type of content showing on tray
|
|
@@ -40,51 +42,44 @@ import { FILTER_SETTINGS_BY_PLUGIN, DynamicPanel, isLoading } from './canvasCont
|
|
|
40
42
|
* @param {string} contextType - The user's context
|
|
41
43
|
* @returns {string}
|
|
42
44
|
*/
|
|
43
|
-
|
|
44
45
|
function getTrayLabel(contentType, contentSubtype, contextType) {
|
|
45
46
|
if (contentType === 'links' && contextType === 'course') {
|
|
46
47
|
return formatMessage('Course Links');
|
|
47
48
|
} else if (contentType === 'links' && contextType === 'group') {
|
|
48
49
|
return formatMessage('Group Links');
|
|
49
50
|
}
|
|
50
|
-
|
|
51
51
|
switch (contentSubtype) {
|
|
52
52
|
case ICON_MAKER_ICONS:
|
|
53
53
|
return formatMessage('Icon Maker Icons');
|
|
54
|
-
|
|
55
54
|
case 'images':
|
|
56
55
|
if (contentType === 'course_files') return formatMessage('Course Images');
|
|
57
56
|
if (contentType === 'group_files') return formatMessage('Group Images');
|
|
58
57
|
return formatMessage('User Images');
|
|
59
|
-
|
|
60
58
|
case 'media':
|
|
61
59
|
if (contentType === 'course_files') return formatMessage('Course Media');
|
|
62
60
|
if (contentType === 'group_files') return formatMessage('Group Media');
|
|
63
61
|
return formatMessage('User Media');
|
|
64
|
-
|
|
65
62
|
case 'documents':
|
|
66
63
|
if (contentType === 'course_files') return formatMessage('Course Documents');
|
|
67
64
|
if (contentType === 'group_files') return formatMessage('Group Documents');
|
|
68
65
|
return formatMessage('User Documents');
|
|
69
|
-
|
|
70
66
|
default:
|
|
71
67
|
return formatMessage('Tray');
|
|
72
68
|
// Shouldn't ever get here
|
|
73
69
|
}
|
|
74
70
|
}
|
|
71
|
+
|
|
75
72
|
/**
|
|
76
73
|
* This component is used within various plugins to handle loading in content
|
|
77
74
|
* from Canvas. It is essentially the main component.
|
|
78
75
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
76
|
export default function CanvasContentTray(props) {
|
|
82
77
|
// should the tray be rendered open?
|
|
83
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
78
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
79
|
+
// has the tray fully opened. we use this to defer rendering the content
|
|
84
80
|
// until the tray is open.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
81
|
+
const [hasOpened, setHasOpened] = useState(false);
|
|
82
|
+
// should we close the tray after the user clicks on something in it?
|
|
88
83
|
const [hidingTrayOnAction, setHidingTrayOnAction] = useState(true);
|
|
89
84
|
const trayRef = useRef(null);
|
|
90
85
|
const scrollingAreaRef = useRef(null);
|
|
@@ -100,20 +95,20 @@ export default function CanvasContentTray(props) {
|
|
|
100
95
|
mountNode,
|
|
101
96
|
onTrayClosing,
|
|
102
97
|
storeProps
|
|
103
|
-
} = {
|
|
98
|
+
} = {
|
|
99
|
+
...props
|
|
104
100
|
};
|
|
105
101
|
const handleDismissTray = useCallback(() => {
|
|
106
102
|
// return focus to the RCE if focus was on this tray
|
|
107
103
|
if (trayRef.current && trayRef.current.contains(document.activeElement)) {
|
|
108
104
|
bridge.focusActiveEditor(false);
|
|
109
105
|
}
|
|
110
|
-
|
|
111
106
|
onTrayClosing && onTrayClosing(CanvasContentTray.globalOpenCount); // tell RCEWrapper we're closing if we're open
|
|
112
|
-
|
|
113
107
|
setIsOpen(false);
|
|
114
|
-
}, [bridge, onTrayClosing]);
|
|
115
|
-
// like it should.
|
|
108
|
+
}, [bridge, onTrayClosing]);
|
|
116
109
|
|
|
110
|
+
// this shouldn't be necessary, but INSTUI isn't focusing the close button
|
|
111
|
+
// like it should.
|
|
117
112
|
useEffect(() => {
|
|
118
113
|
if (isOpen && closeButtonRef) {
|
|
119
114
|
closeButtonRef.focus();
|
|
@@ -128,7 +123,6 @@ export default function CanvasContentTray(props) {
|
|
|
128
123
|
++CanvasContentTray.globalOpenCount;
|
|
129
124
|
setFilterSettings(FILTER_SETTINGS_BY_PLUGIN[plugin]);
|
|
130
125
|
setIsOpen(true);
|
|
131
|
-
|
|
132
126
|
if (plugin === 'course_link_edit') {
|
|
133
127
|
setIsEditTray(true);
|
|
134
128
|
const {
|
|
@@ -150,18 +144,17 @@ export default function CanvasContentTray(props) {
|
|
|
150
144
|
setIsEditTray(false);
|
|
151
145
|
}
|
|
152
146
|
},
|
|
153
|
-
|
|
154
147
|
hideTray(forceClose) {
|
|
155
148
|
if (forceClose || hidingTrayOnAction) {
|
|
156
149
|
handleDismissTray();
|
|
157
150
|
}
|
|
158
151
|
}
|
|
159
|
-
|
|
160
152
|
};
|
|
161
153
|
bridge.attachController(controller, editor.id);
|
|
162
154
|
return () => {
|
|
163
155
|
bridge.detachController(editor.id);
|
|
164
|
-
};
|
|
156
|
+
};
|
|
157
|
+
// it's OK the setFilterSettings is not a dependency
|
|
165
158
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
166
159
|
}, [editor.id, bridge, handleDismissTray, hidingTrayOnAction]);
|
|
167
160
|
useEffect(() => {
|
|
@@ -170,20 +163,16 @@ export default function CanvasContentTray(props) {
|
|
|
170
163
|
}
|
|
171
164
|
}, [hasOpened]);
|
|
172
165
|
useEffect(() => {
|
|
173
|
-
var _trayRef$current;
|
|
174
|
-
|
|
175
166
|
if (!hasOpened) return;
|
|
176
167
|
let c = document.querySelector('[role="main"]');
|
|
177
168
|
let target_w = 0;
|
|
178
169
|
if (!c) return;
|
|
179
170
|
const margin = window.getComputedStyle(c).direction === 'ltr' ? document.body.getBoundingClientRect().right - c.getBoundingClientRect().right : c.getBoundingClientRect().left;
|
|
180
|
-
target_w = c.offsetWidth -
|
|
181
|
-
|
|
171
|
+
target_w = c.offsetWidth - trayRef.current?.offsetWidth + margin;
|
|
182
172
|
if (target_w >= 320 && target_w < c.offsetWidth) {
|
|
183
173
|
c.style.boxSizing = 'border-box';
|
|
184
174
|
c.style.width = `${target_w}px`;
|
|
185
175
|
}
|
|
186
|
-
|
|
187
176
|
setHidingTrayOnAction(target_w < 320);
|
|
188
177
|
return () => {
|
|
189
178
|
c = document.querySelector('[role="main"]');
|
|
@@ -191,16 +180,13 @@ export default function CanvasContentTray(props) {
|
|
|
191
180
|
c.style.width = '';
|
|
192
181
|
};
|
|
193
182
|
}, [hasOpened]);
|
|
194
|
-
|
|
195
183
|
function handleOpenTray() {
|
|
196
184
|
bridge.focusEditor(editor);
|
|
197
185
|
setHasOpened(true);
|
|
198
186
|
}
|
|
199
|
-
|
|
200
187
|
function handleExitTray() {
|
|
201
188
|
onTrayClosing && onTrayClosing(true); // tell RCEWrapper we're closing
|
|
202
189
|
}
|
|
203
|
-
|
|
204
190
|
function handleCloseTray() {
|
|
205
191
|
// clear the store's saved search string so the tray doesn't
|
|
206
192
|
// reopen with a previous tray instance's search results
|
|
@@ -208,10 +194,10 @@ export default function CanvasContentTray(props) {
|
|
|
208
194
|
setHasOpened(false);
|
|
209
195
|
onTrayClosing && onTrayClosing(false); // tell RCEWrapper we're closed
|
|
210
196
|
}
|
|
211
|
-
|
|
212
197
|
function handleReplaceButton() {
|
|
213
198
|
handleDismissTray();
|
|
214
|
-
const newLink = {
|
|
199
|
+
const newLink = {
|
|
200
|
+
...link,
|
|
215
201
|
forceRename: true,
|
|
216
202
|
text: linkText
|
|
217
203
|
};
|
|
@@ -222,7 +208,6 @@ export default function CanvasContentTray(props) {
|
|
|
222
208
|
srOnly: true
|
|
223
209
|
});
|
|
224
210
|
}
|
|
225
|
-
|
|
226
211
|
function renderFooter() {
|
|
227
212
|
return /*#__PURE__*/React.createElement(Flex.Item, {
|
|
228
213
|
background: "secondary",
|
|
@@ -239,11 +224,10 @@ export default function CanvasContentTray(props) {
|
|
|
239
224
|
"data-testid": "replace-link-button"
|
|
240
225
|
}, formatMessage('Replace')));
|
|
241
226
|
}
|
|
242
|
-
|
|
243
227
|
function handleFilterChange(newFilter, onChangeContext, onChangeSearchString, onChangeSortBy) {
|
|
244
|
-
const newFilterSettings = {
|
|
228
|
+
const newFilterSettings = {
|
|
229
|
+
...newFilter
|
|
245
230
|
};
|
|
246
|
-
|
|
247
231
|
if (newFilterSettings.sortValue) {
|
|
248
232
|
newFilterSettings.sortDir = newFilterSettings.sortValue === 'alphabetical' ? 'asc' : 'desc';
|
|
249
233
|
onChangeSortBy({
|
|
@@ -251,59 +235,48 @@ export default function CanvasContentTray(props) {
|
|
|
251
235
|
dir: newFilterSettings.sortDir
|
|
252
236
|
});
|
|
253
237
|
}
|
|
254
|
-
|
|
255
238
|
if ('searchString' in newFilterSettings && filterSettings.searchString !== newFilterSettings.searchString) {
|
|
256
239
|
onChangeSearchString(newFilterSettings.searchString);
|
|
257
240
|
}
|
|
258
|
-
|
|
259
241
|
setFilterSettings(newFilterSettings);
|
|
260
|
-
|
|
261
242
|
if (newFilterSettings.contentType) {
|
|
262
243
|
let contextType, contextId;
|
|
263
|
-
|
|
264
244
|
switch (newFilterSettings.contentType) {
|
|
265
245
|
case 'user_files':
|
|
266
246
|
contextType = 'user';
|
|
267
247
|
contextId = props.containingContext.userId;
|
|
268
248
|
break;
|
|
269
|
-
|
|
270
249
|
case 'group_files':
|
|
271
250
|
contextType = 'group';
|
|
272
251
|
contextId = props.containingContext.contextId;
|
|
273
252
|
break;
|
|
274
|
-
|
|
275
253
|
case 'course_files':
|
|
276
254
|
contextType = props.contextType;
|
|
277
255
|
contextId = props.containingContext.contextId;
|
|
278
256
|
break;
|
|
279
|
-
|
|
280
257
|
case 'links':
|
|
281
258
|
contextType = props.containingContext.contextType;
|
|
282
259
|
contextId = props.containingContext.contextId;
|
|
283
260
|
}
|
|
284
|
-
|
|
285
261
|
onChangeContext({
|
|
286
262
|
contextType,
|
|
287
263
|
contextId
|
|
288
264
|
});
|
|
289
265
|
}
|
|
290
266
|
}
|
|
291
|
-
|
|
292
267
|
function getHeader() {
|
|
293
268
|
return isEditTray ? formatMessage('Edit Course Link') : formatMessage('Add');
|
|
294
269
|
}
|
|
295
|
-
|
|
296
270
|
function renderLinkDisplay() {
|
|
297
271
|
return isEditTray && /*#__PURE__*/React.createElement(LinkDisplay, {
|
|
298
272
|
linkText: linkText,
|
|
299
|
-
placeholderText:
|
|
300
|
-
linkFileName:
|
|
301
|
-
published:
|
|
273
|
+
placeholderText: link?.title || placeholderText,
|
|
274
|
+
linkFileName: link?.title || '',
|
|
275
|
+
published: link?.published || false,
|
|
302
276
|
handleTextChange: setLinkText,
|
|
303
|
-
linkType: link
|
|
277
|
+
linkType: link?.type
|
|
304
278
|
});
|
|
305
279
|
}
|
|
306
|
-
|
|
307
280
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
308
281
|
"data-mce-component": true,
|
|
309
282
|
"data-testid": "CanvasContentTray",
|
|
@@ -383,13 +356,7 @@ export default function CanvasContentTray(props) {
|
|
|
383
356
|
}
|
|
384
357
|
CanvasContentTray.globalOpenCount = 0;
|
|
385
358
|
|
|
386
|
-
|
|
387
|
-
if (props.source == null && props[propName] == null) {
|
|
388
|
-
throw new Error(`The prop \`${propName}\` is marked as required in \`${componentName}\`, but its value is \`${props[propName]}\`.`);
|
|
389
|
-
}
|
|
390
|
-
} // Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
|
|
391
|
-
|
|
392
|
-
|
|
359
|
+
// Changes made here may need to be reflected in the trayProps type in CanvasContentPanel
|
|
393
360
|
const trayPropsMap = {
|
|
394
361
|
canUploadFiles: bool.isRequired,
|
|
395
362
|
contextId: string.isRequired,
|
|
@@ -402,8 +369,8 @@ const trayPropsMap = {
|
|
|
402
369
|
userId: string.isRequired
|
|
403
370
|
}),
|
|
404
371
|
filesTabDisabled: bool,
|
|
405
|
-
host:
|
|
406
|
-
jwt:
|
|
372
|
+
host: string,
|
|
373
|
+
jwt: string,
|
|
407
374
|
refreshToken: func,
|
|
408
375
|
source: shape({
|
|
409
376
|
fetchImages: func.isRequired
|
|
@@ -421,9 +388,9 @@ CanvasContentTray.propTypes = {
|
|
|
421
388
|
// called with true when the tray starts closing, false once closed
|
|
422
389
|
onEditClick: func,
|
|
423
390
|
...trayPropsMap
|
|
424
|
-
};
|
|
391
|
+
};
|
|
425
392
|
|
|
426
|
-
|
|
393
|
+
// the way we define trayProps, eslint doesn't recognize the following as props
|
|
427
394
|
|
|
428
395
|
CanvasContentTray.defaultProps = {
|
|
429
396
|
canUploadFiles: false,
|
|
@@ -431,5 +398,4 @@ CanvasContentTray.defaultProps = {
|
|
|
431
398
|
refreshToken: null,
|
|
432
399
|
source: null,
|
|
433
400
|
themeUrl: null
|
|
434
|
-
};
|
|
435
|
-
/* eslint-enable react/default-props-match-prop-types */
|
|
401
|
+
};
|
|
@@ -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
|
const checkerboardStyle = squareSize => {
|
|
19
20
|
return {
|
|
20
21
|
backgroundImage: `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" fill-opacity=".15"><rect x="200" width="200" height="200"/><rect y="200" width="200" height="200"/></svg>')`,
|
|
21
22
|
backgroundSize: `${squareSize}px ${squareSize}px`
|
|
22
23
|
};
|
|
23
24
|
};
|
|
24
|
-
|
|
25
25
|
export default checkerboardStyle;
|